Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TTimer löst kein Ereignis aus


UserMP - Mo 18.04.05 15:42
Titel: TTimer löst kein Ereignis aus
Hallo

ich hab folgendes Problem der TTimer löst kein Ereignis aus?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
unit Unit2;
interface
uses  QExtCtrls;

 type
  TTest = class(TObject)
   private
    { Private-Deklarationen }
    procedure uhr1Timer(Sender:TObject);
  public
    { Public-Deklarationen }
    procedure erzeugen();
    function getbo():boolean;
  end;

var

  uhr1:TTimer;
  bo:boolean;
implementation
procedure TTest.erzeugen();
begin
 bo:=false;
 uhr1:=TTimer.Create(nil);
 uhr1.enabled:=false;
 uhr1.Interval:=1000;
 uhr1.OnTimer:=uhr1Timer;
 uhr1.enabled:=true;
end;
procedure TTest.uhr1Timer(Sender:TObject);
begin
 if bo=false then bo:=true
 else bo:=false;
end;
function TTest.getbo():boolean;
begin
  getbo:=bo;
end;  
end.



mainform:
var HM:TTest;
procedure TForm1.FormCreate(Sender: TObject);
begin
  HM.erzeugen();
  ...
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Label4.Caption:='test';
  Label4.Caption:=booltostr(HM.getbo(),true);
end;


Was mach ich Falsch?
ich hoff mir kann geholfen werden. :roll:

MfG
UserMP

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.


Delete - Mo 18.04.05 15:59
Titel: Re: TTimer löst kein Ereignis aus
user profile iconUserMP hat folgendes geschrieben:

Delphi-Quelltext
1:
 uhr1.enabled:=false;                    

Denk mal drüber nach. ;)


UserMP - Mo 18.04.05 16:04
Titel: Re: TTimer löst kein Ereignis aus
user profile iconMathiasSimmack hat folgendes geschrieben:
user profile iconUserMP hat folgendes geschrieben:

Delphi-Quelltext
1:
 uhr1.enabled:=false;                    

Denk mal drüber nach. ;)


ich denk wenn man weitergelesen hätte dann wäre das klar oder!

Quelltext
1:
2:
3:
4:
 uhr1.enabled:=false;  
 uhr1.Interval:=1000;  
 uhr1.OnTimer:=uhr1Timer;  
 uhr1.enabled:=true;


Delete - Mo 18.04.05 18:12

Stimmt, das hatte ich übersehen. Trotzdem kannst du dir das sparen, weil der Timer standardmäßig aktiv ist. Ich bin der Meinung, dein Code funktioniert nicht, weil du deine TTest-Klasse nicht erzeugt hast. Du greifst einfach auf die Methode/Prozedur "erzeugen" zu. Außerdem geht es kürzer und trotzdem eleganter:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
type
  TTest = class
  private
    bo    : boolean;
    uhr1  : TTimer;
    procedure uhr1Timer(Sender: TObject);
  public
    constructor Create;
    property GetBo: boolean read bo;
  end;

implementation

constructor TTest.Create;
begin
  bo            := false;
  uhr1          := TTimer.Create(nil);
  uhr1.Interval := 1000;
  uhr1.OnTimer  := uhr1Timer;
end;

procedure TTest.uhr1Timer(Sender:TObject);
begin
  bo            := not bo;
end;

Noch genialer wird es übrigens, wenn man dem "Create"-Konstruktor sogar noch den Intervall für den Timer übergeben kann. Das aber nur am Rande.

Wie gesagt: Erzeuge deine Klasse im "OnCreate" der Form, gib sie im "OnDestroy" wieder frei, und es funktioniert. Mir ist der Sinn zwar nicht ganz klar, aber letzten Endes interessiert es mich auch nicht. Ich weiß nur, dass mein kleines Beispiel gerade wunderbar funktioniert hat.


UserMP - Mo 18.04.05 21:18

erst mal mein Dank an

MathiasSimmack


aber es geht nicht hab mal deinen code copiert
welche delphi version benutzt du?
stürtzt zur compilierungszeit ab in TTest.Create
bei bo:=false;
was eigendlich nicht sein dürfte!

hast ne weitere idee das mit dem create hab ich
mir schon früher gedacht, als das nicht ging hab
ich dann erzeugen daraus gemacht

haste ne idee warum das da oben nicht geht?

UserMP

p.s. beim Create kommt kein () ?


Delete - Mo 18.04.05 22:15

user profile iconUserMP hat folgendes geschrieben:
aber es geht nicht hab mal deinen code copiert
welche delphi version benutzt du?

Delphi 5 Pro.

Zitat:
p.s. beim Create kommt kein () ?

