Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Unter einer Procedure eine andere Procedur aufrufen (https://www.delphipraxis.net/172381-unter-einer-procedure-eine-andere-procedur-aufrufen.html)

EMS 30. Dez 2012 15:13

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?

DeddyH 30. Dez 2012 15:16

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.

Popov 30. Dez 2012 15:19

AW: Unter einer Procedure eine andere Procedur aufrufen
 
Da gibt es zwei Möglichkeiten.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
...
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Button2Click(nil);
end;
oder

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
...
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Button2Click(Sender);
end;
Sender ist das Objekt von der die Prozedur aufgerufen hat. Bei Button3Click wahrscheinlich Button3. Das kann man ganz sicher erkennen mit

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
  if Sender = Button3 then ShowMessage('Button3 wurde geklickt');
Somit ist die zweite Methode allgemein nicht falsch. Wenn es aber keine Rolle spielt, dann einfach nil als Parameter mitschicken.

terence14 30. Dez 2012 15:30

AW: Unter einer Procedure eine andere Procedur aufrufen
 
Ich verwende folgende Möglichkeiten:

Delphi-Quellcode:

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;
MfG,
terence

delnu 30. Dez 2012 20:19

AW: Unter einer Procedure eine andere Procedur aufrufen
 
Zitat:

procedure TForm1.Button2Click(Sender: TObject);
begin
...
...
procedure TForm1.Button3Click(Sender: TObject);
...
...
...
end;
Was daran falsch ist ? Nun, vor der zweiten Prozedur fehlt das "end" der ersten, und zu Beginn der zweiten das "begin" !

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;

Luckie 31. Dez 2012 01:56

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.

Popov 31. Dez 2012 09:37

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;

delnu 31. Dez 2012 19:48

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.

Hansa 31. Dez 2012 20:43

AW: Unter einer Procedure eine andere Procedur aufrufen
 
Zitat:

Zitat von delnu (Beitrag 1197261)
Dann läßt sich auch gut mit dem bei manchen verpönten "with" arbeiten.

"With" grundsätzlich nicht zu benutzen, das ist ja auch völlig überzogen. Man schaue sich das mal an :

Delphi-Quellcode:
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;
Und dann das :

Delphi-Quellcode:
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;
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:

Medium 1. Jan 2013 06:09

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.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz