Registriert seit: 2. Apr 2004
Ort: Bonn
2.530 Beiträge
Delphi 11 Alexandria
|
AW: array als var-Parameter
1. Jul 2015, 21:38
Falls es Dir wirklich nur darum geht, immer nur 2-4 Variablen mit einem Funktionsaufruf zu setzen, könntest Du statt einem Array eine Procedure mit Overload verwenden:
An die Overload-Variante habe ich auch schon gedacht. Ich denke aber weiter. Das ganze muss ja nicht nur für Integer funktionieren sondern auch für andere Datentypen. Daher habe ich es dann verworfen.
OK, dann wäre es natürlich hilfreich gewesen, das am Anfang zu erwähnen, Deine Eingangsanforderung lautete nur:
"Ich möchte eine Procedure, die soll mehreren Integer-Variablen den Wert 0 zuweisen."
Aber gut. Um mehrere Datentypen zu bedienen, kann man den Overload- und den Array-Ansatz kombinieren.
Der folgende Vorschlag ist recht kurz in der Implementation, ist skalierbar und Du brauchst kein "@" zu schreiben:
Delphi-Quellcode:
type
TDataTypes = (dtInt, dtStr, dtReal, dtExtended); // bei Bedarf erweitern
procedure vToZ (dt: TDataTypes; var v1, v2); overload;
procedure vToZ (dt: TDataTypes; var v1, v2, v3); overload;
procedure vToZ (dt: TDataTypes; var v1, v2, v3, v4); overload;
implementation
{$R *.dfm}
procedure SetVars(dt: TDataTypes; APointers: Array of Pointer);
var
i: Integer;
begin
for i := Low (APointers) to High(APointers) do
begin
case dt of
dtInt: Integer (APointers[i]^) := 0;
dtStr: String (APointers[i]^) := '';
// .. bei Bedarf weitere Typen
end;
end;
end;
procedure vToZ (dt: TDataTypes; var v1, v2); overload;
begin
SetVars (dt, [@v1, @v2]);
end;
procedure vToZ (dt: TDataTypes; var v1, v2, v3); overload;
begin
SetVars (dt, [@v1, @v2, @v3]);
end;
procedure vToZ (dt: TDataTypes; var v1, v2, v3, v4); overload;
begin
SetVars (dt, [@v1, @v2, @v3, @v4]);
end;
procedure TForm14.FormCreate(Sender: TObject);
var
itest1, itest2, itest3, itest4: Integer;
strtest1, strTest2: string;
begin
iTest1 := 10;
iTest2 := 20;
iTest3 := 30;
iTest4 := 40;
strTest1 := 'Test';
StrTest2 := 'Hallo';
vToZ (dtInt, iTest1,iTest2, iTest4); // Integer
vToZ (dtStr, strTest1, strtest2); // string
ShowMessage (iTest1.ToString); // Zeigt 0
ShowMessage (strTest1); //"zeigt" einen leeren string
end;
Geändert von Harry Stahl ( 1. Jul 2015 um 22:14 Uhr)
|