
05.04.2006, 00:35
|
|
Новичок
Регистрация: 04.04.2006
Сообщений: 11
С нами:
10580727
Репутация:
0
|
|
если массив динамический это не значит что КОЛИЧЕСТВО ЭЛЕМЕНТОВ НЕ ФИКСИРОВАНО... эт значит что количество элементов задается НЕ ПРИ КОМПЕЛЯЦИИ, а после того как используется функция ГЕТМЕМ или СЕТЛЕНЗ... т.е. количество элементов ЗАДАЕТСЯ (фиксируется) динамически... и не более того ИМХО...
slimeб, ты ошибаешься.
Почитай литературу.
По поводу разных типов:
Массивы могут быть не только разных типов, но можно также создавать массив с разным типом данных элементов.
Код:
function VarArrayCreate(const Bounds: array of Integer;
AVarType: TVarType): Variant;
var
I, LDimCount: Integer;
LVarArrayRef: PVarArray;
LVarBounds: array[0..63] of TVarArrayBound;
begin
if (not Odd(High(Bounds)) or (High(Bounds) > 127)) or
(not VarTypeIsValidArrayType(AVarType)) then
VarArrayCreateError;
LDimCount := (High(Bounds) + 1) div 2;
for I := 0 to LDimCount - 1 do
with LVarBounds[I] do
begin
LowBound := Bounds[I * 2];
ElementCount := Bounds[I * 2 + 1] - LowBound + 1;
end;
LVarArrayRef := SafeArrayCreate(AVarType, LDimCount, PVarArrayBoundArray(@LVarBounds)^);
if LVarArrayRef = nil then
VarArrayCreateError;
_VarClear(TVarData(Result));
TVarData(Result).VType := AVarType or varArray;
TVarData(Result).VArray := LVarArrayRef;
end;
function VarArrayOf(const Values: array of Variant): Variant;
var
I: Integer;
begin
Result := VarArrayCreate([0, High(Values)], varVariant);
for I := 0 to High(Values) do
Result[I] := Values[I];
end;
procedure _VarArrayRedim(var A: TVarData; HighBound: Integer);
var
VarBound: TVarArrayBound;
LVarType: TVarType;
LVarArray: PVarArray;
begin
if not GetVarDataArrayInfo(A, LVarType, LVarArray) then
VarResultCheck(VAR_INVALIDARG);
with LVarArray^ do
VarBound.LowBound := Bounds[DimCount - 1].LowBound;
VarBound.ElementCount := HighBound - VarBound.LowBound + 1;
if SafeArrayRedim(LVarArray, VarBound) <> VAR_OK then
VarArrayCreateError;
end;
|
|
|