Hilfe mein Formular ist nicht zu sehen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Hilfe mein Formular ist nicht zu sehen

Beitrag von danny61 »

Hallo,
ich möchte während einer Zeitaufwändigen Datenbank-Lösch-Operation in meinem Datenmodul einen kleinen Splash-Screen anzeigen und evtl. eine Fortschrittsanzeige in % machen (TAnimate gibt es unter Lazarus ja anscheinend nicht).
Da Ich es aus meinem MainForm heraus nicht geschafft habe das Form anzuzeigen, habe ich den Prozeduraufruf nun sogar direkt in die FormShow Methode des Formulars gesetzt aber das Formular wird immer erst angezeigt, wenn das Löschen schon beendet ist :-(
Von meinem Mainform aus wird das Formular mit ShowModal aufgerufen.
So sieht es aus :

Code: Alles auswählen

procedure TFormDelete.FormShow(Sender: TObject);
begin
  dmbuecher.DeleteAll;
  ShowMessage('Delete fertig');    // danach kann ich das Formular sehen
  ModalResult:=mrOK;
end;


Aber das Formular wird immer erst nach dem ShowMessage Befehl angezeigt.
Ich habe schon versucht einen Repaint oder Activate zu machen aber nichts hat geholfen :-(
Anscheinend bin ich zu doof dazu ;-)

Wer kann helfen ??
thx

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Hilfe mein Formular ist nicht zu sehen

Beitrag von theo »

Tja, so ist das halt. Immer schön eins nach dem anderen (und das ist gut so ;-)
Du kannst ein Formular (nicht modal, weil das wartet) vor dem Löschaufruf anzeigen. Aber ich würde einfach den Cursor auf crHourGlass stellen und nach dem DeleteAll wieder auf crDefault.

Wenn du Fortschritt anzeigen willst, muss dein DeleteAll ein ProgressEvent haben.
Mit dem könntest Du dann auf dem nicht modalen Formular einen Progressbar steuern.

Wenn's richtig lange geht und kein ProgressEvent hat, müsstest du das DeleteAll eventuell in einem separaten Thread ausführen, damit man es auch abknallen kann und das GUI nicht blockiert bzw eine Animation laufen kann.

Es ist übrigens klar, dass Du das Formular nicht siehst, während du die Arbeit in OnShow erledigst. Das Formular wird erst gezeigt, wenn OnShow fertig ist.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

theo hast du unter lazarus jemals versucht den cursor auf crhourglass zu stellen ?!

danny mach doch einfach soetwas aus deinem hauptformular heraus

Splashscreen.Show;
dmbuecher.DeleteAll;
Splashscreen.Hide;
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Christian hat geschrieben:theo hast du unter lazarus jemals versucht den cursor auf crhourglass zu stellen ?!


Stimmt, hatte ich vergessen. Das funzt nicht so wirklich überzeugend. Schade eigentlich ;-)

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

Folgendes hatte ich vom Hauptformular aus als erstes versucht :

Splashscreen.Show;
dmbuecher.DeleteAll;
Splashscreen.Hide;

und nur weil das auch schon nicht funktioniert hatte, habe ich den Prozedur-Aufruf direkt in das Formular gelegt.

Es ist übrigens klar, dass Du das Formular nicht siehst, während du die Arbeit in OnShow erledigst. Das Formular wird erst gezeigt, wenn OnShow fertig ist.


Aber es gibt dann anscheinend auch keinen anderen Event, den ich dafür verwenden kann, oder ?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

danny61 hat geschrieben:und nur weil das auch schon nicht funktioniert hatte, habe ich den Prozedur-Aufruf direkt in das Formular gelegt.


Wie hat denn das nicht funktioniert?
Habe eben einen Test gemacht. Folgender Code funzt doch prima:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
  Form2.Show;
  for i:=0 to 10 do
  begin
   Sleep(200);
   Form2.ProgressBar1.Position:=i*10;
   Application.ProcessMessages;
  end;
  Form2.Hide;
end;

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

Leider nein.
So sieht mein Code aus :

Code: Alles auswählen

if MessageDlg('Datenbank Löschen','Soll die bestehende Datenbank vor dem Import gelöscht werden ?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
  begin
     FormDelete.Show;
      dmbuecher.DeleteAll;
      Sleep(10000);
     FormDelete.Hide;
   end;


Leider wird nicht einmal der MessageDlg richtig geschlossen (ist noch halb zu sehen), bevor DeleteAll aufgerufen wird, geschweige denn das FormDelete angezeigt wird :-(

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

danny61 hat geschrieben:Leider wird nicht einmal der MessageDlg richtig geschlossen (ist noch halb zu sehen), bevor DeleteAll aufgerufen wird, geschweige denn das FormDelete angezeigt wird :-(


Hast du denn noch irgendwo ein
Application.ProcessMessages ?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Code: Alles auswählen

if MessageDlg('Datenbank Löschen','Soll die bestehende Datenbank vor dem Import gelöscht werden ?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
begin
FormDelete.Show;
Application.Processmessages;
dmbuecher.DeleteAll;
FormDelete.Hide;
Application.Processmessages;
end;



Wie schauts denn so aus ?

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

ja, genau, "ProcessMessages" hat mir gefehlt.
thx

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

danny61 hat geschrieben:So sieht mein Code aus :

Code: Alles auswählen

Sleep(10000);


Bei sleep tut das Programm nichts. es stellt also nichts dar, reagiert auch auf keinen mouseclick etc.
-Michael

Antworten