На ум приходят перегрузка и дженерики:
type
TMyHelper = class
public
class procedure SetLength(var A: String; Len: Double); overload; static;
class procedure SetLength<T>(var A: TArray<T>; Len: Double); overload; static;
class procedure SetLength<T>(var A: TArray<TArray<T>>; Len1, Len2: Double); overload; static;
// as so on...
end;
class procedure TMyHelper.SetLength(var A: String; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength<T>(var A: TArray<T>; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength<T>(var A: TArray<TArray<T>>; Len1, Len2: Double);
var
iLen1, iLen2: Integer;
begin
iLen1 := ...; // round Len1 as needed...
iLen2 := ...; // round Len2 as needed...
System.SetLength(A, iLen1, iLen2);
end;
// and so on...
var
s: string;
a1: TArray<Integer>;
a2: TArray<TArray<String>>;
begin
TMyHelper.SetLength(s, 10);
TMyHelper.SetLength<Integer>(a1, 10);
TMyHelper.SetLength<String>(a2, 5, 10);
end;
If you are using a version of Delphi that does not support Generics, you can't overload on array element types generically, but you can still overload on arrays if the element types you use is limited, eg:
type
TInteger1DimArray = array of Integer;
TInteger2DimArray = array of TInteger1DimArray;
TString1DimArray = array of String;
TString2DimArray = array of TString1DimArray;
// and so on...
TMyHelper = class
public
class procedure SetLength(var A: String; Len: Double); overload; static;
class procedure SetLength(var A: TInteger1DimArray; Len: Double); overload; static;
class procedure SetLength(var A: TInteger2DimArray; Len1, Len2: Double); overload; static;
class procedure SetLength(var A: TString1DimArray; Len: Double); overload; static;
class procedure SetLength(var A: TString2DimArray; Len1, Len2: Double); overload; static;
// as so on...
end;
class procedure TMyHelper.SetLength(var A: String; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength(var A: TInteger1DimArray; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength(var A: TInteger2DimArray; Len1, Len2: Double);
var
iLen1, iLen2: Integer;
begin
iLen1 := ...; // round Len1 as needed...
iLen2 := ...; // round Len2 as needed...
System.SetLength(A, iLen1, iLen2);
end;
class procedure TMyHelper.SetLength(var A: TString1DimArray; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength(var A: TString2DimArray; Len1, Len2: Double);
var
iLen1, iLen2: Integer;
begin
iLen1 := ...; // round Len1 as needed...
iLen2 := ...; // round Len2 as needed...
System.SetLength(A, iLen1, iLen2);
end;
// and so on...
var
s: string;
a1: TInteger1DimArray;
a2: TString2DimArray;
begin
TMyHelper.SetLength(s, 10);
TMyHelper.SetLength(a1, 10);
TMyHelper.SetLength(a2, 5, 10);
end;
As you can see, implementing SetLength()
for a single String
is easy, but implementing SetLength()
for arrays can get quite complex, depending on the type of arrays you use. This solution is about as close as you can get in user code without resorting to RTTI so you can call the RTL's DynArraySetLength()
function directly.
person
Remy Lebeau
schedule
21.06.2016
SetLength/Length
. Поскольку они являются встроенными, перегрузка скроет встроенные функции. Мы были на этом с недавно представленнымLow(string)\High(String)
некоторое время назад. - person LU RD   schedule 21.06.2016MySetLength()
может быть перегружен, одна версия для вводаString
, одна версия для ввода массива.procedure MySetLength(var A: String; Len1: Double); overload; type TWhateverArray = array of Whatever; procedure MySetLength(var A: TWhateverArray; Len1: Double); overload; procedure MySetLength(var A: TWhateverArray; Len1, Len2: Double); overload;
и т.д... - person Remy Lebeau   schedule 21.06.2016MySetLength
выполнима, без сомнения. - person LU RD   schedule 21.06.2016Double
вSetLength
. Поплавки принципиально неуместны в качестве размеров массива, и тот факт, что вы даже рассматриваете это, означает, что вы делаете что-то ужасно неправильное. Возможно, объясните свою настоящую проблему и получите лучшее решение. - person Disillusioned   schedule 22.06.2016