AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Über dynamischen Namen auf eine Instanz zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

Über dynamischen Namen auf eine Instanz zugreifen

Ein Thema von skyphab · begonnen am 19. Apr 2004 · letzter Beitrag vom 19. Apr 2004
Antwort Antwort
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#1

Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 16:44
Hallo zusammen!

Gibt es eine Möglichkeit, Den Namen eines Objektes dynamisch zusammenzusetzen? Im Grunde genommen suche ich eine Funktion wie FindComponent, nur für Objekte.
Ich habe gewühlt, aber nichts gefunden obwohl ich mir nicht vorstellen kann, dass es sowas nicht gibt
FindComponent scheint etwas anderes zu sein?

Gibt's sowas?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 17:01
Zitat von skyphab:
Gibt es eine Möglichkeit, Den Namen eines Objektes dynamisch zusammenzusetzen? Im Grunde genommen suche ich eine Funktion wie FindComponent, nur für Objekte.
Ich habe gewühlt, aber nichts gefunden obwohl ich mir nicht vorstellen kann, dass es sowas nicht gibt
FindComponent scheint etwas anderes zu sein?
Erst aber der Klasse TComponent (und alle abgeleiteten Klassen) gibt es das Property Name
und erst dann macht FindComponent einen Sinn.
Sag mal was du eigentlich vorhast; häufig kann hier ein Design Pattern (z.B. Observer-Pattern)
die Lösung liefern.
Andreas
  Mit Zitat antworten Zitat
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 17:25
Zitat von shmia:
Zitat von skyphab:
Gibt es eine Möglichkeit, Den Namen eines Objektes dynamisch zusammenzusetzen? Im Grunde genommen suche ich eine Funktion wie FindComponent, nur für Objekte.
Ich habe gewühlt, aber nichts gefunden obwohl ich mir nicht vorstellen kann, dass es sowas nicht gibt
FindComponent scheint etwas anderes zu sein?
Erst aber der Klasse TComponent (und alle abgeleiteten Klassen) gibt es das Property Name
und erst dann macht FindComponent einen Sinn.
Sag mal was du eigentlich vorhast; häufig kann hier ein Design Pattern (z.B. Observer-Pattern)
die Lösung liefern.
FindComponent war nur ein Beispiel, für das was ich suche
Ich will einen Namen als String übergeben und dann mit dem Objekt arbeiten können. Eben wie mit FindComponent.

Z.B. Objekt1, Objekt2, Objekt3: TKlasse

for i := 1 to length(MeinArray) do
(FindeMeinObjekt(MeinArray[i].Name) as TKlasse).Ausführen(MeinArray[i].Nummer);

Sowas in der Art, ich hoffe das ist klarer jetzt. Ich habe die Namen der Objekte und will auf sie zugreifen. Aber wenn ich Objekte zur Laufzeit erstelle (die Namen dynamisch vergebe), brauche ich doch auch etwas, mit dem ich wieder darauf zugreifen kann. Oder geht das nur mit einem Array vom Objekttyp?
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#4

Re: Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 17:36
Das FindComponent für die TComponents kann aus einem simplen Grund funkionieren - alle Komponenten stehen in der Componentenliste ihres Owners. FindComponent sucht also in der Liste einfach nach einer Componente mit dem passenden Namen und gibt diese zurück.

Etwas ähnliches könnte man sich für Objekte aufbauen, indem man einfach jedes neue Objekt in eine TList einträgt die man dann später durchsuchen kann.
Solange der Constructor immer gleich aussieht liesse sich das so realisieren:
Delphi-Quellcode:
type
  TMyObjectClass = class of TObject;
var
  ObjectList: TList;
(..)
function CreateAndRegister(ObjClass: TMyObjectClass): TObject;
begin
  if not Assigned(ObjectList) then
    ObjectList := TList.Create;
  Result := ObjClass.Create;
  ObjectList.Add(Result);
end;

procedure FreeAndNilAndForget(Object: TObject);
var
  Index: Integer;
begin
  if Object <> nil then
  begin
    Index := ObjectList.IndexOf(Object);
    if Index > -1 then
      ObjectList.Delete(Index);
    Object.Free;
    Object := nil;
  end;
end;
Alternativ dazu erweiterst Du den Constructor/Destructor des Objects so das es sich selber ein-und austrägt.

Wie bereits gesagt wurde: Erst wenn man eine gemeinsame Eigenschaft wie z.B. den nmen bei TComponent hat macht diese Liste Sinn, sonst fehlt natürlich das Suchkriterium.

MfG,
Tryer
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 17:48
Wahlweise auch mit TObjectList aus der unit contnr:

Delphi-Quellcode:
var
  ObjectList: TObjectList;

...
ObjectList.ownsObjects := true;
...
ObjectList.remove(obj); // free etc...sparste dir das alles von oben
dann kümmert sich die liste auch automatisch um das freigeben aller und einzelner objekte!
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 20:54
achso. also eine liste mit den objekten, die ich dann über die liste suchen und ansprechen kann.
ich habs so mal probiert und es funktionert. sehr praktisch

nur wie suche ich jetzt in einer liste nach dem namen des objektes um den index zurüzubekommen? bei indexof will er ja ein objekt als mitgabewert. kann ich da den namen casten?

edit: oder muss ich mir die namen in einer separaten liste führen?
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 22:18
Du brauchst eine objektklasse, die eine Name property hat:

Delphi-Quellcode:
type
  TNamedObject = class(TObject);
  private
    FName:string;
  public
    constructor Creat(const aName:string);
    Class function FindInstance(const aName:string):TNamedObject;
    property Name:String read FString write FString;
  end;
   
implementation

uses contnr;

var
  ObjectList: TObjectList;


constructor TName.Creat(const aName:string);
begin
  FName := aName;
  ObjectList.add(self); // selbst verwaltung
end;

Class function FindInstance(const aName:string):TNamedObject;
var i:Integer;
begin
  result := nil;
  for i:= 0 to ObjectList.count-1 do
    if sameText(TNamedObject(ObjectList[i]).FName, aName) then
    begin
      result := TNamedObject(ObjectList[i]);
      exit;
    end;
end;

initialization
  ObjectList:= TObjectList.create; // liste erzeugen
  ObjectList.ownsObjects := true;

finalization
  ObjectList.free; // alle objekte wieder freigeben
end.
Damit hättest du das alles schön in eine klasse gekapselt! Und so arbeitest du damit:

Delphi-Quellcode:
// Neues object erzeugen und der liste anfügen
TNamedObject.create('Peter');

// suchen und finden
objX := TNamedObject.findInstance('Peter');
if objX <> nil then ObjX.doSameMethod; // gefunden
..Habs aus dem kopf geschrieben, desshalb können fehler drinne sein...das prinzip sollte aber deutlich werden
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Über dynamischen Namen auf eine Instanz zugreifen

  Alt 19. Apr 2004, 22:43
ah wunderbar, dankeschön
ich hatte mir fast schon gedacht, dass ich für die klasse eine methode erstellen muss, die den namen ausgibt. ich dachte zu anfangs wirklich, dass es eine delphi-funktion gibt, der ich einfach den string übergebe und sie den rest macht nur leider war dem wohl nicht so

ok wunderbar, dann werde ich das so mal testen. danke nochmal
  Mit Zitat antworten Zitat
Antwort Antwort


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:24 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