![]() |
AW: Zugriff auf Objekt in TObjectList
Ja, das habe ich auch bemerkt und gerade in der OH gefunden... :oops:
Aber warum kann ich nicht so auf die Objekte zugreifen?
Delphi-Quellcode:
ShowMessage((ButtonList.Items[0] as TTMSFNCToolBarButton).Name); //Ist nur zum Testen
Ich kann sehen, dass zwei Objekte in der Liste vorhanden sind...
Delphi-Quellcode:
ShowMessage('Anzahl Buttons: '+IntToStr(ButtonList.Count));
Das funktioniert auch nicht, wenn ich das "FREE" rausnehme... Das verstehe ich nicht! P.S.: Mit ShowMessages helfe ich mir gerade weiter, weil ich bei einem TMS-WebCore Projekt nicht schrittweise mit dem Debugger arbeiten kann... |
AW: Zugriff auf Objekt in TObjectList
Versuch mal
Delphi-Quellcode:
Generics.Collections.
System.
Zitat:
|
AW: Zugriff auf Objekt in TObjectList
Leider funktioniert das auch nicht. Ich bekomme wieder eine Fehlermeldung:
Zitat:
Zitat:
|
AW: Zugriff auf Objekt in TObjectList
Zitat:
Aber wenn man da was reinpackt und später damit weiterarbeiten will, gebe ich die doch nicht sofort frei. |
AW: Zugriff auf Objekt in TObjectList
Okay, vielleicht habe ich einen Denkfehler:
Delphi-Quellcode:
Und das wäre die Procedure Labeling_GlowButtons:
procedure TDesign.Design_LogIn;
var BList: TObjectList; begin BList:= TOBjectList.Create; //Ich erstelle die Liste Try BList.Add(Form_LogIn.btn_login_abbruch); //Packe die Buttons rein BList.Add(Form_LogIn.btn_login_ok); Labeling_GlowButtons(BList); //Hier verarbeite ich jeden einzelnen Button. Wenn diese Procedure fertig ist, sollen alle Buttons so aussehen, wie definiert und ich brauche die Liste nicht mehr, oder? Finally BList.OwnsObjects:= false; BList.Free; //Ich gebe die Liste wieder frei... End; end;
Delphi-Quellcode:
Ich dachte, damit gebe ich die Liste erst wieder frei, wenn ich sie nicht mehr brauche...
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; //Aber hier klappt der Zugriff nicht... end; end; Gruß Patrick |
AW: Zugriff auf Objekt in TObjectList
Zitat:
Die Unit heißt inzwischen System.Generics.Collections und wenn kein "System" als Default-Namespace definiert wurde, dann wird sie nicht gefunden, außer man schreibt den kompletten Namen. TList = Liste mit beliebigen Zeigern (Pointer, Objekte oder sonstwas, was in einen Pointer/Integer gecastet werden kann) TObjectList = Liste außschließlich mit Objektzeigeren (TObject und Nachfahren) TComponentList = die kennt auch den TComponent-Typen und sein Notify-System (sie lässt sich informieren wenn ein Objekt gelöscht wird und entfernt dann auch das Item) Die generischen TList<TTMSFNCToolBarButton> und TObjectList<TTMSFNCToolBarButton> wie oben, inkl. strikter/impliziter Typisierung.
Delphi-Quellcode:
TObjectList weiß was ein Objekt ist, kann daher auch Free/Destroy aufrufen, wenn ein Item gelöscht wird (wenn Owns=True, z.B. beim List.Delete ... nicht beim List.Extract :zwinker:)
x := ButtonList.Items[0]; // hier kommt der generische Typ raus (x ist er oder dessen Vorfahre)
ButtonList.Items[0].irgendwas // hier ebenso direkt der generische Typ ButtonList.Items[0] := x; // hier geht er rein, nur er und dessen Nachfahren Die Generischen haben den Cast eingebaut, also
Delphi-Quellcode:
statt dem weichen Cast
ButtonList.Items[0].Name
Delphi-Quellcode:
oder des Harten
(ButtonList.Items[0] as TTMSFNCToolBarButton).Name
Delphi-Quellcode:
.
TTMSFNCToolBarButton(ButtonList.Items[0]).Name
Und Default-Property (das default in Bezug auf Array-Property) kann man auch weglassen, weil bei Array-Zugriff implizit zum Default weitergeleitet wird.
Delphi-Quellcode:
bzw.
ButtonList[0].Name
Delphi-Quellcode:
oder
(ButtonList[0] as TTMSFNCToolBarButton).Name
Delphi-Quellcode:
TTMSFNCToolBarButton(ButtonList[0]).Name
|
AW: Zugriff auf Objekt in TObjectList
Hallöle...8-)
Zitat:
Zitat:
Da wir Autovergleiche haben, mache ich das mal mit einem Supermarkt...:stupid:
Delphi-Quellcode:
Dieser Code bedeutet: Du kaufst dir an der Kasse eine Tüte.(Create) Du wirfst die Produkte direkt in die Tüte.(Add). Dann wirfst du die Tüte drauße direkt in den Papierkorb. (Free)
procedure TDesign.Design_LogIn;
var BList: TObjectList; begin BList:= TOBjectList.Create; //Ich erstelle die Liste Try BList.Add(Form_LogIn.btn_login_abbruch); //Packe die Buttons rein BList.Add(Form_LogIn.btn_login_ok); Labeling_GlowButtons(BList); //Hier verarbeite ich jeden einzelnen Button. Wenn diese Procedure fertig ist, sollen alle Buttons so aussehen, wie definiert und ich brauche die Liste nicht mehr, oder? Finally BList.OwnsObjects:= false; BList.Free; //Ich gebe die Liste wieder frei... End; end; Frage: Wieviele Produkte hast jetzt im Auto? :roll: eine der Lösungen:
Delphi-Quellcode:
Mit dieser Lösung behällst du die Liste und die Buttons, und kannst später durch die Liste iterieren. (Nochmaliges Ändern der Properties)
private
FBList:= TList<TTMSFNCToolBarButton>; ... procedure TDesign.Create; begin FBList:= TList<TTMSFNCToolBarButton>.Create; end; procedure TDesign.Destroy; begin FBList.Free; inherited; end; procedure TDesign.Design_LogIn; begin FBList.Add(Form_LogIn.btn_login_abbruch); //Packe die Buttons rein FBList.Add(Form_LogIn.btn_login_ok); Labeling_GlowButtons(FBList); //Hier verarbeite ich jeden einzelnen Button. Wenn diese Procedure fertig ist, sollen alle Buttons so aussehen, wie definiert und ich brauche die Liste nicht mehr, oder? end; :wink: |
AW: Zugriff auf Objekt in TObjectList
Hallo,
Du arbeitest leider viel zu wenig mit lokalen Variablen. (ButtonList.Items[I] as TTMSFNCToolBarButton).Text:= Data_Module.xDST_Sprache.FieldByName((ButtonList.I tems[I] as TTMSFNCToolBarButton).Name).AsString; Vieleicht schlägt ja auch das hier fehl? Data_Module.xDST_Sprache.FieldByName Packe beide Sachen in 2 lokale Variablen! Und dann mache Dein ShowMessage. |
AW: Zugriff auf Objekt in TObjectList
Also z.B. so: (ungetested)
Delphi-Quellcode:
Es geht noch mehr, aber das wäre mal ein erster Schritt, genauer die ersten zwei Schritte.
procedure TDesign.Labeling_GlowButtons(ButtonList: TObjectList);
var I: integer; button: TTMSFNCToolBarButton; bezeichnung : String; begin for I := 0 to ButtonList.Count -1 do begin button := ButtonList.Items[I] as TTMSFNCToolBarButton; bezeichnung := Data_Module.xDST_Sprache.FieldByName(button.Name).AsString button.Text:= bezeichnung; end; end; |
AW: Zugriff auf Objekt in TObjectList
Delphi-Quellcode:
Braucht man diesen Cast, wenn ButtonList generisch ist?
button := ButtonList.Items[I] as TTMSFNCToolBarButton;
Kann ignoriert werden. Im Prozedurkopf steht TObjectList. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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