Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Kein verzögerer bei Label1.OnClick(Self) oder Image1click


Biarchiv - Mi 20.01.10 18:44
Titel: Kein verzögerer bei Label1.OnClick(Self) oder Image1click
Hallo,

hab ein Problem wegen der Verzögerung eines automatischen Labeldrucks per


Delphi-Quelltext
1:
2:
Label1.OnClick(Self);
showmessage('Nur weiter wenn Label1 fertig ist!');


oder bei Eventclick


Delphi-Quelltext
1:
2:
Image1click;
showmessage('Nur weiter wenn Label1 fertig ist!');


Das Problem ist das die Showmessage sofort aufgeht obwohl die Befehle die hinter dem Click sind noch einige Zeit brauchen. Bei


Delphi-Quelltext
1:
2:
Button1.Click;
showmessage('Nur weiter wenn Label1 fertig ist!');


scheint es zu gehen.


elundril - Mi 20.01.10 19:46

wenn du uns verrätst was die Befehle sind die beim ButtonClick ausgeführt werden, können wir dir vielleicht sagen warum das so ist. Wir zb eine Apifunktion aufgerufen in deinem OnClick leitet dein Prozess das an einen anderen Prozess weiter und dein Prozess kann weiterarbeiten, während der andere Prozess das ausführt. Wird natürlich dann blöd wenn man eigentlich den anderen Prozess zum weiterarbeiten im eigenen Prozess braucht.

lg elundril


Biarchiv - Mi 20.01.10 20:57

Hallo,

es sind mehr als 300 Zeilen Code. Der Click-Prozess muss Dateien bearbeiten. Es sind API und Delphi-Interne Befehle vorhanden. Der Vorgang ist verschieden und kann Sekunden oder Minuten dauern. Gibt es eine Möglichkeit einen Sleep mit Break in einem Timer oder so?


Niko S. - Mi 20.01.10 21:27

Jetzt ne blöde Idee, aber du kannst doch alles was nach dem "Click" event kommt vor einer while schleife setzen..

Delphi-Quelltext
1:
2:
while not (fertig) do
  ;


Dann würde er , solange fertig auf "false" ist, in der Schleife bleiben, bis er fertig ist.
Allerdings würde eventuell das Programm so einfrieren ;x


jaenicke - Mi 20.01.10 21:34

Das ist dann alles keine Vorgehensweise wie es unter Windows üblich und sinnvoll ist, wenn man auf etwas wartet oder so.

Klar ist jedenfalls: Das OnClick wird komplett durchlaufen, denn sonst würde der Code nach dessen Aufruf ja nicht ausgeführt werden. Deshalb ist eben wie bereits user profile iconelundril sagte die Frage wodurch dieser Code dann offenbar teilweise asynchron weiterläuft, wenn du ja sagst, dass der dennoch nicht fertig ist.

Wenn eine längere Operation läuft, dann wird man normalerweise durch ein Ereignis von deren Ende benachrichtigt. Bzw. bei einer eigenen Aktion löst man selbst ein solches Event aus.

Und die Konstruktion ist so schon seltsam. Normalerweise sieht sowas so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TfrmMain.DoSomething(Param: TParam);
begin

end;

procedure TfrmMain.LabelXClick(Sender: TObject);
begin
  DoSomething(MyParam);
end;

procedure TfrmMain.TimerXTimer(Sender: TObject);
begin
  DoSomething(MyParam);
end;
Denn gemeinsam genutzter Code gehört nicht in irgendein Event einer visuellen Komponente. So ist das übersichtlich und man kann die ausgelagerte Methode entsprechend benennen. ;-)