![]() |
Zugriff auf Objekt in TObjectList
Hallo Zusammen,
Ich möchte in einer Design-Klasse einige Buttons mit Text versehen. Diesen Text hole ich mir vorher aus der DB. Ich möchte der Procedure eine TObjectList mitgeben, damit dann alle Buttons der Liste mit dem Caption versehen werden. Durch googln habe ich folgende Procedure geschrieben:
Delphi-Quellcode:
Die Procedure Labeling_GlowButtons sieht so aus:
procedure TDesign.Design_LogIn;
var BList: TObjectList; begin BList:= TOBjectList.Create; Try BList.Add(Form_LogIn.btn_login_abbruch); BList.Add(Form_LogIn.btn_login_ok); Labeling_GlowButtons(BList); Finally BList:= nil; End; end;
Delphi-Quellcode:
Jetzt habe ich das Problem, dass ich zwar abfragen kann, ob auch 2 Objekte in der ButtonList sind, aber ich kann nicht darauf zugreifen.
procedure TDesign.Labeling_GlowButtons(ButtonList: TObjectList);
var I: integer; begin for I := 0 to ButtonList.Count -1 do begin (ButtonList.Items[I] as TTMSFNCToolBarButton).Text:= Data_Module.xDST_Sprache.FieldByName((ButtonList.Items[I] as TTMSFNCToolBarButton).Name).AsString; end; end; Mach ich bei dem Aufruf
Delphi-Quellcode:
etwas falsch?
(ButtonList.Items[I] as TTMSFNCToolBarButton).Text
Ich bekomme immer die Nachricht: Zitat:
Patrick |
AW: Zugriff auf Objekt in TObjectList
Zitat:
Delphi-Quellcode:
nicht mehr.
as
Delphi-Quellcode:
Das sieht dann so aus
BList: TObjectList<TTMSFNCToolBarButton>;
Delphi-Quellcode:
for i ...
ButtonList.Items[I].Text := Zitat:
Delphi-Quellcode:
sofort freigibst nachdem sie erstellt wurde
TDesign.Design_LogIn;
Delphi-Quellcode:
Außerdem gibt man nicht mit
BList:= TOBjectList.Create;
Try ... Finally BList:= nil; End;
Delphi-Quellcode:
frei.
:= nil
|
AW: Zugriff auf Objekt in TObjectList
Hallo,
ButtonList.Items[I].ClassName oder TObject(ButtonList.Items[I]).Name Was ergibt das? BList:= nil ersetzen durch BList.Free; Aber Vorsicht!!! BList.OwnsObjects:= False vorher nicht vergessen. Ausserdem würde ich mit einer lokalen Variable arbeiten (MyButton oder so), das macht das Debuggen leichter. |
AW: Zugriff auf Objekt in TObjectList
Warum benutzt du TObjectList anstelle der generischen TObjectList<T>?
Gibt es dafür einen besonderen Grund? |
AW: Zugriff auf Objekt in TObjectList
Zitat:
Zitat:
Man schreibt doch nicht Buttons in eine Liste, nur um sie danach wieder freizugeben. Man arbeitet mit der Liste weiter. |
AW: Zugriff auf Objekt in TObjectList
Zitat:
Zitat:
Delphi-Quellcode:
, oder?
TList<T>
|
AW: Zugriff auf Objekt in TObjectList
Zitat:
Delphi-Quellcode:
oder eine
TList<TMyObject>
Delphi-Quellcode:
mit
TObjectList<TMyObject>
Delphi-Quellcode:
verwendest, ist Geschmackssache. Ich mache es lieber immer mit
OwnsObjects = False
Delphi-Quellcode:
, sofern ich mit Klasseninstanzen arbeite. Aber Das ist nur meine Ansicht. Des Ergebnis ist ja das selbe.
TObjectList<T>
|
AW: Zugriff auf Objekt in TObjectList
Jupp, die generischen Listen haben den Vorteil, dass hier automatisch der Cast eingebaut ist, also Items direkt den richtigen Typ liefert.
Eine TComponentList hat für TComponents (alles auf der Form) auch einige Vorteile, denn wird die Komponente freigegeben (.Free), dann löscht sie sich selbstständig aus der Liste heraus. (List.Delete wird beim Free ausgelöst) Die generische TList<T> im NextGen (Android/iOS) kann dort auch Week-Referenzen verwenden und dann wird dann Items auf nil gesetzt, wenn die Komponente extern freigegeben wird (Free). |
AW: Zugriff auf Objekt in TObjectList
Hallo Zusammen,
vielen Dank für die vielen guten Anregungen. Ich habe zuvor noch nie mit einer TObjectList gearbeitet und habe daher davon keine wirkliche Ahnung. Ich habe gerade versucht Generics.Collections in meine uses einzufügen. Ich habe noch nicht erwähnt, dass ich das Projekt gerade als Web-Application mit TMS-WebCore umsetzen möchte. Da scheinen die Generics.Collections nicht unterstützt zu werden. Der Compiler meckert: Zitat:
Ich schreibe ein Programm, dass auf unterschiedlichen Forms immer wieder diese Art von Buttons haben wird (TTMSFNCToolBarButton) Ich möchte die Captions aus einer DB-Tabelle befüllen. Dazu möchte ich in der Design-klasse, eine eigene Unit, eine Procedure schreiben, der ich bei Bedarf diese Buttons übergebe, das entsprechende Design vornehme (hier gerade nur das Caption, später aber auch noch andere Einstellungen) und dann die Liste wieder freigebe.
Delphi-Quellcode:
Was bewirkt
procedure TDesign.Design_LogIn;
var BList: TObjectList<TTMSFNCToolBarButton>; // Ist das generisch? Das akzeptiert der Compiler nicht... begin BList:= TOBjectList.Create; Try BList.Add(Form_LogIn.btn_login_abbruch); BList.Add(Form_LogIn.btn_login_ok); Labeling_GlowButtons(BList); //Wenn hier die Design-Arbeiten abgeschlossen sind, brauche ich die Liste nicht mehr. Finally BList:= nil; // Wenn ich free genommen habe, waren die Buttons zur Laufzeit von dem Form entfernt... End; end;
Delphi-Quellcode:
? Ziehe die Frage zurück...
BList.OwnsObjects:= False
Zitat:
Wie löst man denn so eine Aufgabe elleganter? Vielen Dank für Eure Unterstützung! Patrick |
AW: Zugriff auf Objekt in TObjectList
Hallo,
ohne das OwnsObjects=False passiert folgendes BList:= TOBjectList.Create; Try BList.Add(Form_LogIn.btn_login_abbruch); Finally BList.Free; Freigabe des Buttons Form_LogIn.btn_login_abbruch -> Form_LogIn.btn_login_abbruch.free wie das aussieht??? Vielleicht ist der Abbruch-Button nicht mehr sichtbar? -> Ausprobieren ;) end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 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 by Thomas Breitkreuz