![]() |
TTimer gibt nicht an Fenster zurück - Thread stopt
Hallo,
mal wieder eigenwilliges Problem in BDS2006. In einem TF_Einstell:TForm rufe ich mit einem B_MSuchen:TButton einen T_Einstell:TTimer auf
Delphi-Quellcode:
procedure TF_Einstell.B_MSuchenClick(Sender : TObject);
begin takt := 0; with F_Haupt do begin Port.Active := true; Port.SyncWait := false; Port.TrmTimeOut := 5000; Port.RecTimeOut := 5000; end; T_Einstell.Interval := 300; t := ''; E_Transfer := Edit2; Frager := 'PTW' + #13#10; T_Einstell.Enabled := true; end; Dieser T_Einstell:TTimer soll drei Takte lang etwas tun
Delphi-Quellcode:
Der Einfachheit halber habe ich aus den Takten von T_Einstell:TTimer alle Anweisungen rausgenommen.
procedure TF_Einstell.T_EinstellTimer(Sender : TObject);
begin takt := takt + 1; case takt of 1 : begin // n := F_Haupt.Port.TransmittText(Frager); end; 2 : begin // E_Transfer.Text := U_Haupt.t; end; 3 : begin Enabled := false; takt := 0; B_Reset.Enabled:=true; end; end; end; Problem: Nachdem ich mit dem B_MSuchen:TButton den T_Einstell:TTimer gestartet habe, läuft dieser seine 3 Schritte ab, kommt da an, wo er das B_Reset:TButton aktiviert, und dann bleibt der Thread des F_Einstell:TForm einfach stehen. B_ResetClick wird nicht mehr ausgeführt und das F_Einstell:TForm bleibt stehen, es läßt sich nicht mehr vergrößern, minimieren usw... Der Prozess wird vom T_Einstell:TTimer nicht mehr an F_Einstell:TForm zurück gegeben. Hat nicht jemand eine Idee? Vielen Dank E. B. PS: als Schnittstellenprogramm verwende ich TSerial4.2 |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Hallo,
ein Tipp zu deinen Takten: Da der Timer explizit gestartet wird, brauchst du keinen Zustand "undefiniert" (bei dir 0). Dein Automat kommt auch mit nur zwei Zuständen aus:
Delphi-Quellcode:
Nebenbei wird auch das Abschalten deiner Form verhindert.
procedure TF_Einstell.T_EinstellTimer(Sender : TObject);
begin with Sender as TTimer do begin // pre-conditions Tag := 1 - Tag; // actions if Tag = 1 then begin // n := F_Haupt.Port.TransmittText(Frager); end else begin // E_Transfer.Text := U_Haupt.t; end; // post-conditions if Tag = 0 then begin // nicht die Form, sondern den Timer abschalten: Enabled := False; B_Reset.Enabled := not Enabled; end; end; end; Grüße vom marabu |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Danke vielmals, das wars
Ein schönes Wochenende E. B. |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Hallo
hier bin ich nochmal es ist noch etwas Unverständnis bei der letzten Antwort aufgekommen (Antwort hat aber funktioniert) Es geht um die Passage: // nicht die Form, sondern den Timer abschalten: Enabled := False; im folgenden Quelltext:
Delphi-Quellcode:
Wann muß ich das Enable des TTimer T_Einstell mit
procedure TF_Einstell.T_EinstellTimer(Sender : TObject);
begin with Sender as TTimer do begin // pre-conditions Tag := 1 - Tag; // actions if Tag = 1 then begin // n := F_Haupt.Port.TransmittText(Frager); end else begin // E_Transfer.Text := U_Haupt.t; end; // post-conditions if Tag = 0 then begin // nicht die Form, sondern den Timer abschalten: Enabled := False; B_Reset.Enabled := not Enabled; end; end; end;
Delphi-Quellcode:
und wann mit
Enable:=false;
Delphi-Quellcode:
schreiben.
T_Einstell.Enable:=false;
Ich bin deshalb irritiert, weil ich bislang immer auf OnChange und OnClick Ereignisse eines TEdit wie folgt implementiert habe
Delphi-Quellcode:
Kann mir jemand sagen Wann und wie?
procedure Edit1Click(...);
begin FText:= text; // gemeint ist Edit1.Text end; Vielen Dank E. B. |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Hallo,
innerhalb einer Methode kannst du auf Eigenschaften und Methoden der jeweiligen Klasse ohne qualifizierte Namen zugreifen, solange die entsprechenden Bezeichner nicht verdeckt bzw. versteckt werden. Die Ereignisbehandlungsroutine für OnTimer() von T_Einstell ist eine Methode der Form F_Einstell. Damit du mit Enabled nicht die Eigenschaft der Form ansprichst musst du entweder einen qualifizierten Namen (T_Einstell.Enabled) verwenden oder, wie ich es gezeigt habe, den Namensraum durch ein WITH-Statement festlegen.
Delphi-Quellcode:
In deinem Beispiel fehlt der Klassenname - so hast du dein Ziel gewiss noch nie erreicht. Die Eigenschaft Text dürfte so auch nur unter seltenen Umständen gefunden werden.
procedure {TDemoForm.}Edit1Click(...);
begin FText:= text; // gemeint ist Edit1.Text end; Freundliche Grüße |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Danke,
da habe ich bisher immer Glück gehabt. Ich dachte lokal gilt vor global. ich werde es aber in meinen Programmen korrigieren. Danke E. B. |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Selbstverständlich gilt lokal vor global - wo war da ein Widerspruch?
|
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Hallo,
aber ist nicht T_Einstell lokal und F_Einstell globel? Danke, E. B. |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Oh nein.
Der event handler für OnTimer() ist eine Methode der Form. Die auslösende Komponente T_Einstell wird per Konvention im Parameter Sender übermittelt. Dabei geht es weniger um Gültigkeitsbereiche (lokal und global), mehr um Überdeckung und Sichtbarkeit - die Frage: in welcher Reihenfolge werden Namensräume untersucht um mehrdeutige Bezeichner aufzulösen. Erschrockene Grüße |
Re: TTimer gibt nicht an Fenster zurück - Thread stopt
Fehler liegt bei der unerschrockenen Dummheit meiner Person.
Ich als (isolierter) Autodidakt begreife langsam, daß Ereignisroutinen nicht dem Steuerelement sondern dem beheimetenden Form gehören. Jedenfalls - so meiner naiven Vorstellung nach. Grüße eines D A U aus dem Zentrum Europas (..Europin..) E. B. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz