Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Problem mit dynamischem Array of Record (https://www.delphipraxis.net/156480-problem-mit-dynamischem-array-record.html)

fillibuster 3. Dez 2010 11:55

Problem mit dynamischem Array of Record
 
Hallo,

ich erstelle so ein dynamisches Array of Record:
Delphi-Quellcode:
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;
Die Typen sind wie folgt deklariert:
Delphi-Quellcode:
type TDocxline = record
  level : integer;
  article_id : integer;
  article_number : string;
  article_name  : string;
end;

type
  TDocxDocument = array of TDocxline;
Allerdings habe ich Probleme das zurückgegebene Array zu durchlaufen. Habe ich setLength richtig gesetzt?

Viele Grüße ...

DeddyH 3. Dez 2010 11:59

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

joachimd 3. Dez 2010 12:01

AW: Problem mit dynamischem Array of Record
 
Zitat:

Zitat von fillibuster (Beitrag 1065875)
Delphi-Quellcode:
type TDocxline = record
  level : integer;
  article_id : integer;
  article_number : string;
  article_name  : string;
end;

type
  TDocxDocument = array of TDocxline;

Da Du ja D2010 nutzt, nimm doch besser eine generische Liste:
Delphi-Quellcode:
  TDocxDocument=TList<TDocxline>
Dann kannst Du über einen Indexer laufen, Elemente mit Add anhängen uvw.

fillibuster 3. Dez 2010 12:51

AW: Problem mit dynamischem Array of Record
 
Zitat:

Zitat von joachimd (Beitrag 1065877)
Da Du ja D2010 nutzt, nimm doch besser eine generische Liste:
Delphi-Quellcode:
  TDocxDocument=TList<TDocxline>
Dann kannst Du über einen Indexer laufen, Elemente mit Add anhängen uvw.

Das hört sich gut an. Gibt's da irgendwo nen Beispiel bzw. ein Tutorial zu?

Viele Grüße ...

//Edit: erledigt - http://docwiki.embarcadero.com/CodeE...t_%28Delphi%29

himitsu 3. Dez 2010 13:06

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:

shmia 3. Dez 2010 15:08

AW: Problem mit dynamischem Array of Record
 
Ich würde aus dem Record eine Klasse machen!
Delphi-Quellcode:
TDocxline = class(Tobject)
public
  level : integer;
  article_id : integer;
  article_number : string;
  article_name : string;

  procedure LoadFromDataset(Dataset:TDataset);
  procedure SaveToDataset(Dataset:TDataset);
end;
Du siehst, es gibt schon 2 Methoden, die eindeutig der Klasse zuzuordnen ist.
Und es lassen sich bestimmt noch weitere Methoden finden.

Record + Funktionen, die mit dem Record arbeiten ==> Klasse.

p80286 3. Dez 2010 15:53

AW: Problem mit dynamischem Array of Record
 
Zitat:

Zitat von shmia (Beitrag 1065936)
Ich würde aus dem Record eine Klasse machen!

Ich würde einen TList-Abkömmling daraus machen, oder ist die Idee zu abwegig?

Gruß
K-H

shmia 3. Dez 2010 17:44

AW: Problem mit dynamischem Array of Record
 
Zitat:

Zitat von p80286 (Beitrag 1065944)
Ich würde einen TList-Abkömmling daraus machen, oder ist die Idee zu abwegig?

Ein Record, auf den bestimmte Operationen angewendet werden schreit danach "Bitte mach mich zur Klasse".
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).

himitsu 3. Dez 2010 18:12

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:

Luckie 4. Dez 2010 02:27

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

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