Einzelnen Beitrag anzeigen

Benutzerbild von overmoon
overmoon

Registriert seit: 8. Aug 2003
Ort: Passau
51 Beiträge
 
Delphi 6 Personal
 
#5

Re: Bei einer Funktion <string or dynamic array> überg

  Alt 26. Sep 2003, 14:54
Das Stichwort
Zitat:
"untypisierte Parameter" (stichwort im Hilfe-Index)
hat mir ein bisschen weitergeholfen. Ich könnte nämlich einen Header der Methode dann nach folgendem Muster aufbauen:
function Testing(var Target; Length, ElementSize: Integer):Boolean; Length ist in diesem Fall die Länge des Arrays und ElementSize die Größe eines ArrayElementes. Auf diese Weise könnte ich mit dem Array arbeiten und machen, was ich möchte. Schon mal gar nicht so schlecht.

Das Problem ist nun aber, dass ich die Länge des Arrays und die Größe eines Array-Elementes übergeben muss. Ich muss sie übergeben, weil weder Length() noch SetLength() auf Target in der Funktion anwendbar sind.

Nagut, eines von beiden kann ich aussparen, da SizeOf() auch auf Target anwendbar ist. Wenn ich also die Gesamtgröße habe, und Length ODER Elementsize übergeben werden, dann kann ich damit das fehlende ausrechnen, da gilt: Gesamtgröße = Length * ElementSize.

Schöner wäre es aber, wenn ich nichts dergleichen übergeben müsste; bei Length() ist das ja schließlich auch nicht der Fall !

Und übrigens:
Wenn man im Code SetLength( schreibt, dann öffnet sich eine nette kleine Hilfebox, die mir folgendes sagt:
Zitat:
var S: <string or dynamic array>; NewLength: Integer
Normalerweise stehen dort die zulässigen Typen. Und wenn die Funktion überladen wäre, dann in mehreren Zeilen; wie z.B. bei IntToStr()
Zitat:
Value: Integer;
Value: Int64;
Das bei Length() keine überladene Funktion vorliegt, das erkennt man auch daran, dass man auch einen neuen Typen deklarieren kann und sie funktioniert trotz alledem.

Z.B:
Delphi-Quellcode:
Type TmyNew = record
     Eins: Byte;
     Zwei: Integer;
End;

Type TMyNewArray = array of array of TmyNew;
Dann funktioniert folgendes:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var b: array of TmyNewArray;
     Huhu: Integer;
begin
     SetLength(b,5);
     Huhu := Length(b);
end;
Bei einer überladenen Funktion würde das nicht gehen. Man muss die Funktion dann entsprechend noch mal für den entsprechenden Typ überladen. Das ist aber nicht so gut. Außerdem geht es ja auch anders.

Es MUSS also irgendwie gehen !
Nur wie ??

Variante Arrays habe ich auch schon probiert. Also derart:
Delphi-Quellcode:
Procedure Testing(var MyArray: array of const);

Bzw.

Procedure Testing(var MyArray: array of TvarRec);
(Ist ja beides das selbe.)

Hier gibt es aber auch ein paar „Probleme“.

1.) Muss ich jedes Array, welches ich übergeben möchte zunächst in ein TVarRec Array umwandeln.

Ich kann z.B. nicht ein „array of integer“ übergeben, sondern muss dieses erst umwandeln.

2.) Bei einem „Array of array of Integer” ist die Funktion bereits erledigt. Length() und SetLength() übrigens nicht.


Wenn ich richtig Variants benutze, dann geht das natürlich. Und (fast) alle Probleme wären gelöst.

Also derart:
Delphi-Quellcode:
V: Variant;
...
V := VarArrayCreate([0,9], varInteger);
Hier könnte ich statt varInteger natürlich auch varVarinat angeben und so könnte ich beliebig Dimensionale Arrays übergeben, mit denen ich dann arbeiten kann und die ich dann in der ersten Ebene vertauschen kann. Soweit wunderbar.

Nur: Ich müsste dann komplett mit Variants arbeiten; und so schön ist das nicht, aber: Es würde tatsächlich funktionieren.

Trotzdem:

Es geht auch anders. Siehe SetLength() und Lenght() .

Nur wie ??
"Habe Mut, dich deines eigenen Verstandes zu bedienen." (Immanuel Kant)
  Mit Zitat antworten Zitat