AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TTimer gibt nicht an Fenster zurück - Thread stopt
Thema durchsuchen
Ansicht
Themen-Optionen

TTimer gibt nicht an Fenster zurück - Thread stopt

Ein Thema von EccoBravo · begonnen am 26. Jan 2007 · letzter Beitrag vom 30. Jan 2007
Antwort Antwort
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#1

TTimer gibt nicht an Fenster zurück - Thread stopt

  Alt 26. Jan 2007, 10:56
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
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

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

  Alt 26. Jan 2007, 11:48
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
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#3

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

  Alt 26. Jan 2007, 13:26
Danke vielmals, das wars

Ein schönes Wochenende

E. B.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#4

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

  Alt 30. Jan 2007, 11:05
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
Enable:=false; und wann mit
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.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

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

  Alt 30. Jan 2007, 11:31
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
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#6

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

  Alt 30. Jan 2007, 12:14
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.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

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

  Alt 30. Jan 2007, 12:40
Selbstverständlich gilt lokal vor global - wo war da ein Widerspruch?
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#8

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

  Alt 30. Jan 2007, 12:43
Hallo,

aber ist nicht
T_Einstell lokal
und
F_Einstell globel?

Danke,
E. B.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

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

  Alt 30. Jan 2007, 13:03
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
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#10

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

  Alt 30. Jan 2007, 13:07
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.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 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