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); BtnNeu2Click(BtnNeu2); 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;
|
[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:
| 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
Tino: Ü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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!