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
elundril 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. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!