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 user profile iconraziel: 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?


ManuelGS - Di 12.07.05 12:51

ich würde dir auch empfehlen eher mit threads zu arbeiten.
Hier ein Tut:
http://www.delphi-forum.de/topic_ThreadProgrammierung+unter+Windows+mit+Delphi_16627.html

Gruß, Manuel.


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
 // Muss angepasst werden:
 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