Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Verknüpfung von 2 Procedures (https://www.delphipraxis.net/204140-verknuepfung-von-2-procedures.html)

Royal Ranger 28. Apr 2020 10:49

Verknüpfung von 2 Procedures
 
Hallo,
ich habe zwei Procedures miteinander verknüpft aber meine IDE zeigt da einen Fehler...Könnte mir jemand helfen?
LG und danke im Voraus
Delphi-Quellcode:
procedure TForm2.OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if
  key=VK_Space
 then
  OnTimer;
end;

procedure TForm2.OnTimer(Sender: TObject);
begin
  inc(y);
  ShpBall.Top:= y;
end;

TiGü 28. Apr 2020 10:50

AW: Verknüpfung von 2 Procedures
 
Die Glaskugel sagt:

Delphi-Quellcode:
procedure TForm2.OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if
  key=VK_Space
 then
  OnTimer(nil);
end;
:glaskugel:

Sherlock 28. Apr 2020 11:02

AW: Verknüpfung von 2 Procedures
 
  1. Du rufst eine Prozedur aus einer anderen heraus auf. Das ist Alltag. Lerne die Nomenklatur. Da wurde nix verknüpft.
  2. Delphi ist eine der Sprachen die mit halbwegs passablen Englischkenntnissen sehr gut lesbar ist... wenn man nicht die eigentlich einzeiligen Sätze zu mehreren irrationalen Absätzen verhackstückt.
  3. Ohne konkrete Fehlermeldung wirst Du nur garstige Posts wie diesen zur Antwort bekommen.

Sherlock

stahli 28. Apr 2020 11:49

AW: Verknüpfung von 2 Procedures
 
Jeder hat doch mal angefangen.

Der Aufruf einer Prozedur verlangt u.U. die Übergabe von Werten als Parameter.
Was diese dann bewirken muss man (z.B. in der Hilfe) nachlesen oder ggf. im Quelltext nachsehen.

Bei den Ereignisbehandlungen wird der Parameter "Sender" standardmäßig nicht verwendet. Es ist also egal, was dort übergeben wird. Nil ist also völlig ok.

Man kann z.B. in der Methode unterscheiden, ob "Sender = Button1" oder "Sender = Button2" ist, und danach unterschiedliche Ereignisbehandlungen durchführen.
Wenn man so etwas nicht durchführt, ist egal, was in Sender steht.

himitsu 28. Apr 2020 12:12

AW: Verknüpfung von 2 Procedures
 
verschiedene Varianten, um Button1Click auszuführen
Delphi-Quellcode:
{ die Kurzfassung für TButton.Click, als Beispiel was es macht.
  Viele Events haben so eine Methode, wo sie ausgeführt werden.
  z.B. für OnXYZ heißen die oft XYZ oder DoXYZ

procedure TControl.Click;
begin
  if Assigned(OnClick) then
    OnClick(Self);
end;}

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Button1Click(nil);
  Button1Click(Self); // Sender = TForm1
  Button1Click(Sender); // Sender = Timer1
  Button1Click(Timer1); // es geht auch manuell
  Button1Click(Button1);
  Button1Click(Button2); // es geht auch alles Andere (vor allem wenn ein Event für mehrere Komponenten/Eventzeiger)
  Button1.OnClick(nil);
  Button1.OnClick(Sender);
  Button1.OnClick(Button1);
  ...
  Button1.Click; // ruft das auf, was an OnClick hängt
end;
Bei einem anderen Sender kann man in Button1Click über
Delphi-Quellcode:
if Sender = ...
entscheiden von wem das aufgerufen wurde.
nil = aus dem Code, nicht von einer Komponente
unserem Sender aka Timer1 = aus dem Event von Timer1

Bei Timer1.OnTimer nicht Timer1Timer sondern direkt Button1Click zugewiesen/angehängt, ist das Gleiche wie wie
Delphi-Quellcode:
Button1Click(Sender);
bzw.
Delphi-Quellcode:
Button1Click(Timer1);
.


Oder wie wäre es mit komplett auftrennen?
Delphi-Quellcode:
procedure TForm2.ShpBallDown; // als private Methode in TForm2
begin
  inc(y);
  ShpBall.Top := y;
end;

procedure TForm2.OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key = VK_Space then
    ShpBallDown;
end;

procedure TForm2.OnTimer(Sender: TObject);
begin
  ShpBallDown;
end;

stahli 28. Apr 2020 12:21

AW: Verknüpfung von 2 Procedures
 
Himis Beispiel ist super, weil man dann direkt sieht, was da eigentlich ausgeführt wird. Direkt in den Ereignisbehandlungen sollte man nach Möglichkeit keine komplexeren Berechnungen bzw. Programmlogik schreiben.

Das verbessert die Lesbarkeit und Wartbarkeit des Codes.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.

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