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 procedure uhr1Timer(Sender:TObject); public 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
Gausi: Code- durch Delphi-Tags ersetzt.
Delete - Mo 18.04.05 15:59
Titel: Re: TTimer löst kein Ereignis aus
UserMP hat folgendes geschrieben: |
|
Denk mal drüber nach. ;)
UserMP - Mo 18.04.05 16:04
Titel: Re: TTimer löst kein Ereignis aus
MathiasSimmack hat folgendes geschrieben: |
UserMP hat folgendes geschrieben: | |
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
UserMP 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.
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 public 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
Christian 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.
und du nutzt einen CLX-Timer, da du eine CLX-unit einbindest (das Q ist vorndran). Da darf nur
stehen
Mfg Frank
Delete - Di 19.04.05 09:17
Keldorn 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
MathiasSimmack 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!