AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Record, Array, Class und Schreiben in das Array
Thema durchsuchen
Ansicht
Themen-Optionen

Record, Array, Class und Schreiben in das Array

Ein Thema von matashen · begonnen am 9. Jul 2024 · letzter Beitrag vom 11. Jul 2024
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

AW: Record, Array, Class und Schreiben in das Array

  Alt 10. Jul 2024, 09:39
Collections sind auch Listen, also prinzipiell.

Bei der TCollection ist es aber grundsätzlich so, dass immer nur ein Typ in der "Liste" steckt.
Bei den TList, und vor allem bei der generischen TList<>, können auch Nachfahren der Item-Klasse drin stecken.

Die Collection und ihre Items sind auch so gestaltet, dass sie automatisch serialisiert wird. (also selbst oder z.B. im DFM-Reader/Writer)
Und beim Ändern der Größe der Liste wird die Item-Instanz ebenfalls automatisch verwaltet.

Also erstmal wie OwnsObjects bei der TObjectList bzw. TList<>, wird es freigegeben, aber auch beim Hinzufügen, wird die Item-Instanz automatisch erstellt.
Und es gibt einen Default-PropertyEditor für den FormDesigner, um dort Collections zu bearbeiten. (die Items vieler VCL-Komponenten, wie z.B. Actions, ButtonsGroups, Gestures, Grids, Skia, Taskbars uvm.)

Für die VCL, wenn ausschließlich über den FormDesigner bearbeitet, da ist das generische nicht.
Soll die Liste/Collection vom Code aus bearbeitet werden, dann ist eine manuelle Ableitung oder eine Generische, halt sehr hilfreich, da grundsätzlich keine Casts nötig sind und immer der entsprechende Item-Typ aus den Property und Methoden der Liste kommt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
483 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Record, Array, Class und Schreiben in das Array

  Alt 11. Jul 2024, 09:51
Guten Morgen DP,

hab jetzt den Code umgeschrieben von Record auf Class, leider kommen die Daten in der Liste nicht an, abweichend zu jaenicke habe ich nicht beim Item.Create die ganzen Variablen übergeben sondern ein Item erstellt, befüllt und dann per Add hinzugefügt. Es wird auch ein Item erstellt zumindest geht der Count hoch, aber der Inhalt ist dann leer. Muss ich wirjklich im Create des Items die Variablen schreiben, dachte das geht automatisch. Hab auch gegoogelt und dieses Beispiel sieht ziemlich nach meiner Anwendungaus.
https://www.codersblog.de/generische-listen-in-delphi/

Code Teile zusammenkopiert

Delphi-Quellcode:
type TProgReleaseItemClass=Class
      public
        ProductID:Integer;
        MachineTypeName:String;
        ProgfieldName:String;
     
End;
erweitert um einen Index - brauch ich für spätere Funktionen
Delphi-Quellcode:
type TProgReleaseclass=class(TObjectlist<TProgreleaseItemClass>)
       private
          FSelectedItem:Integer;
       public
       property ItemIndex:Integer read FSelectedItem write FSelectedItem;

end;

var ReleaseSteps:TProgreleaseClass;
      myitem:TProgreleaseitemClass;

...
Releasesteps:=TProgreleaseClass.Create(true);
...
myitem:=TProgreleaseitemClass.create;
myitem.ProductID:=1234;
myitem.MachineTypeName:='Wunschkiste';
myitem.ProgfieldName:='Test';

releasesteps.add(myitem);
myitem.Free;
und dann versuche ich Daten raus zu lesen, bekomm aber nichts da ich

Gruß Matthias
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#3

AW: Record, Array, Class und Schreiben in das Array

  Alt 11. Jul 2024, 09:59
Was passiert?
Delphi-Quellcode:
Releasesteps:=TProgreleaseClass.Create(true); //True = Liste ist Eigentümer der Items

myitem:=TProgreleaseitemClass.create; // erzeugen Item
releasesteps.add(myitem); // Item in Liste
myitem.Free; // Item wegwerfen ... auch auch aus der Liste. Die hällt nur dem Pointer auf das Objekt.


PS: Müßte eine Zugriffsverletzung geben beim "Free" der Liste, weil der Poiner in der Liste schon freigegeben ist.
PS: Dein Code ist schwierig zu lesen wegen der ungewöhnlichen Einrückung und der ungewöhnlichen Groß/Kleinschreibung.

Geändert von haentschman (11. Jul 2024 um 10:06 Uhr)
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
483 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Record, Array, Class und Schreiben in das Array

  Alt 11. Jul 2024, 10:34
Zitat:
PS: Müßte eine Zugriffsverletzung geben beim "Free" der Liste, weil der Poiner in der Liste schon freigegeben ist.
ja, hab das mit den Pointer vermutet

mir hilft aber dann auch kein

progrelease.items[0]:=myitem, denn dann wird ja auch nur der Pointer verschoben wenn ich das richtig verstehe. also doch im add die Werte in das Item schreiben - schade hatte gehofft es geht einfacher


Zitat:
PS: Dein Code ist schwierig zu lesen wegen der ungewöhnlichen Einrückung und der ungewöhnlichen Groß/Kleinschreibung.
Für die Profis unter euch brauchts halt ein Handicap das es nicht zu luschi ist

Danke für die Erklärung.
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#5

AW: Record, Array, Class und Schreiben in das Array

  Alt 11. Jul 2024, 10:37
Lass das myItem.Free weg.
Delphi-Quellcode:
type
  TProgReleaseclass = class(TObjectlist<TProgreleaseItemClass>)
  //private
  // FSelectedItem:Integer;
  //public
  // property ItemIndex:Integer read FSelectedItem write FSelectedItem;
  // nicht nötig weil die Liste das kennt

end;

var
  ReleaseSteps: TProgreleaseClass;
  myItem: TProgreleaseitemClass;

  myObject: TProgreleaseitemClass; // anderes Objekt
...
Releasesteps := TProgreleaseClass.Create(True);
try
  myItem := TProgreleaseitemClass.Create;
  myItem.ProductID := 1234;
  myItem.MachineTypeName := 'Wunschkiste';
  myItem.ProgfieldName := 'Test';
  Releasesteps.Add(myItem);

  myObject := Releasesteps[0]; // Index aus der Liste
  myObject.MachineTypeName := 'Bla';

  // [B]myItem[/B] ist das gleiche wie [B]myObject[/B] weil der gleiche Pointer aus der Liste
finally
  Releasesteps.Free; // Alle Items werden feigegeben
end;

Geändert von haentschman (11. Jul 2024 um 10:56 Uhr)
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
483 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Record, Array, Class und Schreiben in das Array

  Alt 11. Jul 2024, 10:42
Das heist beim Freigeben der gesamten Liste wirds dann automatisch mit weggeballert??
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#7

AW: Record, Array, Class und Schreiben in das Array

  Alt 11. Jul 2024, 10:55
Zitat:
Das heist beim Freigeben der gesamten Liste wirds dann automatisch mit weggeballert?
...ja wenn der Owner des Objektes die Liste ist. Beim Erzeugen der Liste gibst du das an. http://docwiki.embarcadero.com/Libra...ectList.Create
Delphi-Quellcode:
Releasesteps := TProgreleaseClass.Create(True); // True = Liste ist Owner
...
PS: Bei einer TObjectlist<> ist der Owner standardmäßig immer True. Deshalb reicht auch Releasesteps := TProgreleaseClass.Create;

Geändert von haentschman (12. Jul 2024 um 05:30 Uhr)
  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 06: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