Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TTimer gibt nicht an Fenster zurück - Thread stopt (https://www.delphipraxis.net/85124-ttimer-gibt-nicht-fenster-zurueck-thread-stopt.html)

EccoBravo 26. Jan 2007 10:56


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:
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;
Der Einfachheit halber habe ich aus den Takten von T_Einstell:TTimer alle Anweisungen rausgenommen.

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

marabu 26. Jan 2007 11:48

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:
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;
Nebenbei wird auch das Abschalten deiner Form verhindert.

Grüße vom marabu

EccoBravo 26. Jan 2007 13:26

Re: TTimer gibt nicht an Fenster zurück - Thread stopt
 
Danke vielmals, das wars

Ein schönes Wochenende

E. B.

EccoBravo 30. Jan 2007 11:05

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:
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;
Wann muß ich das Enable des TTimer T_Einstell mit
Delphi-Quellcode:
Enable:=false;
und wann mit
Delphi-Quellcode:
T_Einstell.Enable:=false;
schreiben.

Ich bin deshalb irritiert, weil ich bislang immer auf OnChange und OnClick Ereignisse eines TEdit wie folgt implementiert habe

Delphi-Quellcode:
procedure Edit1Click(...);
begin
   FText:= text;
   // gemeint ist Edit1.Text
end;
Kann mir jemand sagen Wann und wie?

Vielen Dank

E. B.

marabu 30. Jan 2007 11:31

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:
procedure {TDemoForm.}Edit1Click(...);
begin
   FText:= text;
   // gemeint ist Edit1.Text
end;
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.

Freundliche Grüße

EccoBravo 30. Jan 2007 12:14

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.

marabu 30. Jan 2007 12:40

Re: TTimer gibt nicht an Fenster zurück - Thread stopt
 
Selbstverständlich gilt lokal vor global - wo war da ein Widerspruch?

EccoBravo 30. Jan 2007 12:43

Re: TTimer gibt nicht an Fenster zurück - Thread stopt
 
Hallo,

aber ist nicht
T_Einstell lokal
und
F_Einstell globel?

Danke,
E. B.

marabu 30. Jan 2007 13:03

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

EccoBravo 30. Jan 2007 13:07

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 17:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz