Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Dynamisches Array in Prozeduraufruf


Kulmi - Fr 18.07.03 12:33
Titel: Dynamisches Array in Prozeduraufruf
Hallo!

Ich habe folgendes Problem:

Mein Programm hat zwei Klassen. In KlasseA soll folgendes passieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure KlasseA.test;
var einArray : Array of String;

begin
   fueller := Klasse2.create();
   fueller.arrayFuellen(einArray);
end;


In der zweiten Klasse brauche ich folglich eine Prozedur, die dem dynamischen Array eine Länge zuweist und es anschließend füllt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Klasse2.arrayFuellen(anArray: Array of String);
var i : Integer;

begin
  {Datenbankabfrage vorbereiten und ausführen}
  ...

  SetLength(anArray, query1.fieldCount);

  for i := 0 to (Query1.fieldCount) do
  begin
    anArray[i] := Query1.fields.Fields[i].AsString;
  end;


Die Anweisung setLength in der zweiten Klasse löst allerdings beim kompilieren den Fehler 'inkompatible Typen' aus. Hat jemand eine Lösung zu dem Problem?

Gruß,

Kulmi

PS: Editiert um die zweite Prozedur nachzuliefern, sorry...


Simon Joker - Fr 18.07.03 12:46

Hi Kulmi

erstmal Willkommen im Forum!

Trotzdem, wie wäre es mit der Deklaration der Klassenmethode "ArrayFuellen", meine seherischen Fähigkeiten sind eher begrenzt.

Fürs Allgemeine:
Um Arrays an Proceduren oder Functionen zu übergeben verwende ich IMMER einen Typ des Arrays. Zweitens muß dieser Parameter als var übergeben werden.
Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type 
  TDynStrArray : array of string;

...

procedure FillStrArray(var Arr:TDynStrArray; L:Longword)
begin
...
  SetLength(Arr,L);
...
end;

//Aufruf
var StrArr:TDynStrArray;
begin
  FillStrArray(StrArr,10);
end;


Kulmi - Fr 18.07.03 14:29

Wenn ich den Typen verwende, klappt es - vielen Dank für die schnelle Hilfe!

Wäre allerdings nett, wenn mir jemand erklären könnte, warum es dann funktioniert und vorher nicht (Code sollte nun vollständig sein).

Kulmi


Taurin - Sa 19.07.03 14:59

In Delphi übergibt man Funktionen/Proceduren nur einfache Typen, die nur aus einem Bezeichner bestehen. Wenn du einen anderen Typen (zB array of string oder file of byte ....) benutzen willst, definiere dir einfach deinen eigenen Typ (siehe oben).

Das ist einfach eine Spracheigenheit von Delphi.