Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Kleines ladeproblem einer Form
Cyberaxx - Di 12.07.05 10:00
Titel: Kleines ladeproblem einer Form
Hallo,
Ich benutze mehrere Forms in meinem Programm. Eine darunter soll ein Infofenster sein, wo steht das das Programm arbeitet. Das Problem ist nur das die zwei labels mir nicht angezeigt werden. Es wird die Form dargestellt aber das war es auch schon. Könnte mir jemand sagen wie ich überprüfen kann ob eine Form mit allen Inhalten geladen wurde?
Gruss Cyb
maxk - Di 12.07.05 10:33
Führt dein Programm während der Darstellungsphase eine längerdauernde Routine aus? Falls ja, solltest du mal ein Application.ProcessMessage; reinschreiben oder (noch besser) mit Threads arbeiten.
Ansonsten müsstest du das Problem mal etwas genauer beschreiben: Sind Buttons sichtbar, wenn du einen rausziehst, etc.
Gruß,
maxk
Cyberaxx - Di 12.07.05 10:47
Nicht nur lange andauernde Phasen sondern auch recht Auslastende Phasen so ca. 100% :D
Selbst Timer stehen in der Zeit still.
Es laufen immer zwischen 3-5 SQL-Anweisungen. Ausführungs bzw Ladezeit kann mal gut und gerne mehrere Minuten dauern, aus dem Grund wollte ich eine Form darüber haben die eben sagt das er am arbeiten ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button15Click(Sender: TObject); begin label2.Caption := 'Arbeite! Bitte warten...'; Gutschriften_Monat_Artikel.Ausfuehren(Chk_Monat.Itemindex, StrtoInt(Jahr_.Text)); label2.Caption := 'Idle'; end; |
Das Programm schafft es nichtmal nen Caption auf der eigenen Form zu ändern bevor er loslegt.
Nachdem wie die aufzurufende Form genannt ist kann man sich ja schon denken worum es geht, sind ale eine Menge Daten die er sich holen muss.
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
maxk - Di 12.07.05 12:06
Wie gesagt, dann versuch es mal so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button15Click(Sender: TObject); begin label2.Caption := 'Arbeite! Bitte warten...'; Application.ProcessMessages; Gutschriften_Monat_Artikel.Ausfuehren(Chk_Monat.Itemindex, StrtoInt(Jahr_.Text)); label2.Caption := 'Idle'; end; |
Doch wie gesagt: Threads wären dafür eine bessere Lösung.
Gruß,
maxk
Cyberaxx - Di 12.07.05 12:30
Danke so funktioniert es, allerdings bleibt der Timer immernoch stehen. Gibt es da auch ne Möglichkeit das der auch noch weiterläuft?
Mit Threads hab ich bisher noch nicht gearbeitet und informiert. Hättest Du evtl. einen Ansatz?
maxk - Di 12.07.05 12:51
Mit dem Timer hast du das selbe Problem, wie mit dem Label, Windows meldet an das Programm WM_TIMER, aber das Programm verarbeitet die Nachricht nicht.
Threads bieten die Möglichkeit mehrere Sachen gleichzeitig zu machen, was auf normalen Wege so nicht möglich ist. Das Prinzip ist schnell erklärt: Die eigentliche Aufgabe wird vom Threads ausgeführt, während die Anwendung zeitgleich auf die Beendung des Threads wartet und dabei gelegentlich mal ein Application.ProcessMessages; ausführt oder schonmal weitermacht. Die einfachste Methode um Threads zu benutzen ist folgende:
Du leitest die einen neuen Thread ab:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| type TMyThread = class(TThread); protected procedure Execute; override; end; TForm1 = class(TForm) |
In die Methode Execute schreibst du, was dein Programm machen soll:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TMyThread.Execute; begin Gutschriften_Monat_Artikel.Ausfuehren(Chk_Monat.Itemindex, StrtoInt(Jahr_.Text)); end; |
Wenn du den Thread nun starten möchtest, kannst du wie folgt vorgehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| with TMyThread.Create(False) do try while not Terminated do begin Application.ProcessMessages; Sleep(1); end; finally WaitFor; Free; end; |
Alle Codes ungetestet ;)
Wenn du jetzt aus dem Thread dein Label setzen willst,
könnte es Probleme geben. Aber die Callbacks spar ich mir an dieser Stelle mal ;)
Gruß,
maxk
// Edit: Schonwieder zu langsam :bawling:
Cyberaxx - Di 12.07.05 14:02
Danke für die Codeschnipsel, werd mich da heute im laufe des Feierabends mal ransetzen :)
In erster Linie ging es ja darum nur das Ladefenster anzeigen zu lassen. Mit den Threads wäre das jetzt zu komplex um es mal eben in das Komplette Programm einzubauen. Aber wer weiss vllt´. muss ich das ja irgendwann eh nochmal überarbeiten dann kommen Threads mit rein.
Gruss Cyb
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!