Steuerelement sofort aktualisieren (Linux, qt)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Steuerelement sofort aktualisieren (Linux, qt)

Beitrag von sierdolg »

Hallo beisammen,

den heutigen Vormittag habe ich mit der erfolglosen Suche danach verbracht, wie man das sofortige Aktualisieren einer visuellen Komponente, im Spezialfall hier eines Memofelds für diverse Ausgaben wirklich sicherstellen kann.

In dem Zusammenhang dachte ich an .Repaint und .Update und/oder Application.ProcessMessages, was ich auch immer wieder empfohlen fand, aber es will bei mir einfach nicht. Meine Umgebung: Lazarus 1.2.4 (von gtk2 umgestellt auf qt, weil mit gtk keine AccelChars in der Menüleiste funktionieren) auf Debian/testing (64 bit).

Man nehme für den simpelsten Fall ein leeres Form1 mit einem Button1 und einem Memo1 drauf und folgende

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject); 
begin
  Memo1.Text:='Start...';
  WriteLn('Start...');
  Memo1.Repaint;
  Memo1.Update;
  Application.ProcessMessages;
  Sleep(1000); //oder beliebig lange
  Memo1.Text:=Memo1.Text + ' Fertig.';
  WriteLn('Fertig.');
end;
Die Ausgabe auf der guten alten Konsole geschieht zum erwarteten Zeitpunkt, doch das Memofeld wird aber nicht vor der Sleep-Anweisung aktualisiert.

Habe alle Kombinationen Permutationen von .update, .invalidate, .repaint auf dem Memo (und desgleichen mit Form1) durch, doch nie funktioniert es wie erwartet.
Weiß jemand von den Lazarus-Experten hier vielleicht, wie man das am besten löst?

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

Re: Steuerelement sofort aktualisieren (Linux, qt)

Beitrag von theo »

Ohne das Gedöns geht es bei mir. (Auf GTK2 auch mit Gedöns).

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text:='Start...';
  WriteLn('Start...');
  Application.ProcessMessages;
  Sleep(1000); //oder beliebig lange
  Memo1.Text:=Memo1.Text + ' Fertig.';
  WriteLn('Fertig.');
end;    

Antworten