AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit dem Zugriff auf klassen

Ein Thema von Hybrid666 · begonnen am 16. Jun 2009 · letzter Beitrag vom 16. Jun 2009
Antwort Antwort
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#1

Problem mit dem Zugriff auf klassen

  Alt 16. Jun 2009, 12:33
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Problem mit dem Zugriff auf klassen

  Alt 16. Jun 2009, 12:37
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
Heiko
  Mit Zitat antworten Zitat
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#3

Re: Problem mit dem Zugriff auf klassen

  Alt 16. Jun 2009, 12:51
argh -.- immer die kleinen denkfehlerchen, klar, war mal wieder das "wald & bäume" prinzip.

Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 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