Hallo zusammen,
ich übergebe einer Prozedur ein leeres dynamisches Array, welche das mit Daten füllen soll. Allerdings scheitert es schon bei SetLength leider.
// Übergabe Array mit Daten füllen
procedure TDBKostenkontrolle.GetPListe(var argListe: array of recPosten);
var
iCount: integer;
begin
for iCount:= 0 to Length(PListe)-1 do
begin
SetLength(argListe, Length(argListe)+1);
argListe[High(argListe)].rBetrag:= PListe[iCount].rBetrag;
argListe[High(argListe)].sBezeichnung:= PListe[iCount].sBezeichnung;
end;
end;
Weiß jemand, wie ich die Größe des dynamischen Arrays ändern kann?
// Übergabe Array mit Daten füllen
procedure TDBKostenkontrolle.GetPListe(var argListe: array of recPosten);
var
iCount: integer;
begin
// Alten Inhalt löschen
SetLength(argListe,0);
// Neu länge kalkulieren und setzen
// SetLength ist relativ teuer in der Ausführung
SetLength(argListe, Length(PListe));
for iCount:= 0 to Length(PListe)-1 do
begin
argListe[High(argListe)].rBetrag:= PListe[iCount].rBetrag;
argListe[High(argListe)].sBezeichnung:= PListe[iCount].sBezeichnung;
end;
end;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Im Hauptprogramm ja, also wo diese Prozedur aufgerufen wird.
Bei SetLength erhalte ich die Fehlermeldung "Type mismatch".
Die Variante außerhalb der Schleife schon die Länge festzulegen finde ich gut. Bin da garnicht drauf gekommen.
Das hier hab ich noch vergessen zu erwähnen, vielleicht hilft das als Zusatzinfo zu "Type mismatch"
type
recPosten = record
sBezeichnung: string;
rBetrag: real;
end;
Das ist kein (dyn.) Array, das ist nur der Record. Sowas hätte ich erwartet: argListe = array of recPosten; Falls du argListe = array[0..100] of recPosten hast, so ist das nicht dynamisch.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
das ist etwas unglücklich gelöst bei FreePascal. Du musst den Übergabeparameter als eigenen Typ definieren, dann funktioniert es. Mit "array of" direkt in der Parameterliste erwartet der Kompiler ein konstantes Array.
type
recPosten = record
sBezeichnung: string;
rBetrag: real;
end;
DefArgListe = array of recPosten;
So sieht nun meine Lösung aus. Ich hatte das Problem schonmal, aber war zu lange her und habe das vergessen.
Ich danke euch trotzdem für eure Antworten.
Naja, jede Sprache hat halt so ihre Eigenheiten.
procedure TDBKostenkontrolle.GetPListe(var argListe: array of recPosten);
Hiermit deklarierst du einen sogenannten "open array" Parameter. Bei einem solchen kannst du die Länge nicht beeinflussen, nur den Inhalt (wenn du var oder out verwendest).
Für ein dynamisches Array musst du entweder den Typ explizit definieren oder du nimmst den generischen Typ TArray<T> als Hilfe: