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:
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;
(der rest von der klasse ist erstmal egal).
Dann habe ich noch eine klasse, welche das aufnehmen des makros übernehmen soll:
Delphi-Quellcode:
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;
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).
Nun in meiner Mainunit ist der folgende code:
Delphi-Quellcode:
Makro := TMakro.Create;
RecMakro := TMakroRec.Create(Makro);
RecMakro.Recording := True;
Das RecMakro.Recording führt in der Klasse TMakroRec folgenden code aus:
Delphi-Quellcode:
procedure TMakroRec.SetRecording (Recording : Boolean);
begin
FIsRecording := Recording;
Makro.NewMakro;
RecTimer.Enabled := Recording;
end;
Nun kommt es zu meinerm Problem:
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:
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;
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)...
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