![]() |
Problem mit dem Zugriff auf klassen
Hi,
ich schreibe grade an einem kleinen Makrorecorder (aber nur für bestimmte tasten, da ich ein kleines programm steuern will) und habe mir dafür erstmal eine Klasse geschrieben, welche ein Makro mit einer Pointerstruktur speichert, hier die klasse, mit prozeduren (welche später probleme machen)
Delphi-Quellcode:
(der rest von der klasse ist erstmal egal).
TMakro = class(TObject)
private Makro, RefTimeStamp, RefAddTimeStamp : PMakroList; RefCommand, RefAddCommand : PCommands; CheckPointCount : Integer; FName : String; procedure FreeMakroList (var Anchor : PMakroList); procedure FreeCommands (var Anchor : PCommands); procedure SetName (NewName : String); public constructor Create; destructor Destroy; property Name: string read FName write SetName; procedure NewMakro; procedure MoveToStart; procedure AddInput (TimeStamp : Integer; Pressed : Boolean; KeyNum : ShortString); procedure AddSpecial (TimeStamp : Integer; SpecialCommand : ShortString); procedure AddCheckPoint (TimeStamp : Integer; CheckPointName : String = ''); procedure SaveToFile (FileName : String); procedure LoadFromFile (FileName : String); end; implementation constructor TMakro.Create; begin inherited Create; Makro := nil; RefAddTimeStamp := nil; RefAddCommand := nil; CheckPointCount := 0; FName := 'Unknown'; end; destructor TMakro.Destroy; begin FreeMakroList (Makro); inherited Destroy; end; procedure TMakro.FreeMakroList (var Anchor : PMakroList); begin if Assigned (Anchor) then begin if Assigned (Anchor.Commands) then FreeCommands (Anchor.Commands); if Assigned (Anchor.Next) then FreeMakroList (Anchor.Next); dispose (Anchor); Anchor := nil; end; end; procedure TMakro.FreeCommands (var Anchor : PCommands); begin if Assigned (Anchor) then begin if Assigned (Anchor.Next) then FreeCommands (Anchor^.Next); dispose (Anchor); Anchor := nil; end; end; procedure TMakro.NewMakro; begin FreeMakroList (Makro); Makro := nil; RefAddTimeStamp := nil; RefAddCommand := nil; CheckPointCount := 0; FName := 'Unknown'; end; Dann habe ich noch eine klasse, welche das aufnehmen des makros übernehmen soll:
Delphi-Quellcode:
Man sieht, das ich im Konstruktor ein Makro vom Typ der ersten Klasse übergeben haben will (hatte es davor mit einem Pointer gehabt, also Create (Makro : PMakro) mit PMakro = ^TMakro, aber mir wurde gesagt das es ohnehin eine Referenz ist wenn ich es übergebe).
TMakroRec = class(TObject)
RecTimer : TTimer; procedure RecTimerProc(Sender: TObject); procedure SetRecording (Recording : Boolean); private Makro : TMakro; FIsRecording : Boolean; TimeStamp : Integer; Pressed : TKeysPressed; public constructor Create (Makro : TMakro); destructor Destroy; property IsRecording : boolean read FIsRecording write SetRecording; procedure ResetMakro; end; implementation constructor TMakroRec.Create (Makro : TMakro); begin inherited Create; RecTimer := TTimer.Create(nil); RecTimer.Interval := 50; RecTimer.OnTimer := RecTimerProc; RecTimer.Enabled := False; end; destructor TMakroRec.Destroy; begin RecTimer.Free; inherited Destroy; end; Nun in meiner Mainunit ist der folgende code:
Delphi-Quellcode:
Das RecMakro.Recording führt in der Klasse TMakroRec folgenden code aus:
Makro := TMakro.Create;
RecMakro := TMakroRec.Create(Makro); RecMakro.Recording := True;
Delphi-Quellcode:
Nun kommt es zu meinerm Problem:
procedure TMakroRec.SetRecording (Recording : Boolean);
begin FIsRecording := Recording; Makro.NewMakro; RecTimer.Enabled := Recording; end; Wenn ich aus TMakroRec eine prozedur in TMakro ausführen will, gibt es an jeder stelle, wo TMakro auf eine eigene Variable zugreifft eine Access Violation. Wenn ich nun NewMakro aufrufe, dann führt es zu einem fehler an dieser Stelle:
Delphi-Quellcode:
Wenn ich aber aus der MainUnit Makro.NewMakro aufrufe funktioniert alles perfekt (alle funktionen tun, was sie sollen, wenn sie aus der MainUnit aufgerufen werden, wenn sie aus TMakroRec aufgerufen werden, gibt es IMMER eine AV, sobald ich irgendwas verändern will)...
procedure TMakro.FreeMakroList (var Anchor : PMakroList);
begin if Assigned (Anchor) then // <<--- HIER KOMMT EINE AV BEI ASSIGNES (ANCHOR) begin if Assigned (Anchor.Commands) then FreeCommands (Anchor.Commands); if Assigned (Anchor.Next) then FreeMakroList (Anchor.Next); dispose (Anchor); Anchor := nil; end; end; Warum ist das so? Ist das erste mal, das ich mit Klassen arbeite, also sorry falls das hier schonmal gefragt war, aber ich finde nichts über google und in meiner Delphi Referenz steht da auch nix zu. Danke! Nidhoegger |
Re: Problem mit dem Zugriff auf klassen
Hallo,
da fehlt die Zuordnung
Delphi-Quellcode:
Um das Self zu umgehen
constructor TMakroRec.Create (Makro : TMakro);
begin inherited Create; RecTimer := TTimer.Create(nil); RecTimer.Interval := 50; RecTimer.OnTimer := RecTimerProc; RecTimer.Enabled := False; Self.Makro:= Makro; //das hier end;
Delphi-Quellcode:
constructor TMakroRec.Create (theMakro : TMakro);
begin inherited Create; RecTimer := TTimer.Create(nil); RecTimer.Interval := 50; RecTimer.OnTimer := RecTimerProc; RecTimer.Enabled := False; Makro:= theMakro; //das hier end; Heiko |
Re: Problem mit dem Zugriff auf klassen
argh -.- immer die kleinen denkfehlerchen, klar, war mal wieder das "wald & bäume" prinzip.
Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz