Results 1 to 12 of 12

Thread: Navigeren tussen edits

  1. #1

    Navigeren tussen edits

    Hallo allemaal,

    Na een jaar of 5 wil ik weer eens wat programmeren. Ik programmeerde eerst in delphi 2005 maar die heb ik nu niet meer. Ook mijn oude bestanden heb ik niet meer dus dat wordt opnieuw beginnen.
    Nu heb ik voor Lazarus gekozen om weer eens wat uit te proberen.

    Het maken van berekeningen gaat nu goed maar het navigeren tussen de edits lukt niet erg.

    Met onderstaande code navigeer ik met de entertoets naar edit2

    Code:
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
    begin
      if Key = #13 then
     begin
       Key := #0;
       edit2.SetFocus;
     end;
    Maar hoe krijg ik het voor elkaar dat ik hierna naar edit 3 ga en verder zonder dat ik deze code voor iedere edit hoef te maken?

    Verder lukt me dit ook niet met de pijltjes toetsen.
    Als ik VK_UP of VK_DOWN gebruik krijg ik een error.

    Hoe los ik dit op?
    Geniet maar drink met je maten.

    Geen liters maar vaten!!!

  2. #2
    Quote Originally Posted by Kluns View Post
    Met onderstaande code navigeer ik met de entertoets naar edit2

    ....

    Maar hoe krijg ik het voor elkaar dat ik hierna naar edit 3 ga en verder zonder dat ik deze code voor iedere edit hoef te maken?
    navigeren met alternative toetsen (anders dan de tab) zul je met code moeten programeren. Zorg dat de taborde goed staat en je kun met de tabtoetsen door de edits "navigeren".
    Brouwvisie is helemaal mijn ding
    http://www.bier-brouwer.nl

  3. #3
    Mijn eerste vraag is natuurlijk waarom je Enter zou willen gebruiken voor het navigeren, en niet Tab? Zelfs de meest conservatieve DOS-gebruiker zal toch onderhand wel zijn overgestapt op de tabtoets?

    Maar goed, wil je het toch, dan kan dat met wat geluk eenvoudig met de message CM_DIALOGKEY.
    Ik zeg: met wat geluk, want ik heb hier alleen Delphi, geen Lazarus.

    Delphi Code:
    1. type
    2.   TForm1 = class(TForm)
    3.   private
    4.     procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;

    Delphi Code:
    1. procedure TForm1.CMDialogKey(var Message: TCMDialogKey);
    2. begin
    3.   inherited;
    4.   with Message do
    5.     case CharCode of
    6.       VK_RETURN:
    7.         if GetKeyState(VK_CONTROL) >= 0 then
    8.         begin
    9.           SelectNext(ActiveControl, GetKeyState(VK_SHIFT) >= 0, True);
    10.           Result := 1;
    11.           Exit;
    12.         end;
    13.     end;
    14. end;
    Op deze manier werkt het voor alle controls op je scherm. De Enter-toets wordt gewoon behandeld alsof het een Tab-toets is. In een TMemo heeft een enter natuurlijk een andere betekenis, maar daar kun je met Alt-Enter alsnog uit de memo springen.
    De Tab blijft overigens ook gewoon werken, dus zo kun je als gebruiker kiezen wat je het fijnst vindt.

    De code is overigens overgenomen uit de CMDialogKey method van TForm, alleen met een andere constante in de case.
    1+1=b

  4. #4
    Goleztrol,

    Helaas werkt het niet, ik krijg de volgende error:

    unit1.pas(18,75) Error: Identifier not found "CM_DIALOGKEY"
    unit1.pas(18,75) Error: Illegal expression after message directive
    unit1.pas(19,5) Error: Fields cannot appear after a method or property definition, start a new visibility section first
    unit1.pas(32,1) Fatal: There were 3 errors compiling module, stopping

    Waarom ik met de enter toets wil werken is omdat ik veel met de cijfertoetsen werk en dan vind ik het werken met de entertoets veel praktischer.

    Ik heb overigens nooit met DOS gewerkt.
    Geniet maar drink met je maten.

    Geen liters maar vaten!!!

  5. #5
    Meest simpele oplossing: gebruik dit als KeyPress event voor alle TEdit's.

    delphi Code:
    1. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
    2. begin
    3.   if Key = #13 then
    4.   begin
    5.     Key := #0;
    6.     SelectNext(Sender as TWinControl, True, True);
    7.   end;
    8. end;


    Alternatief 1

    delphi Code:
    1. procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
    2. begin
    3.   //needs Form1.KeyPreview := True!
    4.   if (ActiveControl is TEdit) and (Key = #13) then
    5.   begin
    6.     Key := #0;
    7.     SelectNext(ActiveControl, True, True);
    8.   end;
    9. end;

    Alternatief 2

    delphi Code:
    1. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    2. var
    3.   Back: Boolean;
    4. begin
    5.   //needs Form1.KeyPreview := True!
    6.   if (ActiveControl is TEdit) and (Key = VK_RETURN) then
    7.   begin
    8.     Key := 0;
    9.     Back := (Shift = [ssShift]);
    10.     SelectNext(ActiveControl, not Back, True);
    11.   end;
    12. end;

    Alle 3 de opties werken hier prima met Lazarus 1.1 r38083 FPC 2.6.0 i386-win32-win32/win64

    Bart

  6. #6
    Het is me gelukt met de volgende code:

    Code:
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
      );
    
      begin
       if Key = VK_UP then SelectNext(ActiveControl,false,true);
       if Key = VK_DOWN then SelectNext(ActiveControl,true,true);
       if Key = VK_RETURN then SelectNext(ActiveControl,true,true);
    end;
    De key preview van het formulier dient op true te staan.
    In de uses dien je het woord Windows toe te voegen.
    Op deze manier kan je ook met de pijltjes toetsen werken.

    Toevallig kwam ik deze code tegen.

    Bedankt voor jullie moeite.
    Geniet maar drink met je maten.

    Geen liters maar vaten!!!

  7. #7
    Dat was wat ik eerst probeerde, maar dat leverde bij mij een beepje op als ik met Enter wilde navigeren.
    1+1=b

  8. #8
    Quote Originally Posted by GolezTrol View Post
    Dat was wat ik eerst probeerde, maar dat leverde bij mij een beepje op als ik met Enter wilde navigeren.
    Wellicht Key := 0; (of #0 vergeten?

    Bart

  9. #9
    Had Key := 0 toegevoegd (keydown event), maar hielp niet. Ik had zelfs ook Key := 0 in het keyup event gezet voor het geval dat de boosdoener was. Ik vond de oplossing met CM_DIALOGKEY uiteindelijk een stuk eleganter, maar blijkbaar werkt dat niet zo in Lazarus.
    1+1=b

  10. #10
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Denk eraan, voor crossplatform geemuleerde Windows messages moet je Lmessages importeren.

    Helaas is de relevante message ongeimplementeerd:

    Code:
    lmessages.pp:  CM_DIALOGKEY            = CM_BASE + 5 unimplemented;

  11. #11
    Bij mij werkt deze code zonder piep.
    Ik draai met windows 7 op mijn laptop.

    Marcov,

    Ik ben nog een beginneling met Lazarus, maar wat bedoel je precies met jou uitleg?
    Geniet maar drink met je maten.

    Geen liters maar vaten!!!

  12. #12
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    De oplossing in de eerste post van Goleztrol (met message) is alleen mogelijk indien lazarus de relevante windows message emuleert. Immers, code met lazarus moet ook op niet windows werken.

    De "unimplemented" in de gereproduceerde regel code lijkt te impliceren dat lazarus deze specifieke message niet implementeerd.

    Verder moet je indien Lazarus de relevante message emuleert "lmessages" gebruiken, niet messages.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •