Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Nur bestimmte Aktionen durchführen lassen.
Heiko - Do 06.10.05 10:56
Titel: Nur bestimmte Aktionen durchführen lassen.
In meinem Programm habe ich eine Prozedur, wo er ein bissl länger braucht um diese zu verarbeiten. Meine erste Idee waqr, damit er das Formular in der Zeit neu zeichnet Application.ProcessMessages oder HandleMessages zu verwenden. Allerdings verarbeitet er dann auch Messages, die er zu dem Zeitpunkt nicht verarbeiten soll, denn während die Prozedur arbeitet, soll nur die Messages für das Verändern der Formularposition, Größe, Minimieren, ... und das neu-zeichnen des Formulars verarbeitet werden. Wie kann man es mit einem geringsmöglichen Aufwand realisieren?
Alstar - Do 06.10.05 11:15
Hi! Versuch es doch mal mit
(Form1 durch Formularnamen ersetzen)
Alstar
digi_c - Do 06.10.05 11:17
Spricht was gegen ein modales Fortschrittsfenster?
Beschreib vielleicht etwas genauer was deine Anwendung macht.
MisterBum - Do 06.10.05 11:33
Also ich würde bei deinem Problem auch ein Modales Fenster davorschalten ...
Sobald alles erledigt wurde, kannst du dieses Modale Fenster wieder Schließen...
Heiko - Do 06.10.05 13:31
Das ShowModal bring mich nicht weiter, denn es ist auf dem Hauptformular. Es geht um das Befüllen einer ListView mit Daten. Damit aber der Nutzer nicht nochmal draufklickt, also andere Daten reinfüllen lässt, soll erstmal die Befüllung fertig werden, da sonst ein Chaos entstehen könnte. Da es aber 1-2 Sekunden dauert, trotz BeginUpdate & Co, wird das Formular nicht neugezeichnet, was ich bissl lästig finde.
@Update: Ich glaube der reagiert dann aber nicht auf minimieren und verschieben des Fensters, oder?
digi_c - Do 06.10.05 14:27
Genau, es wird nur neu gezeichnet.
Hmm also ich bleibe bei einem neuen modalen Fenster, das scheint mir auch die standartkonformste Möglichkeit zu sein.
Kannst natürlich auch einfach die Komponente.Enabled:=false machen und den WarteCursor anzeigen.
Delete - Do 06.10.05 14:37
Nimm einen Thread. Vorm Starten deaktivierst du alles, was nicht geändert wrerden darf und wenn er fertig ist aktivierst du alles wieder. Das wäre die sauberste Lösung, denke ich.
Heiko - Do 06.10.05 14:44
Mhm, Threads mag ich eigentlich nicht, vor allem da er hier eigentlich benötigt wird, denn mehrere Threads nimmt man ja eigentlich nur, wenn mehrere Dinge "gleichzeitig" gemacht werden soll, was ja eigentlich nicht bei diesem Fall der Fall ist.
Aber eigentlich dürfte es ja reichen, wenn ich für den Moment Form1.Enabled:=false mache.
Delete - Do 06.10.05 15:01
Es sollen doch Dinge gleichzeitig geschehen: Den Code in der Prozedur und das Fenster soll sich dabei noch neu zeichnen können. Wenn das nicht gleichzeitig ist, dann weiß ich es auch nicht. Und genau dazu sind Threads unteranderem gedacht, damit bei längeren Routinen das Fenster noch reagiert.
Heiko - Do 06.10.05 15:14
Ja das schon, aber das erfordert doch eigentlich nicht gleich einen neuen Thread. Gibt es nicht die Möglichkeit zu überprüfen, welche Message anliegt und wenn bestimmte drin sind, diese durchführen zu lassen?
Delete - Do 06.10.05 15:23
Doch genau das erfordert einen weiteren Thread, da der Hauptthread des Fensters nicht die Nachrichten aus der Nachrichtenschlange von Windows abholen kann, da er gerade mit der Routine beschäftigt ist. Ergo brauchst du einen weiteren Thread für die Routine, damit der Hauptthread weiter die anstehenden Nachrichten verarbeiten kann.
Heiko - Do 06.10.05 15:33
Und woher weiß ich, welche Messages gekommen sind, und wie verarbeite ich die dann, wenn ich sie zulasse?
digi_c - Do 06.10.05 15:43
Brauchst du eigentlich nciht soweit ich mich entsinne.
Du kreirst ein Thread Objekt für deine langandauernde Methode und die läuft dann parallel.
Am Beginn und Anfang der Methode kannst du die Form Enablen und Disablen.
Aber eigentlich könntest du das doch auch gleich in der Funktion machen und in der Schleife ab und zu ProcessMessage senden oder :?
Naja Threads wären schon das sauberste aber ich meine trotzdem, dass ein Wartefenster das eleganteste ist, da der User ja während der Zeit nichts machen soll=> er muss darauf hingewiesen werden ;)
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!