Text in Edit anzeigen
-
- Beiträge: 28
- Registriert: Di 8. Mär 2016, 11:46
- OS, Lazarus, FPC: Windows10
- CPU-Target: Win64
Text in Edit anzeigen
Hallo,
Ich habe im Formular 2 Edit Zeilen und einen Button.
Nach Knopfdruck soll im 1.Edit 'Start' stehen und nach Ablauf von ein paar Sekunden im 2.Edit ' Ende' und dann ein Beep.
Es wird aber in beiden Edits gleichzeitig nach Ablauf der Zeit geschrieben!
Woran kann das liegen?
mfg, Wernkrau38
Ich habe im Formular 2 Edit Zeilen und einen Button.
Nach Knopfdruck soll im 1.Edit 'Start' stehen und nach Ablauf von ein paar Sekunden im 2.Edit ' Ende' und dann ein Beep.
Es wird aber in beiden Edits gleichzeitig nach Ablauf der Zeit geschrieben!
Woran kann das liegen?
mfg, Wernkrau38
- Dateianhänge
-
- unit1.pas
- (728 Bytes) 54-mal heruntergeladen
-
project1.exe
- (18.74 MiB) 52-mal heruntergeladen
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2813
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: Text in Edit anzeigen
1.) Bitte keine *.exe-Dateien.
2.) Vergiss als erstes deine Repeat-Until-Schleife. Benutze die Sleep-Prozedur (http://www.freepascal.org/docs-html/rtl ... sleep.html).
3.) Nach der Zuweisung an dein Edit1 rufst du Application.ProcessMessages auf. Dadurch werden die Änderungen an Programm sofort weitergereicht.
2.) Vergiss als erstes deine Repeat-Until-Schleife. Benutze die Sleep-Prozedur (http://www.freepascal.org/docs-html/rtl ... sleep.html).
3.) Nach der Zuweisung an dein Edit1 rufst du Application.ProcessMessages auf. Dadurch werden die Änderungen an Programm sofort weitergereicht.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Text in Edit anzeigen
In deinem Code beginn gleich nach dem Setzen desTexts in Edit1 die Zählschleife für die Zeitverzögerung. Daher hat dein Programm keine Chance, auf die Aufforderung, das Formular neu auszugeben, die durch das Setzen des Edit1.Texts in die Message-Queue gestellt wurde, zu reagieren. Schreibe nach "Edit1.Text := 'Start'" einfach "Application.ProcessMessages" - das veranlasst, dass dein Programm die Nachrichtenwarteschlange abarbeitet.
Trotzdem: Richtig ist dein Code auch dann noch nicht. Was ist, wenn du in ein paar Jahren einen neuen Computer hat, der die Zählschleife schneller abarbeitet?
Richtig ist, mit einem Timer zu arbeiten. Das geht ganz einfach: Klicke eine TTimer-Komponente (das erste Icon auf Lasche "System") aufs Formular, trage unter "Interval" die Wartezeit in Millisekunden, also z. 2000 für 2 sec, ein, und setze "Enabled" auf false. Letzteres ist wichtig, weil der Timer ja erst nach dem Klicken auf den Schalter aktiv werden soll. In das OnTimer-Event schreibst du, was passieren soll, wenn die Zeit abgelaufen ist, also "Edit2.Text := 'Ende'".
Jetzt fehlt noch der Start von allem - das geschieht durch den Button-Click, also Text von Edit1 mit "Start" belegen, und den Timer starten:
Das "Application.ProcessMessages" ist in diesem Fall nicht nötig, da das Programm nach dem Button-Click automatisch die Nachrichtenwarteschlange abfragen kann.
Und eins noch: Wir glauben dir deine Beschreibung des Problems auch ohne beigefügte exe-Datei. Besser ist es, ein kompilierbares Projekt anzuhängen, dann muss man sich hier nicht selbst ein Testprojekt basteln, um dein Problem nachstellen zu können. Dafür werden nur die .pas, .lfm, lpi and lpr Dateien benötigt, nichts, was beim Kompilieren automatisch erzeugt wird! Packe alles in eine zip-Datei, diese kannst du an deine Nachricht anhängen.
Trotzdem: Richtig ist dein Code auch dann noch nicht. Was ist, wenn du in ein paar Jahren einen neuen Computer hat, der die Zählschleife schneller abarbeitet?
Richtig ist, mit einem Timer zu arbeiten. Das geht ganz einfach: Klicke eine TTimer-Komponente (das erste Icon auf Lasche "System") aufs Formular, trage unter "Interval" die Wartezeit in Millisekunden, also z. 2000 für 2 sec, ein, und setze "Enabled" auf false. Letzteres ist wichtig, weil der Timer ja erst nach dem Klicken auf den Schalter aktiv werden soll. In das OnTimer-Event schreibst du, was passieren soll, wenn die Zeit abgelaufen ist, also "Edit2.Text := 'Ende'".
Jetzt fehlt noch der Start von allem - das geschieht durch den Button-Click, also Text von Edit1 mit "Start" belegen, und den Timer starten:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := 'Start';
Time1.Enabled := true;
end;
Und eins noch: Wir glauben dir deine Beschreibung des Problems auch ohne beigefügte exe-Datei. Besser ist es, ein kompilierbares Projekt anzuhängen, dann muss man sich hier nicht selbst ein Testprojekt basteln, um dein Problem nachstellen zu können. Dafür werden nur die .pas, .lfm, lpi and lpr Dateien benötigt, nichts, was beim Kompilieren automatisch erzeugt wird! Packe alles in eine zip-Datei, diese kannst du an deine Nachricht anhängen.
-
- Beiträge: 28
- Registriert: Di 8. Mär 2016, 11:46
- OS, Lazarus, FPC: Windows10
- CPU-Target: Win64
Re: Text in Edit anzeigen
Herzlichen Dank für Eure blitzschnellen und gründlichen Antworten.
Jetzt habe ichs begriffen: Eine Message absetzen ist der Knackpunkt.
Das kleine Beispiel ist natürlich keine ernsthafte Anwendung. Das Problem tauchte bei mir in einem sinnvolleren Projekt auf und ich fand keine Lösung dafür.
Deshalb habe ich diesen Extrakt geschrieben. Aber trotzdem: Den Timer und den SLEEP kannte ich auch nicht!
Jetzt habe ichs begriffen: Eine Message absetzen ist der Knackpunkt.
Das kleine Beispiel ist natürlich keine ernsthafte Anwendung. Das Problem tauchte bei mir in einem sinnvolleren Projekt auf und ich fand keine Lösung dafür.
Deshalb habe ich diesen Extrakt geschrieben. Aber trotzdem: Den Timer und den SLEEP kannte ich auch nicht!
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Text in Edit anzeigen
Ich würde es so machen:
Zur Timer-Methode würde ich nur greifen, wen während der Pause trotzdem auf andere Ereignisse reagiert werden muss.
Oder wen die Pausen lange sind, 2sec ist gerade eine Schmerzgrenze.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := ' Start';
Application.ProcessMessages;
Sleep(2000);
Edit2.Text := 'Ende';
beep;
end;
Oder wen die Pausen lange sind, 2sec ist gerade eine Schmerzgrenze.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Text in Edit anzeigen
Naja, "Sleep" steht bei mir auf der "schwarzen" Liste. Das verführt dazu, den Programm-Ablauf wie zu DOS-Zeiten linear zu verinnerlichen, statt ereignisorientiert zu denken. Außerdem: Blockiert das nicht den Hauptthread?
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Text in Edit anzeigen
Es gibt Anwendungen, da geht es fast nicht anders, wen man zB. Daten an eine Messkarte schickt, und man 10ms warten muss, bist die Daten auslesbereit sind.Naja, "Sleep" steht bei mir auf der "schwarzen" Liste.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot