Autor |
Beitrag |
UserMP
Hält's aus hier
Beiträge: 14
Windows 2000
D7
|
Verfasst: Mo 18.04.05 15:42
Hallo
ich hab folgendes Problem der TTimer löst kein Ereignis aus?
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.
MfG
UserMP
Moderiert von Gausi: Code- durch Delphi-Tags ersetzt.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 18.04.05 15:59
|
|
UserMP 
Hält's aus hier
Beiträge: 14
Windows 2000
D7
|
Verfasst: Mo 18.04.05 16:04
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
Windows 2000
D7
|
Verfasst: 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 () ?
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.  Geht aber nicht gegen dich, ich habe das schon bei einigen Leuten gesehen.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
UserMP 
Hält's aus hier
Beiträge: 14
Windows 2000
D7
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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?
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
UserMP 
Hält's aus hier
Beiträge: 14
Windows 2000
D7
|
Verfasst: Di 19.04.05 08:46
ich Poste mal alles
bis jetzt wird immer noch kein Ereignis (uhr1Timer) ausgelöst
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  hab
woran es noch liegen kann
UserMP
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
Delphi-Quelltext
stehen
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 19.04.05 09:17
|
|
UserMP 
Hält's aus hier
Beiträge: 14
Windows 2000
D7
|
Verfasst: 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
em noch ne frage nebenbei?
beim zerstören der klasse
in main
HM.destroy()
und in unit 2 dann
eine function destroy ????
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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.
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|