Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Instanzen einer Klasse (https://www.delphipraxis.net/9899-instanzen-einer-klasse.html)

mickmack 7. Okt 2003 13:02


Instanzen einer Klasse
 
Hallo zusammen,

gibt es eine Möglichkeit herauszufinden, welche Instanz meine Klasse aufgerufen hat?

Danke

sakura 7. Okt 2003 13:03

Re: Instanzen einer Klasse
 
Was genau meinst Du :gruebel:

...:cat:...

mickmack 7. Okt 2003 14:35

Re: Instanzen einer Klasse
 
Folgendes:
Delphi-Quellcode:
  TMyBeispiel = class
                 bespielString : String;
                 bespielIntetger: Integer;
                 function rechnen (beispielInteger:Integer): Integer;
                end;

  var test1, test2 : TMyBeispiel;

  procedure TFrmMain.FormCreate(Sender: TObject);
  begin
   test1:= TMYBeispiel.create;
   test2:= TMyBeispiel.create;
  end;
 
  //Diese Function, soll je nachdem von welcher Instanz sie aufgerufen wurde mit 2 oder 3 
   multiplizieren
  function TMyBeispiel.rechnen(beispielInteger:Integer): Integer;
  begin
   //wenn von Instanz test1 aufgerufen dann multpliziere mit 2
   //sonst wenn von instanz test2 aufgerufen mit 3 
  end;
Dieses Beispiel vereinfacht mein Problem sehr stark. Es stellt nur halt nur ein anschauliches Bespiel dar.

Zusammengefasst möchte ich gerne wissen, ob ich irgendwie aus den RTTI den Namen der aufrufenden Instanz auslesen kann.
Ansonsten würde mir nur einfallen der KLasse ein Attribut "Name" hinzuzufügen, und dieses über den constructor zu mit dem Namen der jeweiligen Instanz zu füllen.

Delphianer 7. Okt 2003 14:40

Re: Instanzen einer Klasse
 
Hallo,

ist mir nichts bekannt. Aus dem Grund wird auch bei den Komponenten der VCL immer Owner und Parent mitgeführt.

Viele Grüße

SirThornberry 7. Okt 2003 14:41

Re: Instanzen einer Klasse
 
die funktion rechnen wie folgt abändern
function rechnen (Sender:TMyBeispiel; beispielInteger:Integer): Integer;

und dann halt in der funktion fragen ob Sender = test1 oder test2 ist

mickmack 7. Okt 2003 15:49

Re: Instanzen einer Klasse
 
Schon mal herzlichen Dank für die Antwort, aber eines ist mir noch nicht ganz klar, muss ich von einer bestimmten Klasse TObject oder TComponent ableiten, damit ich Sender benutzen kann? Oder wie initialisiere ich Sender?

Christian Seehase 7. Okt 2003 16:32

Re: Instanzen einer Klasse
 
Moin MickMack,

leite einfach von TObject ab, und führe selber eine Eigenschaft Name ein, die Du im Konstruktor mit angibst.
Selbst dynamisch erzeugte Komponenten (von TComponent abgeleitet) erhalten nicht automatisch einen Namen. Den muss man selber angeben (und verwalten um doppelte zu verhindern).
Um Dir die Verwaltung zu vereinfachen könntest Du noch eine weitere Klasse erstellen, die dann eine Liste der Objekte der eigentlichen Klasse enthält, und für eine Korrekte Namensvergabe zuständig ist.
Die könnte dann die Eigenschaft Name auf 'NeuerName'+IntToStr(LaufendeNummer) setzen.
Um die Abfrage zu erleichtern (vor allem aber schneller zu machen) könntest Du natürlich auch gleich, statt des Namens, ein numerisches Feld für die Unterscheidung vorsehen.

Für den zweiten Fall mal ein kleines Beispiel:

Delphi-Quellcode:
type
  TTestSub = class(TObject)
  private
    FiInstance : integer;
  public
    function rechnen (beispielInteger:Integer): Integer;
    property Instance : integer read FiInstance write FiInstance;
  end;

  TTestMain = class(TObject)
  private
    FList : TList;
  public
    constructor Create;
    destructor Destroy; override;
    function Add : TTestSub;
  end;

implementation

{$R *.DFM}

function TTestMain.Add : TTestSub;
begin
  Result := TTestSub.Create;
  FList.Add(Result);
  Result.Instance := FList.Count;
end;

constructor TTestMain.Create;
begin
  inherited;
  FList := TList.Create;
end;

destructor TTestMain.Destroy;

var
  i : integer;

begin
  for i := 0 to FList.Count-1 do begin
    TTestSub(FList.Items[i]).Free;
  end;
  FreeAndNil(FList);
  inherited;
end;

function TTestSub.rechnen(beispielInteger: Integer): Integer;
begin
  Result := self.Instance*beispielInteger;
end;

procedure TForm1.Button1Click(Sender: TObject);

var
  tm : TTestMain;
  tc1 : TTestSub;
  tc2 : TTestSub;

begin
  tm := TTestMain.Create;
  try
    tc1 := tm.Add;
    tc2 := tm.Add;
    ShowMessage(IntToStr(tc1.Rechnen(3)));
    ShowMessage(IntToStr(tc2.Rechnen(3)));
  finally
    FreeAndNil(tm);
  end;
end;

SirThornberry 7. Okt 2003 17:26

Re: Instanzen einer Klasse
 
wofür einen Namen?? man kann doch auch "if Sender = test1" abfragen und nicht nur "if sender.name = 'test1'"
und der aufruf der funktion muss duruch die componente oder was es ist selbst erfolten und bei Sender halt "self" (für den fall von Tcomponent) einsetzen... naja, du wirst das schon hinn bekommen.

Honie 7. Okt 2003 18:49

Re: Instanzen einer Klasse
 
Hi,

schonmal folgendes versucht (innerhalb der Methode)?


Delphi-Quellcode:
if self = test1 then ... // *2
if self = test2 then ... // *3
.. nur so'ne Idee ....

neolithos 7. Okt 2003 19:11

Re: Instanzen einer Klasse
 
:warn: Was über globale Variablen und ihre gefahr. :warn:

http://www.delphipraxis.net/internal...ct.php?t=10064

Leide doch die Klasse ab oder lege den Wert als Parameter fest.
Aber Programmiert nicht so eine sch**** ( :kotz: ) wie...
Zitat:

Zitat von Honie
Delphi-Quellcode:
if self = test1 then ... // *2
if self = test2 then ... // *3

Das hat nix mit guten P-Stil zu tun. :warn:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 Uhr.
Seite 1 von 2  1 2      

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