Programmierst du C oder ähnliche Sprachen? Delphi stört sich zwar nicht an den leeren Klammern, aber ich finde es albern, bei Delphi leere Klammern zu setzen. Ich weiß nicht, was das aussagen soll. :roll: Geht aber nicht gegen dich, ich habe das schon bei einigen Leuten gesehen.


Keldorn - Mo 18.04.05 22:46

du hast doch nicht etwa:
Zitat:

ttest.create?
bzw.
hm.create geschrieben?



Delphi-Quelltext
1:
2:
hm:=hm.create;
hm.erzeugen;

obwohls sicher besser wäre, man überschreibt gleich den constructor

Mfg Frank


UserMP - Di 19.04.05 03:28

nach der änderung von


bei hm:=hm.create kommt es zu einen Fehler in TTest.Create an
der stelle bo:=false;

HM.create zu hm:=TTest.create;
läßt es sich kompilieren, leider
wird wieder kein Ereignis ausgelost
getbo bleibt immer false!

UserMP


Keldorn - Di 19.04.05 07:53

Hallo mans sollte halt doch nach den VWL-Abendvorlesungen doch einfach nur ins Bett gehen ;)

richtig ist natürlich:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
  hm:=Ttest.Create;
  hm.erzeugen;
end;

das geht bei mir auch.

Zitat:

uses QExtCtrls;

schreibst du wirklich eine CLX-Anwendung?


UserMP - Di 19.04.05 08:46

ich Poste mal alles
bis jetzt wird immer noch kein Ereignis (uhr1Timer) ausgelöst :cry:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit Unit1;

interface

uses
  unit2,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  HM:TTest;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  HM:=TTest.create;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if HM.getbo=true then Label1.Caption:='true'
  else Label1.Caption:='false';
end;

end.

unit Unit2;  
interface  
uses  QExtCtrls;  

 type  
  TTest = class  
  private  
    bo    : boolean;  
    uhr1  : TTimer;  
    procedure uhr1Timer(Sender: TObject);  
  public  
    constructor Create;
    property GetBo: boolean read bo;
  end;  

 
implementation  

constructor TTest.Create;
begin

  bo            := false;
  uhr1          := TTimer.Create(nil);
  uhr1.Interval := 1000;
  uhr1.OnTimer  := uhr1Timer;
  uhr1.Enabled  :=  true;
end;
procedure TTest.uhr1Timer(Sender:TObject);  
begin  
  bo            := not bo;  
end
end.


bitte um weitere Vorschläge
da ich gerad keine :idea: hab
woran es noch liegen kann

UserMP

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Keldorn - Di 19.04.05 08:52

also schreibst diu doch eine ganz normale Win32-Anwendung? oder?

Ich hab keine Ahnung von dem CLX-zeugs. Kann mir aber nicht vorstellen, das du einen CLX-Timer in eine Win32-Form unterbringen kannst.
Zitat:

uses QExtCtrls;

und du nutzt einen CLX-Timer, da du eine CLX-unit einbindest (das Q ist vorndran). Da darf nur

Delphi-Quelltext
1:
uses ExtCtrls;                    

stehen

Mfg Frank


Delete - Di 19.04.05 09:17

user profile iconKeldorn hat folgendes geschrieben:
Hallo mans sollte halt doch nach den VWL-Abendvorlesungen doch einfach nur ins Bett gehen ;)

richtig ist natürlich:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
  hm:=Ttest.Create;
  hm.erzeugen;
end;

das geht bei mir auch.

Oder, wie ich vorschlug, den "erzeugen"-Quatsch lassen und die Sachen gleich im Konstruktur deklarieren. Wer will, kann ja auch das Intervall angeben. ;)


@UserMP: Beim Beenden des Programms (= "OnDestroy" der Form) nicht vergessen, die Klasse wieder freizugeben.


UserMP - Di 19.04.05 10:03

a Danke ohne Q gehts mit mal
das hab ich einfach aus der Delphi hilfe Kopiert
ja und ich denk es ist eine w32 anwendung

Danke noch mal an alle wenn wieder was nicht geht dann schreib ich

MfG
UserMP :o

em noch ne frage nebenbei?
beim zerstören der klasse

in main

HM.destroy()

und in unit 2 dann

eine function destroy ????


Keldorn - Di 19.04.05 11:32

user profile iconMathiasSimmack hat folgendes geschrieben:

Oder, wie ich vorschlug, den "erzeugen"-Quatsch lassen und die Sachen gleich im Konstruktur deklarieren. Wer will, kann ja auch das Intervall angeben. ;)

hat er ja schon umgesetzt ;)

@usermp:
überschreib den destructor, dort gibst du deinen timer wieder frei. Freigeben immer mit .free, nicht mit .destroy.