Autor Beitrag
cromos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219


Delphi 7
BeitragVerfasst: Di 26.08.03 00:27 
Hallo,

wie rufe ich eine Prozedur wie zum Beispiel

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Di 26.08.03 01:31 
Hi,

ganz einfach ;)

ausblenden 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~

_________________
Aya
I aim for my endless dreams and I know they will come true!
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 26.08.03 10:01 
Ich würde erstmal eine Funktion manuel erstellen:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.BtnNeu2Click(Sender: TObject); 
begin 
  If ShowXYZDialog Then
    ; 
end;

Gruß
Tino
cromos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219


Delphi 7
BeitragVerfasst: Di 26.08.03 12:06 
Danke.
Taurin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP
D6 Personal
BeitragVerfasst: 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:

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

//.... und nach belieben jedem anderen TNotifyEvent
[r2d2]
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

WinXP
D5 Enterprise
BeitragVerfasst: Mi 27.08.03 22:37 
Ich finde, dieses Thema sollte ins FAQ. Wollte ich nämlich auch schon immer mal wissen.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP
D6 Personal
BeitragVerfasst: 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:
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: 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

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
Taurin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP
D6 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: Sa 30.08.03 17:30 
Ups, hab ich wohl überlesen.

mfg
GSE

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)