16.11.2010, 13:25
|
Прохожий
|
|
Регистрация: 17.10.2010
Сообщения: 35
Репутация: 10
|
|
теперь можно написать что-то вроде:
Код:
function f1 (anArgs: array of const) : String;
var
I : Integer;
begin
Result := '';
for I := Low (anArgs) to High (anArgs) do
Result := Format ('%s:%s',[ Result, ParamToStr (anArgs [i]) ]);
end;
function f2 (anArgs: array of const) : String;
begin
Result := f1 ( ArrayOfConstMerge (anArgs,['test','testtest','yo-ho','hi-hi','laaa']) );
end;
function arrays (anArgs: array of const) : String;
var
I : Integer;
P : PArrayOfConst;
begin
Result := '';
for I := Low (anArgs) to High (anArgs) do
begin
P := ParamToPointer (anArgs [i]);
if Assigned (P) then
Result := Format ('%s;%s',[ Result, f1 ( PointerToArrayOfConst (P) ) ])
else
Result := Format ('%s;%s',[ Result, ParamToStr (anArgs [i]) ]);
end;
end;
Код:
s := arrays ( [ 'a', ArrayOfConstToPointer (['hello','world','test1']), 1, ArrayOfConstToPointer (['test2','test3']), ArrayOfConstToPointer ([]) ] );
должно получиться:
;a;:hello:world:test1;1;:test2:test3;0
проблема в определении размера массива по указателю на него:
Код:
function PointerToArrayOfConst (anArgs: PArrayOfConst) : ArrayOfConst;
var
ArrayOfConstCallAlias : procedure (var Result: ArrayOfConst; var anArgs: TVarRec; High: WORD);
I : WORD;
A : ArrayOfConst;
procedure ArrayOfConstCall (var Result: ArrayOfConst; anArgs: array of const);
var
I : WORD;
Index : WORD;
Length : WORD;
begin
Result := NIL;
try
Length := 0;
if ( High (anArgs) >= 0 ) then
Length := Length + High (anArgs) - Low (anArgs) +1;
if ( Length > 0 ) then
begin
SetLength (Result,Length);
Index := 0;
for I := Low (anArgs) to High (anArgs) do
begin
Result [Index] := anArgs [i];
Inc (Index);
end;
end;
except
Result := NIL;
end;
end;
begin
Result := NIL;
try
@ArrayOfConstCallAlias := @ArrayOfConstCall;
I := 0;
while ( I < H ) do
begin
ArrayOfConstCallAlias ( A, anArgs^ [i], SizeOf (anArgs) div SizeOf (TVarRec) );
if ( I = 0 ) then
Result := A
else
Result := ArrayOfConstMerge (Result,A);
Inc (I);
end;
except
Result := NIL;
end;
end;
как получить H?
|