Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - SetLength richtig gesetzt?


D. Annies - Di 27.01.09 11:07
Titel: SetLength richtig gesetzt?
Hi, Delpher,

wann und wie muss ich SetLength (allgemein) korrekt setzen?
ist der Code so richtig: [Hab Schiss, ihn so "auszuprobieren"]?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var rx: array of String[3];

procedure Tform1.fuelle_listbox1Kla(sender:tobject);
begin
  listbox1.Clear;
  zk := 0; inh := 'xxx';
  QSchueler.First;  
  while not QSchueler.eof do
  begin
    if (QSchueler.fieldbyname('KLASSE').asstring <> '')  and
       (QSchueler.fieldbyname('KLASSE').asstring <> inh) then
    begin
      listbox1.Items.Add(QSchueler.fieldbyname('KLASSE').asstring);
      inh := QSchueler.fieldbyname('KLASSE').asstring; 
      setlength(rx, zk+1); rx[zk] := inh; inc(zk);         // richtig ??
    end;
    QSchueler.next;
  end;
  listbox1.Visible := true;
end;


Danke für Hilfe/Erklärung,
Detlef


Nersgatt - Di 27.01.09 11:12

Moin,

erstmal solltest Du für jede Anweisung eine neue Zeile im Quellcode anfangen. Ist einfach besser lesbar.
Mit SetLength setzt Du einfach die Länge des Arrays.
Wenn Du SetLength(array, 5) aufrufst, hast Du hinterher ein Array mit 5 Elementen [0..4].

Gruß,
Jens


D. Annies - Di 27.01.09 11:40

Danke, Jens, dann müsste mein Code ja ok sein, oder?
Detlef


JayEff - Di 27.01.09 11:43

*hust* :oops: grade hatte ich einen denkfehler.
Es ist schwer zu lesen, mit 3 Anweisungen in einer Zeile, aber es scheint korrekt zu sein.
Bedenke aber, dass das Aufrufen von SetLength relativ viel Zeit braucht, je nach dem, wie oft deine Schleife durchläuft, wäre es sehr vorteilhaft, SetLength nur einmal aufzurufen. (Einen Unterschied merkt man nicht vor 1000++ Aufrufen, denke ich ;) )
Sollte dir die Arraygröße vorher nicht bekannt sein, vergrößere dein Array vielleicht in Stufen: Erstmal auf 10000 setzen, dann vor dem Füllen abfragen, ob du bereits bei High(myArray) angelagt bist, falls ja, das Array wieder um 10000 vergrößern. Am Ende dann das Array, falls nötig, wieder verkleinern.


Marc. - Di 27.01.09 13:33

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Bedenke aber, dass das Aufrufen von SetLength relativ viel Zeit braucht,

weil der Speicher neu allokiert wird und damit alle(!) Werte erneut ins Array geschrieben werden müssen.


D. Annies - Di 27.01.09 13:57

Danke, ihr zwei!
Detlef