Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Instanz einer Klasse identifizieren?! (https://www.delphipraxis.net/62291-instanz-einer-klasse-identifizieren.html)

maddin4u 3. Feb 2006 12:00

Re: Instanz einer Klasse identifizieren?!
 
Hallo

Erstmal Vielen Dank. Ich habe jetzt noch ein bisschen rumprobiert und mir folgedes überlegt.

Delphi-Quellcode:
unit Unit2;

interface

type
  TArray = array [1..10] of string;
  TTest = class
    private
    public
      class procedure Add(ID: integer; text: string);
      class function Read(ID: integer): string;
    end;

var
  MeinArray: TArray;

implementation

class procedure TTest.Add(ID: integer; text: string);
begin
  MeinArray[ID]:= text;
  // An dieser Stelle könnte dann ja auch sowas stehen wie
  // MeinArray[ID].Create('Test') ... Wenn das Array von einem von mir wiederrum
  // selbst erstellten Typ z. B. TTest ist mit constructor
end;

class function TTest.Read(ID: integer): string;
begin
  result:= MeinArray[ID];

end;

end.
Ich habe mir dadurch ale eine Klasse geschaffen, ähnlich wie die TObjectList, die meine Elemente aufnimmt. Ich habe dort jetzt auch eine globale Variable, aber damit könnte ich erstmal leben. Allerdings stellt sich dann die Frage ob ich dort folgendes:

Delphi-Quellcode:
{$WRITEABLECONST ON}
var
  MeinArray: TArray;
{$WRITEABLECONST OFF}
von NicoDE benutzen kann?

Oder hat mein obiger Code überhaut irgendeinen Nachteil?

Vielen Dank?

sh17 3. Feb 2006 12:21

Re: Instanz einer Klasse identifizieren?!
 
Zitat:

Zitat von maddin4u
Oder hat mein obiger Code überhaut irgendeinen Nachteil?

Es passen nur 10 Objekte rein
Du musst Dich um die Freigabe der Objekte im Array selbst kümmern

Khabarakh 3. Feb 2006 12:35

Re: Instanz einer Klasse identifizieren?!
 
Du kannst die Sichtbarkeit der Variablen noch verringern.
Delphi-Quellcode:
implementation

var
  MeinArray: TArray;
// Sichtbarkeit = restliche Unit
Zitat:

Zitat von maddin4u
Ich habe mir dadurch ale eine Klasse geschaffen, ähnlich wie die TObjectList, die meine Elemente aufnimmt. Ich habe dort jetzt auch eine globale Variable, aber damit könnte ich erstmal leben. Allerdings stellt sich dann die Frage ob ich dort folgendes:

Delphi-Quellcode:
{$WRITEABLECONST ON}
var
  MeinArray: TArray;
{$WRITEABLECONST OFF}
von NicoDE benutzen kann?

Erstmal muss es natürlich const heißen. Den Trick kannst du aber bei deinem Code nicht anwenden, da ja nicht nur eine Methode auf das Array zugreift. Wenn du aber, wie Der_Unwissende oben schon geschrieben hat, das Array als Feld in der Factory-Klasse deklarierst, hast du keine globale Variable, du benötigst aber natürlich eine Instanz der Klasse. Wenn du nur eine brauchst, kannst du das Singleton-Pattern verwenden, mit obigem Code sogar ohne globale Variable.

Der_Unwissende 3. Feb 2006 13:10

Re: Instanz einer Klasse identifizieren?!
 
So toll auch Arrays sind, für eine Struktur Variabler Länge sind sie völlig ungeeignet. Natürlich kann man sich jetzt totdiskutieren, das Listen und Bäume häufig auch nur auf Arrays aufsetzen, aber die sind ja auch schon gekapselt. Am einfachsten ist es für die wirklich auf eine Liste zurueckzugreifen. Und siehe da, die TObjectList unterstützt sogar den wahlfreien Zugriff über .items[x] auf das x-te Element.

Gruß Der Unwissende

maddin4u 7. Feb 2006 11:23

Re: Instanz einer Klasse identifizieren?!
 
Hi.

Ich habe jetzt alles soweit erfolgreich mit TObjectList gelöst.

Eine Sache funktioniert bloß noch nicht und zwar eine Instanz wieder löschen.

Dazu habe ich mir jetzt statt GetItemById eine Prozedur RemoveItemByID "gebastelt":

Delphi-Quellcode:
procedure TTestObjectList.RemoveItemByID(_ID: integer);
var
  Objekt: TTest;
  i: integer;
begin
  Objekt:= nil;
  for i := 0 to Count-1 do
  if Items[i].ID = _ID then
  begin
    Objekt:= Items[i];
    Objekt.Free;
    // HIER nach tritt eine Exception auf. Ist eigentlich auch klar. Da es das Objekt ja nicht mehr gibt
    // aber ist es auch schon aus der TObjectList verschwunden?
    Remove(Items[i]);
    exit;
  end;
end;
Wie kann ich die Instanz der Klasse und den "Eintrag" in die TObjectList erfolgreich löschen?

Thx!

Der_Unwissende 7. Feb 2006 18:16

Re: Instanz einer Klasse identifizieren?!
 
Nun ja,
schau mal in die Hilfe von Delphi
Zitat:

Zitat von OH
Die Methode Remove löscht das angegebene Objekt aus der Liste und gibt das Objekt frei (falls OwnsObjects auf true gesetzt ist).

Oder lösch das Objekt nach dem Extrahieren
Delphi-Quellcode:
procedure TTestObjectList.RemoveItemByID(_ID: integer);
var
  Objekt: TTest;
  i: integer;
begin
  Objekt := nil; // nicht nötig
  for i := 0 to Count - 1 do
    begin
      if Items[i].ID = _ID then
        begin
          Objekt := Items.Extract(Items[i]);
          Objekt.Free;
          break;
        end;
    end;
end;

maddin4u 7. Feb 2006 19:37

Re: Instanz einer Klasse identifizieren?!
 
Thx! Klappt wunderbar mit Extract.

sh17 8. Feb 2006 05:40

Re: Instanz einer Klasse identifizieren?!
 
Delete(i) funktioniert auch. Die gibt das Objekt gleich frei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr.
Seite 2 von 2     12   

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