Autor |
Beitrag |
accessViolation
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: Mo 05.06.06 15:10
Hallo!
Ich habe eine - für Euch sicherlich einfache - Frage:
Ich erstelle mir eine Klasse (TClTimer):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| 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:
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.
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 Gausi: Code- durch Delphi-Tags ersetzt
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Mo 05.06.06 15:13
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 
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: Mo 05.06.06 20:16
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| type TClTimer = class public tmr : TTimer; tmrInterval : integer; procedure tmrOnTimer(); class procedure Create(cInterval: integer); 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 Gausi: Code- durch Delphi-Tags ersetzt
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Mo 05.06.06 20:38
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| 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 
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| 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
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: Mo 05.06.06 21:34
accessViolation hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| 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 
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: Mo 05.06.06 22:07
Wie ihr doch recht habt... Danke.
Sorry, aber warum löst dann der Timer nicht 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:
| 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
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: 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 
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| constructor TClTimer.Create(cInterval: integer); begin Form1.memoTimer.Lines.Add('Timer erstellt'); tmr := TTimer.Create(Form1); tmrInterval := cInterval; tmr.Interval := tmrInterval; tmr.OnTimer := tmrOnTimer; tmr.Enabled := true; end; |
|
|
alias5000
      
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)
|
Verfasst: 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 
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: 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
      
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)
|
Verfasst: Mo 05.06.06 22:42
gut 
_________________ Programmers never die, they just GOSUB without RETURN
|
|
accessViolation 
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: 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???
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; 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; Form1.memoTimer.Lines.Add('Zeit rum: ' + IntToStr(interv)); end;
procedure TForm1.FormCreate(Sender: TObject); begin cltTest := TClTimer.Create(3000); cltTest.SetEnabled(true); end; |
|
|
accessViolation 
      
Beiträge: 68
Win
Delphi 5 Enterpr.
|
Verfasst: 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;
|
|