Results 1 to 8 of 8

Thread: In runtime KeyEvent aanmaken

  1. #1

    In runtime KeyEvent aanmaken

    Sinds een aantal maanden ben ik van Delphi7 overgestapt naar Lazarus.
    Nu vul in runtime een form met DBedit controls. Zo ver zo goed.
    Dit is de code:
    with TDBEdit.Create(aParent) do
    begin
    Name := 'edt' + aSQL.FieldByName('VPOSNR').AsString;
    DataSource := hDTO;
    DataField := aSQL.FieldByName('VLDNAA').AsString;
    OnExit := @CheckValidat;
    OnEnter := @CheckZoeksch
    Parent := aBox;
    Top := aTop;
    Width := 190;
    Left := 095;
    end;

    Zo ver werkt het prima.
    - OnExit en OnEnter zijn TNotifyEvents en roepen een procedure aan zonder parameters.

    Dit werkt niet:
    - OnKeyUp/OnKeyDown zijn TKeyEvents en hebben parameters. Ik weet geen manier om een procedure aan te roepen op deze events.

    Heeft iemand een idee?

  2. #2
    Hallo,

    Toevoegen :
    Code:
    ...
    OnKeyUP := @EigenOnKeyUp;
    OnKeyDown := @EigenOnKeyUp;
    ...
    
    procedure TForm1.EigenOnKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
       ...
    end;
    
    procedure TForm1.EigenOnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState
      );
    begin
        ...
    end;
    Groet, Frans

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Onder Delphi hebben TNotifyEvents wél een parameter, nl. Sender: TObject; het lijkt me sterk dat Lazarus/FPC daar op afwijkt.
    TMemoryLeak.Create(Nil);

  4. #4
    Hoi Frans,

    Thnx voor je snelle antwoord. Jou oplossing lijkt niet te werken.
    Op een Lazarfus forum las ik dat je oplossing een 'plain procedure' is en dat er een 'procedure of object' verwacht wordt.
    Het doorgeven van de extra parameter 'Key' gaat hiermee niet lukken.

    Voor mij misschien een brug te ver, maar er werd een oplossing aangedragen:

    +++ begin quote +++
    Create an object as receiver of the event
    TFooClass = class
    FDlg: Tobject
    procedure KeyPress(Sender: Tobject; var Key: Word; Shift: TShiftstate);
    property DLg: TObject read FDlg write FDlg;
    end

    foo := TFooClass.Create;
    foo.Dlg := Dlg;

    xxx.OnKeyDown:= @foo.KeyPress;
    +++ einde quote+++

    Ook dit krijg ik (nog) niet aan de praat.
    - Is deze manier volgens jou/jullie de moeite waard om te onderzoeken?
    - Ik snap niet zo goed wat het verschil is tussen de procedure van dit afgeleide object en de 'plain procedure'.

  5. #5
    Wat werkt er met de oplossing van Frans niet?
    Krijg je een foutmelding?
    "lijkt niet te werken" is niet echt een probleemomschrijving.

    Kun je anders eens een voorbeeld-unit neerzetten waarmee je aan het werken bent.

    Dit werkt bijvoorbeeld prima:

    Code:
      TForm1 = class(TForm)
        Button1: TButton;
        DataSource1: TDataSource;
        DBEdit1: TDBEdit;
        SQLQuery1: TSQLQuery;
        procedure Button1Click(Sender: TObject);
        procedure CheckZoeksch(Sender: TObject);
        procedure CheckValidat(Sender: TObject);
        procedure EigenOnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
        procedure EigenOnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
      private
        { private declarations }
      public
        { public declarations }
      end;
    
    //...
    
      with TDBEdit.Create(aParent) do
      begin
        Name := 'edt' + aSQL.FieldByName('VPOSNR').AsString;
        DataSource := hDTO;
        DataField := aSQL.FieldByName('VLDNAA').AsString;
        OnExit := @CheckValidat;
        OnEnter := @CheckZoeksch;
        OnKeyUP := @EigenOnKeyUp;
        OnKeyDown := @EigenOnKeyDown;
        Parent := aBox;
        Top := aTop;
        Width := 190;
        Left := 095;
      end;
    
    // ....
    
    procedure TForm1.CheckValidat(Sender: TObject);
    begin
      //
    end;
    
    procedure TForm1.CheckZoeksch(Sender: TObject);
    begin
      //
    end;
    
    procedure TForm1.EigenOnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      //
    end;
    
    procedure TForm1.EigenOnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      //
    end;
    Maar je moet dus wel die procedures EigenOnKeyUp en EigenOnKeyDown in je eigen form (of een dummy Class zoals je is geadviseerd) definiëren.

    Maar dat moest bij die CheckZoeksch, CheckValidat ook. Hoe heb je die nu gedefinieerd ???

    Tevens heb jij achter "OnEnter := @CheckZoeksch" geen ; staan.
    Dit is dus niet echt werkende code.
    Het is niet handig om code over te typen bij het plaatsen op een forum want een typefout is snel gemaakt en zou nét het probleem dat je hebt kunnen verbergen.

    Een "plain procedure" is een procedure die je dus gewoon zelf maakt en nergens in zet:
    Code:
    procedure mijnprocedure;
    begin
    end;
    Wat echter voor dit soort dingen nodig is is een procedure die in een class staat:
    Code:
    type
      TForm1 = class(TForm)
        procedure CheckZoeksch(Sender: TObject);
        procedure CheckValidat(Sender: TObject);
        procedure EigenOnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
        procedure EigenOnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    
    // ....
    
    procedure TForm1.CheckZoeksch(Sender: TObject);
    begin
    end;
    Volgens mij heb je die CheckZoeksch en CheckValidat ook niet als "plain procedures" gedefinieerd anders zou Lazarus klagen over:
    Code:
    unit1.pas(63,15) Error: Incompatible types: got "<address of procedure(TObject);Register>" expected "<procedure variable type of procedure(TObject) of object;Register>"
    Dus als je het met die EigenOnKeyDown en EigenOnKeyUp op dezelfde manier doet moet het goed gaan.

    Quote Originally Posted by eugene View Post
    - OnExit en OnEnter zijn TNotifyEvents en roepen een procedure aan zonder parameters.
    Dat is niet helemaal waar? Jij roept de procedure namelijk nergens zelf aan. Je kent (met die @) alleen maar de functie-ingang toe aan OnExit en OnEnter. Deze worden echter in de programmatuur echt wel met een parameter (n.l. Sender) aangeroepen.

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Plain procedure:
    Delphi Code:
    1. Procedure DoIets(Param : Integer);
    2. Begin
    3.   // code hier
    4. End;

    Method ("Procedure of object"):
    Delphi Code:
    1. Procedure MyClass.DoeIets(Param : Integer);
    2. Begin
    3.   // Code hier
    4. End;

    Een procedure of object maakt onderdeel uit van een klasse (object), een regular procedure staat geheel op zichzelf.

    Misschien is een basiscursus Pascal/Delphi handig?

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  7. #7
    Briljant! Het werkt gewoon.
    Beter ff opnieuw beginnen dus ipv knutselen in bestaande form.
    Click image for larger version. 

Name:	Resultaat.jpg 
Views:	146 
Size:	31.3 KB 
ID:	6931
    @rik: enorm bedankt, ik zat al zo lang te prullen en raakte steeds verder van huis.
    @peter: Een goede basiscursus zou idd geen kwaad kunnen. Bedankt voor je uitleg.

  8. #8
    untnldelphi.pas
    By the way, dit is het progje

Thread Information

Users Browsing this Thread

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

Tags for this Thread

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
  •