Selon zeljko <[email protected]>:

> On Thursday 16 September 2010 02:30, [email protected] wrote:
> > hello
> >
> > I have made a  program with Lazarus. This application make some work
> > according to key pressed from the numpad and function key. It work fine on
> > win32 but i have a big problem with linux-gtk2
> >
> > the action on a key is handled by the OnKeyDown event but on linux, the
> > input in a modal windows is returned in onkeydown from parent and fire the
> > event when return to parent windows.
> > I have tried to disable onKeyDown before showing the modal windows with
> > OnKeyDown := nil
> >
> > and enabling after closing modal windows but the input from modal windows
> > is handled by onkeydown
> >
> > I have try to clear event like when the programm was buid with delphi using
> >
> > While PeekMessage(Msg, 0, LM_KEYFIRST, LM_KEYLAST,1) do
> >
> > but this not work
> >
> > is there a way to clear the keyboard input after the input key is process
> >
> > my development to port this application to linux  is blocked by this
> > problem and i have found no solution
> >
> > many thanks for answer and sorry for my bad english
>
> It's hard to say what to do without code.
> Best would be to attach example here (this is issue opened by you I guess):
> http://bugs.freepascal.org/view.php?id=17387
>
> zeljko
>
> --
> _______________________________________________
> Lazarus mailing list
> [email protected]
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>


thank for your answer

here is my onkeydown handler

Procedure TFmain.FormKeyDown(Sender: TObject; Var Key: Word; Shift:
TShiftState);
Var
  numTouche: integer;
Begin
  if sender = Fmain then
  begin
       If Not act Then
          exit;
       numTouche := 0;
       Case key Of
            VK_1..VK_9:
            Begin
                  numTouche := key - 35;
                  cmd(key,numTouche);
                  exit;
            End;
            219:
            begin
                 cmd(Key,23);
                 exit;
            end;

            187:
            begin
                 cmd(key,24);
                 exit;
            end;
            VK_F1..VK_F12:
            Begin
                 numTouche := key - 111;
                 cmd(key, numTouche);
                 exit;
            End;
            VK_NUMPAD0..VK_NUMPAD9, VK_RETURN, VK_DIVIDE, VK_MULTIPLY, VK_ADD,
VK_SUBTRACT, VK_DECIMAL,
            VK_ESCAPE, VK_OEM_PERIOD:
            begin
                 cmd(key,0);
                 exit;
            End;
       end;
 end
End;

the cmd() function process the key and button on screen (for touchscreen and
mouse) with button on screen no problem but from keyboard the FormKeydown is
process many time after this code

here is a fragment of the function cmd() code

K_F1..VK_F12:
                      Begin
                        // remise a zero panel des erreurs
                        If Ferror = true Then
                          st.Caption := '';

                        // pas de ticket en cours : erreur
                        If Not Fticket Then
                        Begin
                             erreur(ERR_NOTICKET);
                             exit;
                        End;

                        if  FmultiPaiement then
                        begin
                            erreur (ERR_MULTI);
                            exit;
                        end;
                        //le prix n'a pas été saisi
                        If Not Fprix Then
                        Begin
                             erreur(ERR_NOPRIX);
                             exit;
                        End;


                        // touche non programmé
                        If (BtnArray[numTouche].Enabled = false) Then
                        Begin
                                erreur(ERR_NOPROGRAMME);
                                exit;
                        End;
                        LcdLabel.Caption := BtnArray[numTouche].hint;
                        prix := trim(LcdNombre.Caption);
                        dep := LcdLabel.Caption;
                        insere_grille(dep, prix);
                        TotalEnCours(prix, true);
                        // imprime la ligne si une imprimante est active
                        If FescposImprime Then
                        Begin
                             escpos.Add(ticket_formate(dep,prix, InfoEscPos.
                             escpos.PrintLn;
                        End;
                        liste_ajout(dep, prix);
                        Fdepartement := false;
                        Fprix := false;
                        Fsoustotal := false;
                        if extra then
                        begin
                           onKeydown := nil;
                           fextra.showmodal;
                           onkeydown := @FormKeyDown;
                        end;
                        EmptyKeyQueue;
                        exit;
                      End;


returning from fextra.showmodal, refire Onkeydown if close the modal form with
the result of the fextra input

fextra is only a form with a Tedit. I have try with an input function but same
result

emptykeyqueue is code like in my fist post that clear key message


thanks

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to