AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit dynamischem Array of Record

Ein Thema von fillibuster · begonnen am 3. Dez 2010 · letzter Beitrag vom 6. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#1

Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 11:55
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 11:59
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.).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 12:01
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:
  TDocxDocument=TList<TDocxline> Dann kannst Du über einen Indexer laufen, Elemente mit Add anhängen uvw.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 12:51
Da Du ja D2010 nutzt, nimm doch besser eine generische Liste:
  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

Geändert von fillibuster ( 3. Dez 2010 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit dynamischem Array of Record

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

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

AW: Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 15:08
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 15:53
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 17:44
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).
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit dynamischem Array of Record

  Alt 3. Dez 2010, 18:12
Sein Delphi 2010 bietet aber auch die Möglichkeit von Record-Methoden.

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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Problem mit dynamischem Array of Record

  Alt 4. Dez 2010, 02:27
Noch ein Hinweis, auch wenn es sich eventuell schon erledigt hat, aber die Laufvariable einer for-Schleife, ist nach der Schleife nicht definiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:35 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