![]() |
Delphi-Version: 5
Unter einer Procedure eine andere Procedur aufrufen
Hallo
Wie oben schon geschrieben. Ich habe nun eine Prozedure fertig die funktioniert. Diese möchte ich nun zusätzlich in einer anderen aufrufen. wie muss ich das programmieren? procedure TForm1.Button2Click(Sender: TObject); begin ... ... procedure TForm1.Button3Click(Sender: TObject); ... ... ... end; funktioniert nicht? Was mach ich hier falsch? |
AW: Unter einer Procedure eine andere Procedur aufrufen
Die Methode heißt Button3Click und hat einen TObject-Parameter, und so muss sie auch aufgerufen werden.
|
AW: Unter einer Procedure eine andere Procedur aufrufen
Da gibt es zwei Möglichkeiten.
Delphi-Quellcode:
oder
procedure TForm1.Button2Click(Sender: TObject);
begin ... end; procedure TForm1.Button3Click(Sender: TObject); begin Button2Click(nil); end;
Delphi-Quellcode:
Sender ist das Objekt von der die Prozedur aufgerufen hat. Bei Button3Click wahrscheinlich Button3. Das kann man ganz sicher erkennen mit
procedure TForm1.Button2Click(Sender: TObject);
begin ... end; procedure TForm1.Button3Click(Sender: TObject); begin Button2Click(Sender); end;
Delphi-Quellcode:
Somit ist die zweite Methode allgemein nicht falsch. Wenn es aber keine Rolle spielt, dann einfach nil als Parameter mitschicken.
procedure TForm1.Button3Click(Sender: TObject);
begin if Sender = Button3 then ShowMessage('Button3 wurde geklickt'); |
AW: Unter einer Procedure eine andere Procedur aufrufen
Ich verwende folgende Möglichkeiten:
Delphi-Quellcode:
MfG,procedure TForm1._procedure1(Sender: TObject); begin // mach was end; procedure TForm1._procedure2; begin //mach was end; procedure _procedure3; begin //mach was end; procedure TForm1.bButton1Click(Sender: TObject); begin _procedure1(Sender); _procedure2; _procedure3; end; terence |
AW: Unter einer Procedure eine andere Procedur aufrufen
Zitat:
Um lokale Funktionen/Prozeduren innnerhalb einer anderen unterzubringen, kann dies z.B. so aussehen :
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
procedure local_proc; begin end; fuction local_func: boolean; begin local_func:=true; end; begin { Hier beginnt Button2Click } if local_func then local_proc; // Wenn das Ergebnis von "local_func" true ist, "local_proc" aufrufen end; |
AW: Unter einer Procedure eine andere Procedur aufrufen
Da jetzt die Lösung klar ist, noch etwas zum Programmierstil. Ich halte das für schlechten Programmierstil. Zum einem wird da etwas in die GUI gewurschtelt, was da nicht hingehört und zum anderen leidet dabei die Übersichtlichkeit. Besser wäre es die Routine auszulagern in eine separate Routine und diese dann von beiden Ereignissen aufzurufen.
|
AW: Unter einer Procedure eine andere Procedur aufrufen
Ob schlechter Programmierstil, das ist eine Sache für sich, aber es wird irgendwann unpraktisch. Denn nicht selten überlegt man es sich anders und was mal in Prozedur für Button1 lag, ist plötzlich etwas fehl am Platz, wenn man es sich anders überlegt und den Button entfernt, weil man z. B. den Aufruf jetzt über Menü durchführt. Und plötzlich steht da Button1Click und es gibt keinen Button.
Delphi-Quellcode:
private
{ Private-Deklarationen } public { Public-Deklarationen } procedure ButtonClick(Sender: TObject); end; ... procedure TForm1.ButtonClick(Sender: TObject); begin if Sender = Button1 then ShowMessage('Hallo Welt!'); if Sender = Button2 then ShowMessage('Hallo Galaxis!'); end; procedure TForm1.Button1Click(Sender: TObject); begin ButtonClick(Sender); end; procedure TForm1.Button2Click(Sender: TObject); begin ButtonClick(Sender); end; |
AW: Unter einer Procedure eine andere Procedur aufrufen
Das interessante Beispiel gerade läßt sich noch vereinfachen, indem "ButtonClick" gleich direkt jedem Button zugewiesen wird. Sowas in der Art habe ich mal mit dem "tag"-Attribut anstelle der "Sender"-Abfrage gemacht - und prompt wurde mir "schlechter Programmierstil" vorgeworfen. Statt "if ... then" läßt sich meist auch das übersichtlichere und einfachere "case" benutzen.
Jeder wird im Umlaufe der Jahre seine Lieblingsmethoden entwickeln. In jedem Fall dürfte es sinnvoll sein, immer wieder benutzte Methoden in eine Unit oder notfalls sogar als Include-Datei auszulagern. Sehr schön finde ich auch immer, wenn man Prozeduren nicht spezifisch ans jeweilige Programm bindet, so daß bei der Deklaration z.B. das vorangestellte "TForm1" oder was auch immer entfallen kann. Statt z.B. ein im Formular vorhandenes StringGrid direkt anzusprechen, kann man es als Parameter übergeben und hat dadurch gleich was Universelles, das sich auslagern läßt. Dann läßt sich auch gut mit dem bei manchen verpönten "with" arbeiten. |
AW: Unter einer Procedure eine andere Procedur aufrufen
Zitat:
Delphi-Quellcode:
Und dann das :
procedure TAusg.FormShow(Sender: TObject);
begin with DataModule1.Dataset1 do begin Close; SelectSQL.Clear; SelectSQL.Add ('SELECT A.NR,A.BEZ, SP.* FROM ART8 A,') SelectSQL.Add ('A1,') SelectSQL.Add ('A2,') ... SelectSQL.Add ('SONDER8 SP '); SelectSQL.Add ('WHERE (A.ID = SP.ID_ART) AND...'); SelectSQL.Add ('AND A.NR >= :VonArtNr'); SelectSQL.Add ('AND A.NR <= :BisArtNr'); SelectSQL.Add ('ORDER BY A.NR'); ParamByName... ParamByName... ParamByName... Open; end; inherited; // erst hier, sonst DS noch nicht besetzt end;
Delphi-Quellcode:
Wer da das with ignoriert und alles ausschreibt, der ist selber Schuld. So etwas hilft höchstens den Monitorherstellern. Für unnötigerweise lange Zeilen hilft ja schon ein 32" Monitor, um alles direkt zu sehen. Beim Drucken gehts dann eben wieder von vorne los. :mrgreen:
procedure TAusg.FormShow(Sender: TObject);
begin DataModule1.Dataset1.Close; DataModule1.Dataset1.SelectSQL.Clear; DataModule1.Dataset1.SelectSQL.Add ('SELECT A.NR,A.BEZ, SP.* FROM ART8 A,') DataModule1.Dataset1.SelectSQL.Add ('A1,') DataModule1.Dataset1.SelectSQL.Add ('A2,') ... DataModule1.Dataset1.SelectSQL.Add ('SHOPKUSONDER8 SP '); DataModule1.Dataset1.SelectSQL.Add ('WHERE (A.ID = SP.ID_ART) AND...'); DataModule1.Dataset1.SelectSQL.Add ('AND A.NR >= :VonArtNr'); DataModule1.Dataset1.SelectSQL.Add ('AND A.NR <= :BisArtNr'); DataModule1.Dataset1.SelectSQL.Add ('ORDER BY A.NR'); DataModule1.Dataset1.ParamByName... DataModule1.Dataset1.ParamByName... DataModule1.Dataset1.ParamByName... DataModule1.Dataset1.Open; inherited; // erst hier, sonst DS noch nicht besetzt end; |
AW: Unter einer Procedure eine andere Procedur aufrufen
Das hängt mit einer Sache zusammen, die ich in #Develop lieben gelernt habe (mag in anderen IDEs auch gegeben sein, in Delphi nicht): Wenn ich in einer neuen Zeile etwas schreibe, wird mir gleich alles im Scope als Autovervollständigung geboten, noch vor dem ersten Punkt-Operator, und zwar in der Reihenfolge der zuletzt häufigsten Benutzung. Damit ist das Schreiben von z.B. "DataModule1" nach dem ersten Mal eine Sache von (wie eingetippt) "D." und fertig. Selbiges zieht sich auch nach dem "." durch, so dass ein with am Ende fast noch umständlicher zu schreiben wäre. Letztlich also alles eine Frage der IDE Unterstützung. (Und ich würde in Delphi gerne öfter weniger dazu verleitet sein es zu nutzen.)
|
AW: Unter einer Procedure eine andere Procedur aufrufen
Zitat:
Delphi-Quellcode:
Ist auch nicht wirklich länger, lässt sich debuggen, und die Code-Vervollständigung tut auch. Prinzipiell geht mir das ja auch hinten vorbei, ob jemand meint, with nutzen zu müssen, die Übersicht leidet aber meistens enorm, von den anderen Nachteilen ganz abgesehen.
var
DS: TDataset; begin DS := DataModule1.Dataset1; DS.Close; DS.SelectSQL.Clear; //etc. blabla end; |
AW: Unter einer Procedure eine andere Procedur aufrufen
Zitat:
Delphi-Quellcode:
procedure TAusg.FormShow(Sender: TObject);
begin with DataModule1.Dataset1, SelectSQL do begin Close; Clear; Add ('SELECT A.NR,A.BEZ, SP.* FROM ART8 A,') Add ('A1,') Add ('A2,') ... |
AW: Unter einer Procedure eine andere Procedur aufrufen
Vielleicht sollten wir zum Thema With/Witz einen eigenen OT - Thread aufmachen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz