AGB  ·  Datenschutz  ·  Impressum  







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

Free eines unbekannten Objektes

Ein Thema von olee · begonnen am 10. Sep 2008 · letzter Beitrag vom 11. Sep 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Free eines unbekannten Objektes

  Alt 10. Sep 2008, 19:24
Zitat von olee:
Das merkwürdige an der ganzen sache ist aber noch, dass selbst wenn ich
Delphi-Quellcode:
  T3DObj(WorldActor).free;
  If T3DObj(WorldActor) <> nil then [...]
benutze gibt "T3DObj(WorldActor) <> nil" true zurück.
Das ist nicht merkwürdig, das ist nur logisch und auch nicht anders machbar, siehe Post #6.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Free eines unbekannten Objektes

  Alt 10. Sep 2008, 19:36
ja aber selbst als ich das hier verwendet habe:
Delphi-Quellcode:
  For i := 0 To Objects.Count - 1 Do
  begin
    T3DObj(Objects[i]).Free;
    Objects[i] := nil;
  end;
aber da fällt mir ein:

Man muss bedenken Objects[i] ist nicht WorldActor aber hat den gleichen wert
Björn Zeutzheim
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Free eines unbekannten Objektes

  Alt 10. Sep 2008, 19:47
Ma ne frage zur TObjectList:

Der gibt mit ObjectList.Items[X] ein TObject zurück.

Muss ich das einfach casten?
Björn Zeutzheim
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Free eines unbekannten Objektes

  Alt 10. Sep 2008, 19:57
Sicher.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
automatix

Registriert seit: 1. Mai 2008
Ort: Remscheid
39 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Free eines unbekannten Objektes

  Alt 11. Sep 2008, 08:19
Hallo!

Dies funktioniert, wie schon geschrieben, nicht.

  TKlasse1(list[i]^).Free; Ich habe es bisher fast immer vermeiden können in Delphi mit Pointern zu arbeiten und muss daher i.d.R. immer erst probieren, wann eine Pointer Dereferenzierung mittel ^ nötig ist und wann nicht.

Ich habe hier mal ein paar Möglichkeiten runtergetippt.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TKlasse1 = class(TObject)
  public
     constructor Create;
    destructor Destroy; override;
  end;

  TKlasse2 = class(TKlasse1)
  public
     constructor Create;
    destructor Destroy; override;
  end;

  TKlasse3 = class(TKlasse2)
  public
     constructor Create;
    destructor Destroy; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
   MAX_OBJ = 5;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   i: Integer;
  list: TList;
begin
   list := nil;
  try
     list := TList.Create;

    for i := 0 to Pred(MAX_OBJ) do begin
      case Random(3) of
      0: list.Add(TKlasse1.Create);
      1: list.Add(TKlasse2.Create);
      2: list.Add(TKlasse3.Create);
      end;
    end;

    // ...

    for i := 0 to Pred(list.Count) do
      TKlasse1(list[i]).Free;
      //(list[i] as TKlasse1).Free;          // Operator ist auf diesen Operandentyp nicht anwendbar
      //(TObject(list[i]) as TKlasse1).Free; // :-)

    MessageDlg('Fertig mit Free', mtInformation, [mbOk], 0);
  finally
    FreeAndNil(list);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   i: Integer;
  list: TObjectList;
begin
   list := nil;
  try
     list := TObjectList.Create;

    for i := 0 to Pred(MAX_OBJ) do begin
      case Random(3) of
      0: list.Add(TKlasse1.Create);
      1: list.Add(TKlasse2.Create);
      2: list.Add(TKlasse3.Create);
      end;
    end;

    // ...

    for i := 0 to Pred(list.Count) do
      TKlasse1(list[i]).Free;                  // Hier sind beide Varianten möglich
      // (list[i] as TKlasse1).Free;

    MessageDlg('Fertig mit Free', mtInformation, [mbOk], 0);
  finally
     // Hier knallt es, weil durch OwnsObjects = True der Destruktor der Liste
    // versucht die schon freigegebenen Objekte noch einmal freizugeben
    FreeAndNil(list);
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
   i: Integer;
  list: TObjectList;
