Frage zur Aktualisierung von Button.Caption (gelöst)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Frage zur Aktualisierung von Button.Caption (gelöst)

Beitrag von frisil »

Hi,
ich fange gerade mit Lazarus an (unter Debian Linux), kenne etwas Pascal (in den frühen 90ern in der Schule gelernt). Hab mir zum Einstieg ein Delphi Heft gekauft und probiere etwas rum. Bin absoluter Neuling, deshalb hab ich (noch) keine wirkliche Ahnung von irgenwas, also sorry vorweg für diese wahrscheinlich blöde Frage:

Ich habe folgende Buttons gebastelt:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
   // counter up
   Inc(counter);
   Button1.Caption := 'clicked: '+inttostr(counter);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
   // Resetting counter
  counter := 0;
  Button1.Caption := 'clicked: '+inttostr(counter);
  Button2.Caption := 'Resetting...';
  Sleep(1000);
  Button2.Caption := 'Reset!';
end;
Wenn Knopf 2 gedrückt wird, soll dort kurz "Resetting..." stehen, dann soll nach einer Sekunde wieder "Reset!" erscheinen. Das passiert aber nicht, denn irgendwie scheint Lazarus den Bildschirm erst zu aktualisieren, wenn die Prozedur TForm1.Button2Click ganz abgearbeitet ist, also erst nach dem Sleep Befehl. Warum?

In meinem Delphi Heft ist was ähnliches beschrieben, dort schien das also zu funktionieren.
PS: Ja, ich weiß, dass dieses Programm wenig sinnvoll ist, aber so sind eben die ersten Versuche mit 'ner neuen Sprache.
Zuletzt geändert von frisil am Mi 19. Mai 2010, 23:31, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Frage zur Aktualisierung von Button.Caption

Beitrag von Socke »

Willkommen im Forum!
frisil hat geschrieben:Wenn Knopf 2 gedrückt wird, soll dort kurz "Resetting..." stehen, dann soll nach einer Sekunde wieder "Reset!" erscheinen. Das passiert aber nicht, denn irgendwie scheint Lazarus den Bildschirm erst zu aktualisieren, wenn die Prozedur TForm1.Button2Click ganz abgearbeitet ist, also erst nach dem Sleep Befehl. Warum?

In meinem Delphi Heft ist was ähnliches beschrieben, dort schien das also zu funktionieren.
Ob das so in Delphi funktioniert mag ich bezweifeln, aber zu deiner Frage:
Die Funktion Sleep(1000) legt dein Programm für 1000 Millisekunden lahm. Das heißt es bekommt in dieser Zeit vom Betriebssystem keine Prozessorzeit zugeteilt und tut dann auch nichts - also auch nicht neu zeichnen. Damit neue gezeichnet wird, musst du einmal Application.ProcessMessages; aufrufen. Damit werden alle offenen Messages (Zeichnen, Mausevents, Tastatureingaben usw.) abgearbeitet. Vielleicht hilft auch nur ein einfaches Button1.Repaint;.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

frisil
Beiträge: 11
Registriert: Mi 19. Mai 2010, 18:58

Re: Frage zur Aktualisierung von Button.Caption

Beitrag von frisil »

Danke für die schnelle Hilfe!
Button1.Repaint bringt seltsamerweise nichts, aber mit Application.ProcessMessages geht's.
Das mit Delphi kann ich nicht beurteilen, wie schon gesagt hab ich das letzte mal vor 20 Jahren mit Turbo Pascal gearbeitet und kenne Delphi daher nicht. Hab mir das Delphi-Heft für €4,50 ja auch nur als schnellen Einstieg für Lazarus gekauft.

Antworten