Autor Beitrag
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 06.10.05 10:56 
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Do 06.10.05 11:15 
Hi! Versuch es doch mal mit
ausblenden Delphi-Quelltext
1:
Form1.Update;					

(Form1 durch Formularnamen ersetzen)

Alstar
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Do 06.10.05 11:17 
Spricht was gegen ein modales Fortschrittsfenster?
Beschreib vielleicht etwas genauer was deine Anwendung macht.
MisterBum
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: Do 06.10.05 11:33 
Also ich würde bei deinem Problem auch ein Modales Fenster davorschalten ...

ausblenden Delphi-Quelltext
1:
FormWarten.ShowModal;					


Sobald alles erledigt wurde, kannst du dieses Modale Fenster wieder Schließen...

ausblenden Delphi-Quelltext
1:
FormWarten.Close;					
Heiko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 ;)