begin
   list := nil;
  try
     list := TObjectList.Create;
    list.OwnsObjects := False;

    for i := 0 to Pred(MAX_OBJ) do begin
      case Random(3) of
      0: list.Add(TKlasse1.Create);
      1: list.Add(TKlasse2.Create);
      2: list.Add(TKlasse3.Create);
      end;
    end;

    // ...

    for i := 0 to Pred(list.Count) do
      TKlasse1(list[i]).Free;                  // Hier sind beide Varianten möglich
      // (list[i] as TKlasse1).Free;

    MessageDlg('Fertig mit Free', mtInformation, [mbOk], 0);
  finally
    FreeAndNil(list);
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
   i: Integer;
  list: TObjectList;
begin
   list := nil;
  try
     list := TObjectList.Create;

    for i := 0 to Pred(MAX_OBJ) do begin
      case Random(3) of
      0: list.Add(TKlasse1.Create);
      1: list.Add(TKlasse2.Create);
      2: list.Add(TKlasse3.Create);
      end;
    end;

    // ...
  finally
    FreeAndNil(list);
  end;
end;

{ TKlasse1 }

constructor TKlasse1.Create;
begin
   inherited Create;
end;

destructor TKlasse1.Destroy;
begin
   MessageDlg('Destruktor Klasse 1', mtInformation, [mbOk], 0);
  inherited Destroy;
end;

{ TKlasse2 }

constructor TKlasse2.Create;
begin
   inherited Create;
end;

destructor TKlasse2.Destroy;
begin
   MessageDlg('Destruktor Klasse 2', mtInformation, [mbOk], 0);
  inherited Destroy;
end;

{ TKlasse3 }

constructor TKlasse3.Create;
begin
   inherited Create;
end;

destructor TKlasse3.Destroy;
begin
   MessageDlg('Destruktor Klasse 3', mtInformation, [mbOk], 0);
  inherited Destroy;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Free eines unbekannten Objektes

  Alt 11. Sep 2008, 08:24
Zitat von olee:
ja aber selbst als ich das hier verwendet habe:
Delphi-Quellcode:
  For i := 0 To Objects.Count - 1 Do
  begin
    T3DObj(Objects[i]).Free;
    Objects[i] := nil;
  end;
aber da fällt mir ein:

Man muss bedenken Objects[i] ist nicht WorldActor aber hat den gleichen wert
Du hast also zwei Referenzen auf ein Objekt. Wie gesagt, die Referenzen musst du per Hand auf nil testen. Aber du solltest eher etwas in deiner Logik verändern. Es geht prinzipiell nicht so wie du möchtest.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Free eines unbekannten Objektes

  Alt 11. Sep 2008, 08:26
Vielleicht hab ich Deine Antwort überlesen, aber warum stellst Du nicht auf TObjectList um? Mit der Property OwnsObjects auf True gibt die automatisch alle angehängten Objekte selber frei sobald sie freigegeben wird.

Sherlock
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Free eines unbekannten Objektes

  Alt 11. Sep 2008, 12:37
Ja das freigeben war ja nicht so richtig das Problem, wie sich herausgestellt hat.

Ich verwende jetzt eine TObjectList,

und das Problem habe ich so gelöst:

Delphi-Quellcode:
  If BEngine.Objects.IndexOf(WorldActor) >= 0 Then
    BEngine.Objects.Delete(BEngine.Objects.IndexOf(WorldActor));
Anstatt
If T3DObj(WorldActor) <> nil then T3DBlock(WorldActor).free; Vielen dank für eure hilfe!
Und vor allem an Sirius, für die Hilfe bei meinem letzten Problem ^^

Das Ergebnis meiner Arbeit kann jetzt hier betrachtet werden.
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 17:49 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