17. maj 2002 - 10:24Der er
15 kommentarer og 1 løsning
Hvordan kan man implementere en event i Delphi hvis man ikke.....
Jeg er ved at lave et program der benytter en komponent. Komponenten har, hvis man trækker den ned på formen, events man kan kalde igennem taskmanageren
Hvad mener du med at implementere en event? Hvis du dobbelt-klikker på en af dine events i din "object inspector" så kan du selvfølig få lov til at anvende dem - men det er nok ikke det du mener?
Jeg lavede en gang en Highscore-form til et spil hvor jeg skulle bruge 8 knapper... Der gjorde jeg sådan:
var Buttons: array [2..9] of TButton; I: Integer; begin for I := 2 to 9 do begin Buttons[I] := TButton.Create(pnlKnapper); {pnlKnapper er et panel. Det gjorde knapperne lettere at holde styr på! :)} Buttons[I].Parent := pnlKnapper; Buttons[I].Top := 0; Buttons[I].Left := (I-2)*20; Buttons[I].Width := 20; Buttons[I].Height := pnlKnapper.Height; Buttons[I].Caption := IntToStr(I); Buttons[I].Tag := I; Buttons[I].OnClick := ButtonClick; {Her sætter jeg OnClick-proceduren til at være en procedure jeg har lavet der hedder ButtonClick.} end; end;
Min ButtonClick var så lavet således:
private procedure ButtonClick(Sender: TObject);
procedure THighscoresForm.ButtonClick(Sender: TObject); begin GetScores((Sender as TButton).Tag); end;
Eksempelvis kan man når man laver en form sætte en onpaint event til en procedure(run-time):
var myform : Tform; procedure Tform1.formcreate(sender : Tobject); begin myform := Tform.create(self); //tilføjer en procedure til en event myform.onpaint := formpaint; end;
procedure Tform1.formpaint(sender : Tobject); begin //denne procedure er nu både tilegnet Form1 og myform!!!! end;
På samme måde gør du ved alle events. Husk der er dog nogle events der kræver nogle ekstra parametere opfyldt...
Når du bruger nil som pointer betyder at den ikke skal pege på nogen adresse, det vil dermed sige at du ikke kan sætte events til den. Derfor bliver du nødt til at bruge noget andet en nil eksempelvis self, parent, form1 eller lign. Så i stedet vil der stå:
var a:TClientSocket; implement a:= TClientSocket.create(self);
Siger i at man ikke kan sætte events på et TComponent hvis den ikke har en Owner? Det passer ikke. Er det måske noget der er specielt for TClientSocket?
En fin måde at finde ud af vilke værdier er "viktige" er at smide componenten på en form stille de værdier man ønsker og siden se på formen som tekst (Hæjreklik på formen og vælg Show As Text).
private procedure onRBClick(sender : TObject; var rb : TRadioButton);
procedure TForm1.onRBClick(sender : TObject; var rb : TRadioButton); begin //showmessage(rb.caption); end;
mit problem, som nok minder om asppro's (måske) er at det ikek virker.
hvis jeg def. proceduren som onRBClick(sender : TObject) så virker det fint, og jeg kan kalde den uden parametre. Men når jeg vil ha' et objekt med, min radiobutton. Så vil den ingenting. [Error] form.pas(74): Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.