Autor Beitrag
accessViolation
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Mo 05.06.06 15:10 
Hallo!
Ich habe eine - für Euch sicherlich einfache - Frage:

Ich erstelle mir eine Klasse (TClTimer):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Meine eigene Klasse
type TClTimer = class
   public
     tmr         : TTimer;
     tmrInterval : integer;
     // ...
     procedure Create(cInterval: integer);
end;

var
  cltTest: TClTimer;


In der Methode Create will ich die Eigenschaft tmrInterval setzen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TClTimer.Create(cInterval: integer);
begin
   tmrInterval := cInterval;
end;


Wenn das Form erstellt wird, wird die Methode Create aufgerufen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
   cltTest.Create(1000);
end;


Das Problem: Beim Programmstart kommt in der Methode TClTimer.Create eine AccessViolation
Wo liegt mein Fehler? Erzeuge ich nicht korrekt eine Instanz meiner Klasse?
Muss ich einen Constructor anlegen?

Wär schön, wenn Ihr mir ein paar Tips geben würdet... Danke

Dietmar

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Mo 05.06.06 15:13 
ausblenden Delphi-Quelltext
1:
CLTest:=TClTimer.create(1000);					

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
accessViolation Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Mo 05.06.06 20:16 
ausblenden Delphi-Quelltext
1:
CLTest:=TClTimer.create(1000);					

...geht leider auch nicht. [Fehler] Unit2.pas(55): Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt.

Wenn ich dann eine Klassenmethode draus mache, also meine Klasse wie folgt definiere:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type TClTimer = class
   public
     tmr         : TTimer;
     tmrInterval : integer;
     procedure tmrOnTimer();
     class procedure Create(cInterval: integer); // <-- Klassenmethode
end;

...dann kann ich ja in deren Implementierung nicht auf meine Instanzvariable "tmrInterval" zugreifen...
Was ich möchte ist, dass ich beim Erzeugen der Instanz schon Parameter für die Instanz mitgeben kann.

Gruß
Dietmar

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Mo 05.06.06 20:38 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Meine eigene Klasse
type TClTimer = class
   public
     tmr         : TTimer;
     tmrInterval : integer;
     // ...
     constructor Create(cInterval: integer);
end;

var
  cltTest: TClTimer;

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
accessViolation Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Mo 05.06.06 21:25 
Vielen Dank! So funktioniert's prinzipiell...

Nun stehe ich vor einem anderen Problem. Ich habe in meiner Klasse einen TTimer und eine Procedure tmrOnTimer. Diese will ich dem Timer als OnTimer-Ereignisprozedur zuweisen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
// Meine eigene Klasse
type TClTimer = class
   public
     tmr         : TTimer;
     tmrInterval : integer;
     procedure tmrOnTimer();  // <---
     constructor Create(cInterval: integer);
end;

{ ... }
implementation

constructor TClTimer.Create(cInterval: integer);
begin
   tmrInterval := cInterval;
   tmr.Interval := tmrInterval;
   tmr.OnTimer := tmrOnTimer();  // <--- *)
end;

*) [Fehler] Unit1.pas(xx): Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter'

Wie mache ich das?

Wenn ich einen Timer per Mausklick auf die Form setze, kann ich doch auch einfach sagen z.B. Timer1.OnTimer := Prozedurname(); Warum geht das dann hier nicht?
Born-to-Frag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Mo 05.06.06 21:34 
user profile iconaccessViolation hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
// Meine eigene Klasse
type TClTimer = class
   public
     tmr         : TTimer;
     tmrInterval : integer;
     procedure tmrOnTimer(Sender: TObject);  // <---
     constructor Create(cInterval: integer);
end;

{ ... }
implementation

constructor TClTimer.Create(cInterval: integer);
begin
   tmrInterval := cInterval;
   tmr.Interval := tmrInterval;
   tmr.OnTimer := tmrOnTimer;  // <--- *)
end;

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
accessViolation Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Mo 05.06.06 22:07 
Wie ihr doch recht habt... Danke.

Sorry, aber warum löst dann der Timer nicht 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:
type
  TForm1 = class(TForm)
    memoTimer: TMemo;
    procedure FormCreate(Sender: TObject);
