Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit dem Zugriff auf klassen (https://www.delphipraxis.net/135706-problem-mit-dem-zugriff-auf-klassen.html)

Hybrid666 16. Jun 2009 11:33


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:
  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

hoika 16. Jun 2009 11:37

Re: Problem mit dem Zugriff auf klassen
 
Hallo,

da fehlt die Zuordnung


Delphi-Quellcode:
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;
Um das Self zu umgehen

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

Hybrid666 16. Jun 2009 11:51

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 13:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz