Autor Beitrag
UserMP
Hält's aus hier
Beiträge: 14

Windows 2000
D7
BeitragVerfasst: Mo 18.04.05 15:42 
Hallo

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

ausblenden volle Höhe 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.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 18.04.05 15:59 
user profile iconUserMP hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
 uhr1.enabled:=false;					

Denk mal drüber nach. ;)
UserMP Threadstarter
Hält's aus hier
Beiträge: 14

Windows 2000
D7
BeitragVerfasst: Mo 18.04.05 16:04 
user profile iconMathiasSimmack hat folgendes geschrieben:
user profile iconUserMP hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
 uhr1.enabled:=false;					

Denk mal drüber nach. ;)


ich denk wenn man weitergelesen hätte dann wäre das klar oder!
ausblenden Quelltext
1:
2:
3:
4:
 uhr1.enabled:=false;  
 uhr1.Interval:=1000;  
 uhr1.OnTimer:=uhr1Timer;  
 uhr1.enabled:=true;
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14

Windows 2000
D7
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 18.04.05 22:46 
du hast doch nicht etwa:
Zitat:

ttest.create?
bzw.
hm.create geschrieben?


ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14

Windows 2000
D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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:
ausblenden 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?

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
UserMP Threadstarter
Hält's aus hier
Beiträge: 14

Windows 2000
D7
BeitragVerfasst: Di 19.04.05 08:46 
ich Poste mal alles
bis jetzt wird immer noch kein Ereignis (uhr1Timer) ausgelöst :cry:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
uses ExtCtrls;					

stehen

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14

Windows 2000
D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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.

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)