![]() |
Problem mit Klasse (in Klasse)
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:
SetPeg macht eigentlich nix anderes als
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;
Delphi-Quellcode:
Für GetPeg im Prinzip nur umgekehrt.
peg:=newPeg;
Die Klasse TPeg sieht so aus:
Delphi-Quellcode:
Auch hier dient Get/SetCode nur zum Setzen und Auslesen des private-Wertes.
type
TPeg = class private code: integer; public function GetCode: integer; procedure SetCode(newCode: integer); end; Jetzt zum eigentlichen Hauptproblem: Ich erstelle in dem Array 64 Instanzen von TField:
Delphi-Quellcode:
Macht euch um i,j und k mal keine Gedanken, das stimmt alles so.
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; Jetzt der Kern des Problems:
Delphi-Quellcode:
So, dachte ich mir, müsste es aussehen. Es geht leider gar nicht!
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; 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:
Wie unschwer zu erkennen ist, habe ich dann nachher sozusagen 64x NeueFigur erschaffen und kein einziges Mal freigegeben.
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; 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 |
Re: Problem mit Klasse (in Klasse)
(1) private Variable in KLassen sollten mit einem F beginnen
(2) es sollte so aussehen
Delphi-Quellcode:
Zugriff
type
TPeg = class private FCode: integer; function GetCode: integer; procedure SetCode(newCode: integer); public property Code: integer read GetCode write SetCode; //oder wenn in GetCode nichts weiter gemacht wird ausser Result := FCode // geht bei SetCode auch! property Code: integer read FCode write SetCode; end;
Delphi-Quellcode:
(3) in TField ebenso
NeueFigur.Code:=strtoint(StrArr[j])
(4) natürlich muss du für jedes Feld eine neue Instanz erzeugen, sonst hättest Du nur eine Klasse und würdest mit jeder Variablenänderung dies in allen TPeg erhalten (5) ich würde es allerdings so machen:
Delphi-Quellcode:
type
TPeg = class private FCode: integer; public property Code: integer read FCode write FCode; procedure Assign (ASource (TPeg); end; procedure TPeg.Assgin; begin FCode := ASource.FCode; end; TField = class(TPanel) private FPeg: TPeg; VPos: integer; HPos: char; Image: TImage; orgColor: TColor; procedure setPeg(NewPeg: TPeg); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure init(); procedure setPos(h:Char; v: integer); procedure HighlightField(state:integer); procedure SetNewPeg (ACode: integer); //alternativ end; constructor TField.Create(AOwner: TComponent); begin ... FPeg := TPeg.Create; end; destructor TField.Destroy; override; begin FPeg.Free; ... end; procedure TField.SetPeg(NewPeg: TPeg); begin FPeg.Assign (NewPeg); end; procedure SetNewPegCode (ACode: integer); //alternativ begin FPeg.Code := Value; end; |
Re: Problem mit Klasse (in Klasse)
Ist doch ganz einfach:
Objekte sind Pointer. Du machst also folgendes:
Delphi-Quellcode:
Merkst du was ? Du gibst am Ende das Objekt frei, af das die Klassen im Array nacher nochg zugreifen möchten.
MyObject := TObject.Create; // Ein Objekt erstellen
for i := 0 to 100 do MyOtherObject.setObject (Myobject); // Jedem Objekt diesen Pointer geben MyObject.Free;// Dieses Objekt freigeben Du müsstest das .Free weglassen, und stattdessen FreeAndNil (FObj) im destzructor von TField aufrufen. ;) jfheins Ups, wo war der rote Kasten ... :gruebel: |
Re: Problem mit Klasse (in Klasse)
Hallo!
Vielen Dank für eure Hilfe. Jetzt geht es. Ciao Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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