Показать сообщение отдельно

  #17  
Старый 05.04.2006, 00:35
Sec†orX
Новичок
Регистрация: 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;
 
Ответить с цитированием