AGB  ·  Datenschutz  ·  Impressum  







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

Instanz einer Klasse identifizieren?!

Ein Thema von maddin4u · begonnen am 2. Feb 2006 · letzter Beitrag vom 8. Feb 2006
Antwort Antwort
Seite 2 von 2     12   
maddin4u

Registriert seit: 24. Mär 2004
38 Beiträge
 
#11

Re: Instanz einer Klasse identifizieren?!

  Alt 3. Feb 2006, 12:00
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?
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.594 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Instanz einer Klasse identifizieren?!

  Alt 3. Feb 2006, 12:21
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
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#13

Re: Instanz einer Klasse identifizieren?!

  Alt 3. Feb 2006, 12:35
Du kannst die Sichtbarkeit der Variablen noch verringern.
Delphi-Quellcode:
implementation

var
  MeinArray: TArray;
// Sichtbarkeit = restliche Unit
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#14

Re: Instanz einer Klasse identifizieren?!

  Alt 3. Feb 2006, 13:10
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
  Mit Zitat antworten Zitat
maddin4u

Registriert seit: 24. Mär 2004
38 Beiträge
 
#15

Re: Instanz einer Klasse identifizieren?!

  Alt 7. Feb 2006, 11:23
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!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#16

Re: Instanz einer Klasse identifizieren?!

  Alt 7. Feb 2006, 18:16
Nun ja,
schau mal in die Hilfe von Delphi
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;
  Mit Zitat antworten Zitat
maddin4u

Registriert seit: 24. Mär 2004
38 Beiträge
 
#17

Re: Instanz einer Klasse identifizieren?!

  Alt 7. Feb 2006, 19:37
Thx! Klappt wunderbar mit Extract.
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.594 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Instanz einer Klasse identifizieren?!

  Alt 8. Feb 2006, 05:40
Delete(i) funktioniert auch. Die gibt das Objekt gleich frei.
Sven Harazim
--
  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 22:28 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