![]() |
Über dynamischen Namen auf eine Instanz zugreifen
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 :gruebel: FindComponent scheint etwas anderes zu sein? Gibt's sowas? |
Re: Über dynamischen Namen auf eine Instanz zugreifen
Zitat:
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. |
Re: Über dynamischen Namen auf eine Instanz zugreifen
Zitat:
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? |
Re: Über dynamischen Namen auf eine Instanz zugreifen
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:
Alternativ dazu erweiterst Du den Constructor/Destructor des Objects so das es sich selber ein-und austrägt.
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; 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 |
Re: Über dynamischen Namen auf eine Instanz zugreifen
Wahlweise auch mit TObjectList aus der unit contnr:
Delphi-Quellcode:
dann kümmert sich die liste auch automatisch um das freigeben aller und einzelner objekte!
var
ObjectList: TObjectList; ... ObjectList.ownsObjects := true; ... ObjectList.remove(obj); // free etc...sparste dir das alles von oben |
Re: Über dynamischen Namen auf eine Instanz zugreifen
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? :gruebel: edit: oder muss ich mir die namen in einer separaten liste führen? |
Re: Über dynamischen Namen auf eine Instanz zugreifen
Du brauchst eine objektklasse, die eine Name property hat:
Delphi-Quellcode:
Damit hättest du das alles schön in eine klasse gekapselt! Und so arbeitest du damit:
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.
Delphi-Quellcode:
..Habs aus dem kopf geschrieben, desshalb können fehler drinne sein...das prinzip sollte aber deutlich werden :-D
// 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 |
Re: Über dynamischen Namen auf eine Instanz zugreifen
ah wunderbar, dankeschön :-D
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 :thuimb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
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