Autor Beitrag
Cyberaxx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Di 12.07.05 10:00 
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

_________________
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Cyberaxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: 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.

ausblenden 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.

_________________
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Di 12.07.05 12:06 
Wie gesagt, dann versuch es mal so:
ausblenden 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

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Cyberaxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: 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?

_________________
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
ManuelGS
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 173

Win XP HE, Suse Linux
D6, D7, D2005 Personal
BeitragVerfasst: Di 12.07.05 12:51 
ich würde dir auch empfehlen eher mit threads zu arbeiten.
Hier ein Tut:
www.delphi-forum.de/...it+Delphi_16627.html

Gruß, Manuel.

_________________
"Leben ist gänzlich Bühne und Spiel; so lerne denn spielen
und entsage dem Ernst - oder erdulde das Leid." - Palladas von Alexandria
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:
ausblenden 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:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Cyberaxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: 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

_________________
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!