Hi!
Ich versuche, das ganze mal so gut es geht zu beschreiben und hoffe, dass ich mich verständlich ausdrücken kann.
Ich habe eine Klasse TField, abgeleitet von TPanel. Im Hauptprogramm gibt es ein Array[0..63] of TField. Das Arbeiten damit hat auch super geklappt. Ich hatte einige neue Eigenschaften eingeführt etc, ging alles sehr gut.
Daneben habe ich eine weitere Klasse TPeg. Ich habe jetzt in der Klasse TField folgendes stehen:
Delphi-Quellcode:
TField = class(TPanel)
private
Peg: TPeg;
VPos: integer;
HPos: char;
Image: TImage;
orgColor: TColor;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure init();
procedure setPeg(NewPeg: TPeg);
procedure setPos(h:Char; v: integer);
function getPeg: TPeg;
procedure HighlightField(state:integer);
end;
SetPeg macht eigentlich nix anderes als
peg:=newPeg;
Für GetPeg im Prinzip nur umgekehrt.
Die Klasse TPeg sieht so aus:
Delphi-Quellcode:
type
TPeg = class
private
code: integer;
public
function GetCode: integer;
procedure SetCode(newCode: integer);
end;
Auch hier dient Get/SetCode nur zum Setzen und Auslesen des private-Wertes.
Jetzt zum eigentlichen Hauptproblem:
Ich erstelle in dem Array 64 Instanzen von TField:
Delphi-Quellcode:
procedure TForm1.CreatePlayField;
var i,j,k: integer;
begin
k:=0;
for i:=0 to 7 do
begin
for j:=0 to 7 do
begin
PlayField[i+j+k]:=TField.Create(PnlPlayField);
PlayField[i+j+k].Parent:=PnlPlayField;
end;
inc(k,7);
end;
end;
Macht euch um i,j und k mal keine Gedanken, das stimmt alles so.
Jetzt der Kern des Problems:
Delphi-Quellcode:
procedure TForm1.InitPlayField(dat: String);
var
s: TStringlist;
i,j,k: integer;
strarr: TStringDynArray;
neuefigur: TPeg;
begin
neueFigur:=tpeg.Create;
s:=TStringList.Create;
s.LoadFromFile(dat);
k:=0;
for i:=0 to 7 do
begin
Explode(StrArr,';', S[i]);
for j:=0 to 7 do
begin
NeueFigur.SetCode:=strtoint(StrArr[j])
PlayField[i+j+k].SetPeg(NeueFigur);
PlayField[i+j+k].init;
end;
inc(k,7);
end;
s.free;
neueFigur.Free;
end;
So, dachte ich mir, müsste es aussehen. Es geht leider gar nicht!
Der Code-Wert von Peg in den einzelnen Instanzen enthält falsche Werte, es kommt zu einer
Access Violation beim Beenden des Programms.
Ich habe dann mit Trial&Error herrausgefunden, wie es geht:
Delphi-Quellcode:
procedure TForm1.InitPlayField(dat: String);
var
s: TStringlist;
i,j,k: integer;
strarr: TStringDynArray;
neuefigur: TPeg;
begin
s:=TStringList.Create;
s.LoadFromFile(dat);
k:=0;
for i:=0 to 7 do
begin
Explode(StrArr,';', S[i]);
for j:=0 to 7 do
begin
==> neueFigur:=tpeg.Create;
NeueFigur.SetCode:=strtoint(StrArr[j])
PlayField[i+j+k].SetPeg(NeueFigur);
PlayField[i+j+k].init;
end;
inc(k,7);
end;
s.free;
end;
Wie unschwer zu erkennen ist, habe ich dann nachher sozusagen 64x NeueFigur erschaffen und kein einziges Mal freigegeben.
Paradoxerweise gibt es dann keine Accessvioaltion und auch alle Werte stimmen.
Das kann aber nicht des Rätsels Lösung sein, oder?
Ich hoffe, ihr konntet mein Problem nachvollziehen und mir helfen. Danke.
Ciao Frederic