Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Procedure wie (Click) aurufen


cromos - Di 26.08.03 00:27
Titel: Procedure wie (Click) aurufen
Hallo,

wie rufe ich eine Prozedur wie zum Beispiel


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.BtnNeu2Click(Sender: TObject);
var LDialog: TForm4;

begin
  LDialog := TForm4.Create(self);
  Try
    lDialog.ShowModal;
  finally
    FreeAndNil(LDialog);
  end;
end;


Manuel auf. Wenn ich z.b. möchte das der Selbe Code ausgeführt wird wenn ich einen anderen Button klicke, und möchte nicht den ganzen Code nochmal in das Click ereignis des 2. Buttons schreiben.

Wie rufe ich dann das Click ereignis des Buttons via Code auf???

Gruss
Cromos


Aya - Di 26.08.03 01:31

Hi,

ganz einfach ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
BtnNeu2Click(nil);
//Solltest du in deiner Procedure den Sender verwenden ginge z.B. auch:
BtnNeu2Click(BtnNeu2);
//oder
BtnNeu2Click(self);


Au'revoir,
Aya~


Tino - Di 26.08.03 10:01

Ich würde erstmal eine Funktion manuel erstellen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Function TForm1.ShowXYZDialog: Boolean;
var 
  LDialog: TForm4; 
begin 
  Result := False;

  LDialog := TForm4.Create (self); 
  Try 
    Result := lDialog.ShowModal = mrOk;
  finally 
    FreeAndNil (LDialog); 
  end
end;

Diese Funktion kannst du dann in jeder anderen Procedure aufrufen:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.BtnNeu2Click(Sender: TObject); 
begin 
  If ShowXYZDialog Then
    ; 
end;

Gruß
Tino


cromos - Di 26.08.03 12:06

Danke.


Taurin - Di 26.08.03 17:11

Wenn du deine Procedure bei verschiedenen (Delphi-)Ereignissen
aufgerufen werden soll, kannst du sie auch dem jeweiligen event handler
zuweisen:


Delphi-Quelltext
1:
2:
3:
4:
5:
Button1.OnClick := BtnNeu2Click;
Button2.OnClick := BtnNeu2Click;
CheckBox1.OnClick := BtnNeu2Click;

//.... und nach belieben jedem anderen TNotifyEvent


[r2d2] - Mi 27.08.03 22:37

Ich finde, dieses Thema sollte ins FAQ. Wollte ich nämlich auch schon immer mal wissen.


Tino - Do 28.08.03 09:20

[r2d2] hat folgendes geschrieben:
Ich finde, dieses Thema sollte ins FAQ. Wollte ich nämlich auch schon immer mal wissen.

Du kannst auch selbst einen FAQ Beitrag erstellen. Einfach in die passende Sparte eintrag.

Gruß
Tino


Taurin - Fr 29.08.03 17:06

Ich versuch mich mal ein einem Beitrag für die FAQ. Bitte um Ergänzungen und das anschließende Verschieben in den richtigen Bereich.

Was tun, wenn man eine Procedure bei verschiedenen Ereignissen aufgerufen haben will ? Jedes Objekt auf der Oberfläche (Buttons, Label, Edits ....) ruft eine Proceduren auf, wenn bestimmte Ereignisse auftreten (anklicken, ändern ...). Das Objekt kann das nur tun, weil es einen Pointer auf diese Proceduren speichert, der von außen gesetzt wird. Würde das Objekt diesen Pointer nicht besitzen, könnte es selbständig gar keine Proceduren aufrufen, die global oder in anderen Klassen definiert sind.

Diese Pointer sind alle vom Typ
type TNotifyEvent = procedure (Sender: TObject) of object;
Das Objekt übergibt immer self an den Parameter Sender. Wenn man also einen Button auf die Form legt und eine OnClick-procedure dazu schreibt, setzt Delphi intern (in der *dfm-Datei) den dazugehörigen Pointer des Buttons auf diese Procedure.

Wenn man nur eine Procedure schreiben will, für (ich nehme wieder den einfachsten Fall an) zwei Buttons, die ähnliches machen sollen, kann man im Objekt-Inspektor im Register Events einfach bei beiden Buttons die gleiche Procedure angeben. Wichtig ist dabei, dass diese Procedure nur einen Paramter von Typ TObject erwartet, und sonst nichts.

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.OnClickAnyButton(Sender :TObject);
var Button :TButton;
  begin
  Button := Sender as TButton;
  ShowMessage(Button.Caption);
  end;


Jeder Button, der im Objekt-Inspektor diese Procedure als OnClick-Methode zugewiesen bekommt, wird beim anklicken seine Caption in einer MessageBox ausgeben.

Man kann diese Zuweisung auch dynamisch im Quellcode ausführen, was besonders intersessatn ist bei dynamisch angelegten Objekten.

Delphi-Quelltext
1:
2:
3:
4:
5:
//zB in OnCreate der Form (OnCreate ist übrigens genauso
// ein NotifyEvent wie OnClick :))
Button1.OnClick := OnClickAnyButton;
Button1.OnClick := OnClickAnyButton;
Edit1.OnChange := OnClickAnyButton;

Aber was passiert da in der dritten Zeile? Delphi wird nicht meckern, da hier alles syntaktisch korrekt ist, aber wenn OnChange aufgerufen wird, wird es einen Laufzeitfehler geben: Die Konvertierung (bzw. der Versuch derselben) des Sender in einen Button wird fehlschlagen. Und ganz abgesehen davon wäre der Name OnClickAnyButton für das OnChange-Event eines Edits sehr unpassend gewählt :)

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.


GSE - Fr 29.08.03 20:23

Wenn der Button und die Procedure schon zur Entwicklungszeit hast, kannst du sie auch direkt im ObjektInspektor verknüpfen (Ereignisse->das gewünschte Ereignis->deine Prozedur auswählen (funktioniert nur wenn die Proc im Public oder private-Teil "angemeldet" ist))

mfg
GSE


Taurin - Fr 29.08.03 21:49

GSE hat folgendes geschrieben:
Wenn der Button und die Procedure schon zur Entwicklungszeit hast, kannst du sie auch direkt im ObjektInspektor verknüpfen (Ereignisse->das gewünschte Ereignis->deine Prozedur auswählen (funktioniert nur wenn die Proc im Public oder private-Teil "angemeldet" ist))

mfg
GSE


Zitat:
Wenn man nur eine Procedure schreiben will, für (ich nehme wieder
den einfachsten Fall an) zwei Buttons, die ähnliches machen sollen,
kann man im Objekt-Inspektor im Register Events einfach bei beiden
Buttons die gleiche Procedure angeben.


Steht doch schon da. Allerdings hast du es in etwas wohlgeformteren
Worten wiederhohlt ;)


GSE - Sa 30.08.03 17:30

Ups, hab ich wohl überlesen.

mfg
GSE