![]() |
Problem mit dynamischem Array of Record
Hallo,
ich erstelle so ein dynamisches Array of Record:
Delphi-Quellcode:
Die Typen sind wie folgt deklariert:
function Tdata.getCatalog(inList : TStringList) : TDocxDocument;
var i : integer; reval : TDocxDocument; begin if workQuery.Active then WorkQuery.Active := false; workQuery.SQL.Clear; workQuery.SQL.Add('SELECT ass.level, ass.article_id, art.name, art.number FROM '); workQuery.SQL.Add('assignments as ass JOIN articles as art ON ass.article_id=art.id WHERE '); workQuery.SQL.Add('ass.id=:id'); for i := 0 to inlist.Count - 1 do begin workQuery.ParamByName('id').AsInteger := StrToInt(inList[i]); workQuery.Open; if not workQuery.IsEmpty then begin reval[i].level := workQuery.FieldByName('level').AsInteger; reval[i].article_id := workQuery.FieldByName('article_id').AsInteger; reval[i].article_name := workQuery.FieldByName('name').AsString; reval[i].article_number := workQuery.FieldByName('number').AsString; end; workQuery.Close; end; SetLength(reval,i); result := reval; end;
Delphi-Quellcode:
Allerdings habe ich Probleme das zurückgegebene Array zu durchlaufen. Habe ich setLength richtig gesetzt?
type TDocxline = record
level : integer; article_id : integer; article_number : string; article_name : string; end; type TDocxDocument = array of TDocxline; Viele Grüße ... |
AW: Problem mit dynamischem Array of Record
Du musst SetLength() aufrufen, bevor Du die Array-Elemente befüllst. Allerdings solltest Du dies aus Performancegründen blockweise tun (z.B. 16 Elemente reservieren, ab dem 17. Datensatz wieder um 16 Elemente vergrößern usw.).
|
AW: Problem mit dynamischem Array of Record
Zitat:
Delphi-Quellcode:
Dann kannst Du über einen Indexer laufen, Elemente mit Add anhängen uvw.
TDocxDocument=TList<TDocxline>
|
AW: Problem mit dynamischem Array of Record
Zitat:
Viele Grüße ... //Edit: erledigt - ![]() |
AW: Problem mit dynamischem Array of Record
Von Daniel sollte es ein paar Videos zu Generics geben.
Und nochmal zu dem Array ... ein Tipp: schalte mal die Breichs- und Überlaufprüfung in den Projektoptionen an ... diese hätten dir sofort mitgeteilt, daß bei dir was nicht stimmt :zwinker: |
AW: Problem mit dynamischem Array of Record
Ich würde aus dem Record eine Klasse machen!
Delphi-Quellcode:
Du siehst, es gibt schon 2 Methoden, die eindeutig der Klasse zuzuordnen ist.
TDocxline = class(Tobject)
public level : integer; article_id : integer; article_number : string; article_name : string; procedure LoadFromDataset(Dataset:TDataset); procedure SaveToDataset(Dataset:TDataset); end; Und es lassen sich bestimmt noch weitere Methoden finden. Record + Funktionen, die mit dem Record arbeiten ==> Klasse. |
AW: Problem mit dynamischem Array of Record
Zitat:
Gruß K-H |
AW: Problem mit dynamischem Array of Record
Zitat:
Das ist die Grundlage von OOP! Es bedeutet, dass ein Programm letztendlich fast ausschlieslich aus Klassen besteht und Records nur noch in Ausnahmefällen (Windows API, Zugriff auf Resourcen ) benützt werden. Man muss nur die Schranken im eigenen Denken einreisen. Eine Liste von TDocxline-Objekten würde man natürlich in einer TObjectList halten (oder man nimmt eine generische Liste). |
AW: Problem mit dynamischem Array of Record
Sein Delphi 2010 bietet aber auch die Möglichkeit von Record-Methoden. :-D
Man muß also nicht immer gleich ein Objekt erstellen, wenn man Methoden darin einbinden will. Und Records bieten eine schöne automatische Speicherverwaltung. Also kein Create und kein Free. (OK, das Free könnte man auch über Interfaces lösen) Meine BigMath-Lib war als Objekte schöner zu lösen. Eben weil kein Create nötig war und auch Records "kopieren" geht einfacher, als ein Objekt zu klonen. Und dann die knuffigen Operatoren. :love: |
AW: Problem mit dynamischem Array of Record
Noch ein Hinweis, auch wenn es sich eventuell schon erledigt hat, aber die Laufvariable einer for-Schleife, ist nach der Schleife nicht definiert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 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