Einzelnen Beitrag anzeigen

Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#11

Re: Handling von Objekten (vom Typ TObject)

  Alt 24. Jun 2008, 07:25
Hey, ich bin es doch noch mal. Mir sind beim Debuggen nun doch noch eine Menge Sachen aufgefallen. Und folgendes hatte ich beim ersten Mal überlesen:

Zitat von Christian Seehase:
Um solche Probleme zu umgehen, sollte man nie Objekte als Rückgabewert einer Funktion verwenden, da dann immer das Problem besteht, die Freigabe korrekt zu positionieren.
Ich habe auf Delphi-Treff ein Tutorial über Objekte und TObjectList gefunden (Link) und das verwendet auch Objekte als Rückgabewerte. Ich zeige euch am besten Mal meinen Code, den ich so aufgebaut habe (ist jetzt mal ein Testprogramm, um euch meine Fragen besser zu zeigen):

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Contnrs;

type TMarke = (maOpel, maVW, maAudi, maMercedes);

type
  TAuto = class(TObject)
    Marke : TMarke;
    Modell : String;
    Baujahr : Integer;
  end;

type
  TAutoSammlung = class(TObjectlist)
   protected
     function getCar(Index: Cardinal) : TAuto; virtual;
     procedure setCar(Index: Cardinal; Auto : TAuto); virtual;
   public
     function AddAuto(Auto: TAuto): Cardinal; virtual;
     function RemoveAuto(Auto: TAuto): Cardinal; virtual;
     function GetAuto(Auto: TAuto): Cardinal; virtual;
     procedure InsertAuto(Index: Cardinal; Auto: TAuto); virtual;
     property Items[index: Cardinal]: TAuto read getCar write setCar;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    autoSammlung : TAutoSammlung;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TAutoSammlung.getCar(Index: Cardinal): TAuto;
begin
  Result := TAuto(inherited Items[Index]);
end;

procedure TAutoSammlung.setCar(Index: Cardinal; Auto: TAuto);
begin
  inherited Items[Index] := Auto;
end;

function TAutoSammlung.AddAuto(Auto: TAuto): Cardinal;
begin
  Result := inherited Add(Auto);
end;

function TAutoSammlung.RemoveAuto(Auto: TAuto): Cardinal;
begin
  Result := inherited Remove(Auto);
end;

function TAutoSammlung.GetAuto(Auto: TAuto): Cardinal;
begin
  Result := inherited IndexOf(Auto);
end;

procedure TAutoSammlung.InsertAuto(Index: Cardinal; Auto: TAuto);
begin
  inherited Insert(Index, Auto);
end;


procedure TForm1.FormCreate(Sender: TObject);
var newCar : TAuto;
begin
  autoSammlung := TAutoSammlung.Create;

  newCar := TAuto.Create;
  newCar.Marke := maOpel;
  newCar.Modell := 'Astra';
  newCar.Baujahr := 1995;
  autoSammlung.AddAuto(newCar);

  newCar.Marke := maAudi;
  newCar.Modell := 'TT';
  newCar.Baujahr := 2001;
  autoSammlung.AddAuto(newCar);

end;

end.
Das Eintragen klappt hier, dennoch sind mir folgende Dinge aufgefallen:
1.) Wenn ich im Debug-Modus über autoSammlung gehe, bekomme ich keine Einträge angezeigt, sondern ein ().
2.) Links im Fenster "Lokale Variablen" (ist ja ein Debugfenster) steht z.B. bei Sender: E2117 Auf Variable Sender kann wegen Optimierung nicht zugegriffen werden. Ich habe das in meinem richtigen Projekt auch bei den Properties wie z.B. "Marke". Woher kommt das?
3.) Oder ist das vielleicht normal, dass der Debugger diese Informationen nicht so anzeigen kann, wie ich mir das vielleicht denke (also, dass ich die in autoSammlung gepackten Objekte zur Laufzeit sehen kann)?
  Mit Zitat antworten Zitat