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

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
Seite 1 von 2  1 2   
matashen

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

Record, Array, Class und Schreiben in das Array

  Alt 9. Jul 2024, 14:26
Delphi-Version: 5
Hallo zusammen,

ich steh voll auf den Schlauch und bin mir sicher für einige hier ist das was ich brauche pillepalle. Der Titel ist auch doof aber was besseres fällt mir auch hier nicht ein... und Kaffee ist heute aus

Ich hab ein Record der verkürzt so aussieht

Delphi-Quellcode:
type TProgReleaseItem=record
        ProductID:Integer;
        MachineTypeName:String;
        ProgfieldName:String;
end;
eine Klasse dazu wo dieser Record als array deklariert ist
Delphi-Quellcode:
type TProgRelease=class(TObject)
     strict private
       FItem: TArray<TProgReleaseItem>;
       function getItem(Index:Integer):TProgReleaseItem;
...
       property Item[Index:Integer]:TProgreleaseItem Read GetItem;
wie muss ich den setter schreiben das ich sowas machen kann wie

meinRelease.Item[x].ProductID:='Testeintrag'; Schonmal vielen Dank an euch

Gruß Matthias
Matthias
Das Leben ist eines der härtesten.

Geändert von TBx (10. Jul 2024 um 05:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Record, Array, Class und Schreiben indas Array

  Alt 9. Jul 2024, 14:39
Garnicht.

Es wird beim Zugriff auf einen Property leider immer nur entweder der Getter oder der Setter benutzt.

Da hier auf eine Eigenschaft des Records zugegriffen wird, wird also der Getter benutzt und der Schreibzugriff auf das Record-Feld geht dann in die Kopie des Records (also ins Result des Getter)
und wird anschließend nicht automaisch via Setter zurückgeschrieben. (abgesehn davon, dass du eh keinen Setter hast)

* eine Datenklasse anstatt des Records (kann auch eine zuzätliche Access-Implementation sein, welche ihre Proertyzugriffe auf den Record umleitet)

* das Property als Pointer
property Item[Index:Integer]: PProgreleaseItem Read GetItem;

* den Record mit Property+Setter, wobei der Record vom GetItem einen Zeiger auf TProgRelease mitbekommt, um Änderungen weiterzugeben.

* ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.458 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Record, Array, Class und Schreiben indas Array

  Alt 9. Jul 2024, 14:41
Mit einem Record geht das nicht, es sei denn du verwendest Pointer. Grund: Beim Zugriff auf den Getter bekommst du eine Kopie des Records. Wenn du nun also etwas in den Record schreibst, passiert das in der Kopie, nicht im Original in der Liste.

Das ist mit einer Klasse viel einfacher, denn das ist von Hause aus nur eine Referenz, so dass es sofort funktioniert. Wenn dir die Referenzzählung wichtig ist, der Speicher also automatisch freigegeben werden soll, kannst du auch ein Interface mit der Klasse verwenden.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
matashen

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

AW: Record, Array, Class und Schreiben indas Array

  Alt 10. Jul 2024, 05:10
Also das der Setter fehlt hab ich im Text geschrieben, Zitat: wie muss ich den setter schreiben das ich sowas machen kann wie ...

Wenn das geht als Klasse und ich den Record entsprechend umschreiben muss, kein Problem. Ein kleines Beispiel wär nicht schlecht da ich heute immer noch aufm Schlauch stehe.

Das bei einem Record nur eine Kopie gezogen wird war mir nicht klar. Dachte das auch dort nur intern ein Pointer gesetzt wird. Danke für dir Info.
Matthias
Das Leben ist eines der härtesten.

Geändert von TBx (10. Jul 2024 um 05:19 Uhr) Grund: Full quote entfernt
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.458 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 10. Jul 2024, 08:00
Im einfachsten Fall schreibst du statt record einfach Klasse und du bist was den Zugriff inkl. Schreiben angeht fertig.
Die einzige andere Änderung ist, dass du die Instanzen dann explizit mit Create erstellen musst, sprich FItems[0] := TProgReleaseItem.Create; , aber ich frage mich, ob du das überhaupt so möchtest. Mit dem Array ist das unnötig kompliziert.

Viel einfacher:
Delphi-Quellcode:
uses
  System.Generics.Collections;

type
  TProgReleaseItem = class
  public
    ProductID: Integer;
    MachineTypeName: String;
    ProgfieldName: String;
    constructor Create(AProductID: Integer; AMachineTypeName: String; AProgfieldName: String);
  end;

  TProgRelease = class(TObjectList<TProgReleaseItem>)
  end;

constructor TProgReleaseItem.Create(AProductID: Integer; AMachineTypeName: String; AProgfieldName: String);
begin
  ProductID := AProductID;
  MachineTypeName := AMachineTypeName;
  ProgfieldName := AProgfieldName;
end;

var
  Test: TProgRelease;
begin
  Test := TProgRelease.Create(True);
  try
    Test.Add(TProgReleaseItem.Create(1, '2', '3'));
    DoSomething(Test);
  finally
    Test.Free;
  end;
end;
Natürlich wären ggf. propertys statt einfacher Felder sinnvoller, aber funktionieren tut es so.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (10. Jul 2024 um 08:02 Uhr)
  Mit Zitat antworten Zitat
matashen

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

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

  Alt 10. Jul 2024, 08:42
Hi jaenicke,


generische Listen, danke für den Tip.

hatte ich nicht aufn Schirm.

Ich bau dann mal das um.

Wenn ich in einem ListenItem die einzelnen Records zu propertys ändere noch was beachten, oder reichts wenn ich die Variablen wie üblich ins private schreibe und den getter und setter einfach darauf lege?


Gruß Matthias

PS:
Wärst du nicht so elendig weit weg würd ich dich jetzt aufn Mittagsessen einladen.
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 10. Jul 2024, 08:46
Und wenn das gespeichert werden soll, statt Liste vielleicht eine Collection ... geht auch generisch.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
matashen

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

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

  Alt 10. Jul 2024, 09:15
OK Collection Generisch kenn ich noch nicht - wie funktioniert das? Dachte die Generische Listen vom Beispiel jaenicke wäre eine Collection
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
matashen

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

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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:31 Uhr.
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