AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit Klasse (in Klasse)

Ein Thema von fkerber · begonnen am 26. Mai 2005 · letzter Beitrag vom 27. Mai 2005
Antwort Antwort
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

Problem mit Klasse (in Klasse)

  Alt 26. Mai 2005, 23:33
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
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Problem mit Klasse (in Klasse)

  Alt 27. Mai 2005, 05:50
(1) private Variable in KLassen sollten mit einem F beginnen
(2) es sollte so aussehen
Delphi-Quellcode:
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;
Zugriff
  NeueFigur.Code:=strtoint(StrArr[j]) (3) in TField ebenso
(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;
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: Problem mit Klasse (in Klasse)

  Alt 27. Mai 2005, 05:56
Ist doch ganz einfach:

Objekte sind Pointer.

Du machst also folgendes:
Delphi-Quellcode:
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
Merkst du was ? Du gibst am Ende das Objekt frei, af das die Klassen im Array nacher nochg zugreifen möchten.

Du müsstest das .Free weglassen, und stattdessen FreeAndNil (FObj) im destzructor von TField aufrufen.

jfheins

Ups, wo war der rote Kasten ...
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#4

Re: Problem mit Klasse (in Klasse)

  Alt 27. Mai 2005, 07:34
Hallo!

Vielen Dank für eure Hilfe.
Jetzt geht es.

Ciao Frederic
Frederic Kerber
  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 02:32 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