//...
  end;

type TClTimer = class
   public
     tmr         : TTimer;
     tmrInterval : integer;
     procedure tmrOnTimer(Sender: TObject);
     constructor Create(cInterval: integer);
end;

var
  Form1: TForm1;
  cltTest: TClTimer;

implementation
{$R *.DFM}

constructor TClTimer.Create(cInterval: integer);
begin
   tmrInterval  := cInterval;
   tmr.Interval := tmrInterval;
   tmr.OnTimer  := tmrOnTimer;
   tmr.Enabled  := true;
end;

procedure TClTimer.tmrOnTimer(Sender: TObject);
begin
    Form1.memoTimer.Lines.Add('Zeit rum');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   cltTest := TClTimer.Create(1000);
end;

Programm startet, aber es passiert gar nichts.
Gerade festgestellt: Nicht mal der Konstruktor wird ausgeführt, denn wenn ich versuche, im Konstruktor etwas ins Memo zu schreiben, passiert auch nichts.


Zuletzt bearbeitet von accessViolation am Mo 05.06.06 22:13, insgesamt 1-mal bearbeitet
Born-to-Frag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Mo 05.06.06 22:12 
fehlt da nicht irgendwo noch ein tmr := TTimer.Create(..)?

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
accessViolation Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Mo 05.06.06 22:18 
Oops, das habe ich vergessen. Habs hinzugefügt, trotzdem passiert nichts. Auch im Konstruktor wird nichts ins Memo geschrieben, also scheint der Konstruktorcode gar nicht ausgeführt zu werden.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
constructor TClTimer.Create(cInterval: integer);
begin
   Form1.memoTimer.Lines.Add('Timer erstellt');  // <-- nix passiert
   tmr := TTimer.Create(Form1);
   tmrInterval := cInterval;
   tmr.Interval := tmrInterval;
   tmr.OnTimer := tmrOnTimer;
   tmr.Enabled := true;
end;
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mo 05.06.06 22:38 
Dann zeige doch vllcht mal den Code, mit dem du den CLTimer erstellst, oder?

Gruß alias5000

_________________
Programmers never die, they just GOSUB without RETURN
accessViolation Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Mo 05.06.06 22:39 
Sorry, die Ereignisprozedur TForm1.FormCreate war nicht dem OnCreate-Ereignis des Forms zugewiesen (hatte den Code aus einem anderen Projekt rauskopiert)... Jetzt geht's!

Gruß
Dietmar
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mo 05.06.06 22:42 
gut :zwinker:

_________________
Programmers never die, they just GOSUB without RETURN
accessViolation Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Di 06.06.06 09:34 
Oh nein - warum kann ich in meiner Prozedur (tmrOnTimer) nicht auf das Interval (tmrInterval) zugreifen, das ich beim Create gesetzt habe???

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:
type TClTimer = class
   public
     tmr         : TTimer;
     tmrInterval : integer;
     procedure tmrOnTimer(Sender: TObject);
     procedure SetEnabled(Enabled: Boolean);
     constructor Create(cInterval: integer);
end;

{...}

constructor TClTimer.Create(cInterval: integer);
begin
   Form1.memoTimer.Lines.Add('Timer erstellt');
   tmr := TTimer.Create(Form1);
   tmrInterval := cInterval;   // <-- Setzen des Intervalls
   tmr.Interval := tmrInterval;
   tmr.OnTimer := tmrOnTimer;
   tmr.Enabled := false;
end;

procedure TClTimer.SetEnabled(Enabled: Boolean);
begin
   tmr.Enabled := Enabled;
end;

procedure TClTimer.tmrOnTimer(Sender: TObject);
var interv: integer;
begin
    interv := TClTimer(Sender).tmrInterval;   // <-- Versuch, das Intervall auszulesen, liefert aber 0 zurück
    Form1.memoTimer.Lines.Add('Zeit rum: ' + IntToStr(interv));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   cltTest := TClTimer.Create(3000);
   cltTest.SetEnabled(true);
end;
accessViolation Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Di 06.06.06 10:28 
Sorry ich habs: Ich muss in der tmrOnTimer-Prozedur anders auf meine Klasse zugreifen, und zwar so:
interv := Self.tmrInterval;