Avatar billede asppro Nybegynder
17. maj 2002 - 10:24 Der 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
Avatar billede zerohero Nybegynder
17. maj 2002 - 10:34 #1
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?
Avatar billede asppro Nybegynder
17. maj 2002 - 10:39 #2
Hvis man IKKE kan trække komonenten ned og dermed ikke få objektinspektor frem.
Hvis man selv creater i ens kode.

ex. variabel := type.create(nil);
Avatar billede hermandsen Juniormester
17. maj 2002 - 11:23 #3
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;

Håber det hjalp!

//hermandsen
Avatar billede zerohero Nybegynder
17. maj 2002 - 11:33 #4
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...

Håber det kunne hjælpe dig lidt på vej...

ZeroHero
Avatar billede asppro Nybegynder
17. maj 2002 - 12:43 #5
Hvad hvis man skal implementere et event som onConnect...

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin

end;

når man bruger TclientSocket uden at trække komponenten ned på formen.
Avatar billede asppro Nybegynder
17. maj 2002 - 12:45 #6
Hvis man selv har skabt sin connection således:

var
  a:TClientSocket;
implement
  a:= TClientSocket.create(nil);
Avatar billede zerohero Nybegynder
17. maj 2002 - 12:56 #7
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);

ZeroHero
Avatar billede hermandsen Juniormester
17. maj 2002 - 12:57 #8
Så skal du lave din egen procedure:

procedure TForm1.MinConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ShowMessage('Davs');
end;

Under FormCreate kan du så lave din opsætning:

private
  a:TClientSocket;

procedure TForm1.FormCreate(Sender: TObject);
begin
  a:= TClientSocket.create(nil);
  a.OnConnect := MinConnect;
end;

Er det det du vil?
Avatar billede hermandsen Juniormester
17. maj 2002 - 12:59 #9
Upser... Zerohero har ret... Glemt jeg lige! ;)

procedure TForm1.FormCreate(Sender: TObject);
begin
  a:= TClientSocket.Create(Self);
  a.OnConnect := MinConnect;
end;

Brug det i stedet! ;)
Avatar billede hermandsen Juniormester
17. maj 2002 - 12:59 #10
Glemt = Glemte ;)
Avatar billede tormork Nybegynder
17. maj 2002 - 17:00 #11
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?
Avatar billede tormork Nybegynder
17. maj 2002 - 17:08 #12
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).
Avatar billede zerohero Nybegynder
17. maj 2002 - 17:26 #13
Selvfølig kan du sætte en event på komponent uden en owner, men du vil bare ikke få ret meget ud af det!!!
Avatar billede tormork Nybegynder
18. maj 2002 - 00:02 #14
Denne kode vil give en onClick event både til button1 og x (som ikke har en owner)

var x: tbutton;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(TButton(Sender).Name);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  x := TButton.Create(nil);
  x.parent := self;
  x.SetBounds(0,0,100,30);
  x.Name := 'Hello this is button1';
  x.OnClick := Button1Click;
end;
Avatar billede jhald Nybegynder
16. september 2002 - 18:41 #15
Jeg sidder med noget lign.

jeg har:

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'
Avatar billede hermandsen Juniormester
20. september 2002 - 21:12 #16
>>asppro
Var det ikke på tide at lukke?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester