Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zugriff auf Objekt in TObjectList (https://www.delphipraxis.net/202792-zugriff-auf-objekt-tobjectlist.html)

Ykcim 9. Dez 2019 17:11

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:
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;
Die Procedure Labeling_GlowButtons sieht so aus:
Delphi-Quellcode:
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;
Jetzt habe ich das Problem, dass ich zwar abfragen kann, ob auch 2 Objekte in der ButtonList sind, aber ich kann nicht darauf zugreifen.
Mach ich bei dem Aufruf
Delphi-Quellcode:
(ButtonList.Items[I] as TTMSFNCToolBarButton).Text
etwas falsch?

Ich bekomme immer die Nachricht:
Zitat:

Cannot read property 'FName' of null | TypeError: Cannot read property 'FName' of null at Object.Design_LogIn (http://localhost:8000/NedCom_Web/Ned....js:119472:116) at Create_frmLogIn
Vielen Dank
Patrick

DieDolly 9. Dez 2019 17:17

AW: Zugriff auf Objekt in TObjectList
 
Zitat:

Mach ich bei dem Aufruf (ButtonList.Items[I] as TTMSFNCToolBarButton).Text etwas falsch?
Ich würde die Liste als erstes generisch deklarieren. Dann brauchst du das alles mit
Delphi-Quellcode:
as
nicht mehr.
Delphi-Quellcode:
BList: TObjectList<TTMSFNCToolBarButton>;
Das sieht dann so aus
Delphi-Quellcode:
for i ...
 ButtonList.Items[I].Text :=


Zitat:

Jetzt habe ich das Problem, dass ich zwar abfragen kann, ob auch 2 Objekte in der ButtonList sind, aber ich kann nicht darauf zugreifen.
Ich frage mich, wie du auf die Liste zugreifen willst, wenn du sie in
Delphi-Quellcode:
TDesign.Design_LogIn;
sofort freigibst nachdem sie erstellt wurde
Delphi-Quellcode:
   BList:= TOBjectList.Create;
   Try
      ...
   Finally
      BList:= nil;
   End;
Außerdem gibt man nicht mit
Delphi-Quellcode:
:= nil
frei.

hoika 9. Dez 2019 17:20

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.

Dennis07 9. Dez 2019 17:49

AW: Zugriff auf Objekt in TObjectList
 
Warum benutzt du TObjectList anstelle der generischen TObjectList<T>?
Gibt es dafür einen besonderen Grund?

DieDolly 9. Dez 2019 17:53

AW: Zugriff auf Objekt in TObjectList
 
Zitat:

BList:= nil ersetzen durch BList.Free;
Zitat:

Warum benutzt du TObjectList anstelle der generischen TObjectList<T>?
Ich würde das ganze Konzept noch einmal überarbeiten.

Man schreibt doch nicht Buttons in eine Liste, nur um sie danach wieder freizugeben. Man arbeitet mit der Liste weiter.

Uwe Raabe 9. Dez 2019 17:58

AW: Zugriff auf Objekt in TObjectList
 
Zitat:

Zitat von Dennis07 (Beitrag 1453088)
Warum benutzt du TObjectList anstelle der generischen TObjectList<T>?

Zitat:

Zitat von hoika (Beitrag 1453082)
Aber Vorsicht!!! BList.OwnsObjects:= False vorher nicht vergessen.

Dann doch lieber gleich
Delphi-Quellcode:
TList<T>
, oder?

Dennis07 9. Dez 2019 18:01

AW: Zugriff auf Objekt in TObjectList
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1453093)
Zitat:

Zitat von Dennis07 (Beitrag 1453088)
Warum benutzt du TObjectList anstelle der generischen TObjectList<T>?

Zitat:

Zitat von hoika (Beitrag 1453082)
Aber Vorsicht!!! BList.OwnsObjects:= False vorher nicht vergessen.

Dann doch lieber gleich
Delphi-Quellcode:
TList<T>
, oder?

Ob du lieber eine
Delphi-Quellcode:
TList<TMyObject>
oder eine
Delphi-Quellcode:
TObjectList<TMyObject>
mit
Delphi-Quellcode:
OwnsObjects = False
verwendest, ist Geschmackssache. Ich mache es lieber immer mit
Delphi-Quellcode:
TObjectList<T>
, sofern ich mit Klasseninstanzen arbeite. Aber Das ist nur meine Ansicht. Des Ergebnis ist ja das selbe.

himitsu 9. Dez 2019 18:24

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).

Ykcim 9. Dez 2019 21:36

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:

[Fehler] TDesignUnit.pas(5): can't find unit "Generics.Collections"
Der Gedanke war folgender:
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:
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;
Was bewirkt
Delphi-Quellcode:
BList.OwnsObjects:= False
? Ziehe die Frage zurück...
Zitat:

OwnsObjects gets or sets whether objects in the list are owned by the list or not. If entries are owned, when an entry object is removed from the list, the entry object is freed. Create initializes this property.
Was mache ich bei der Nutzung einer TObjectList falsch?

Wie löst man denn so eine Aufgabe elleganter?

Vielen Dank für Eure Unterstützung!
Patrick

hoika 9. Dez 2019 21:48

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 07:49 Uhr.
Seite 1 von 5  1 23     Letzte »    

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