2015-07-13 9 views
2

У меня есть форма, которая позволяет использовать для выбора записи и этой формы, а затем возвращает идентификатор записи и произвольное количество значений полей, которые могут потребоваться вызывающей форме. Чтобы сделать это, у меня есть функция, которая обрабатывает создание выбора формы и передает все значения и из вызывающей формы:Delphi 2007 и Dynamic Variant Array как параметр Var

Function Execute(AOwner: TComponent; AConnection: TADOConnection; 
    AEditor: String; AButtons: TViewButtons; Var AID: Integer; 
    Var ARtnVals: Array of Variant): TModalResult; 
Var 
    I: Integer; 
Begin 
    frmSelectGrid := TfrmSelectGrid.Create(AOwner); 
    Try 
    With frmSelectGrid Do 
    Begin 
     Connection := AConnection; 
     Editor := AEditor; 
     Buttons := AButtons; 
     ID := AID; 

     Result := ShowModal; 
     If Result = mrOK Then 
     Begin 
     AID := ID; 
     //VarArrayRedim(ARtnVals, Length(RtnVals)); !! Won't compile 
     //SetLength(ARtnVals, Length(RtnVals));  !! Won't compile either 
     For I := 0 To High(RtnVals) Do 
      ARtnVals[I] := RtnVals[I];     // Causes runtime exception 
     End; 
    End; 
    Finally 
    FreeAndNil(frmSelectGrid); 
    End; 
End; 

Форма селектора имеет следующие общедоступные свойства:

public 
    Connection: TADOConnection; 
    Editor: String; 
    Buttons: TViewButtons; 
    ID: Integer; 
    RtnVals: Array of Variant; 
end; 

И в ОК мыши, у меня есть следующий код:

Var 
    I, Idx, C: Integer; 


    // Count how many fields are being returned 
    C := 0; 
    For I := 0 To Config.Fields.Count - 1 Do 
    If Config.Fields[I].Returned Then 
     Inc(C); 

    // If no fields to be returned, then just exit. 
    If C = 0 Then 
    Exit; 

    // Set the size of the RtnVals and assign the field values to the array. 
    SetLength(RtnVals, C); 
    Idx := 0; 
    For I := 0 To Config.Fields.Count - 1 Do 
    If Config.Fields[I].Returned Then 
    Begin 
     RtnVals[Idx] := aqItems.FieldByName(Config.Fields[I].FieldName).Value; 
     Inc(Idx); 
    End; 

Таким образом, когда пользователь нажимает кнопку OK, чтобы выбрать запись, массив RtnVals заполняются значения поля полей, которые будут RET urned. Теперь мне нужно скопировать эти значения в ARtnVals в функции Execute, чтобы они были возвращены в вызывающую форму.

Мой вопрос в том, как установить размер массива ARtnVals, чтобы я мог копировать поля? SetLength не работает, как в случае с кнопкой OK. VarArrayRedim тоже не работает.

ответ

6

При записи в списке параметров процедуры, этот код

Var ARtnVals: Array of Variant 

является открытым массивом, а не динамического массива. Открытый массив не может быть изменен. Открытый массив вам не нужен.

Вместо определения типа для массива:

type 
    TDynamicArrayOfVariant = array of Variant; 

Используйте этот тип для параметра, который на самом деле лучше всего в качестве выходного параметра:

function Execute(..., out RtnVals: TDynamicArrayOfVariant): TModalResult; 

А затем передать функцию а TDynamicArrayOfVariant к быть населенным.

Теперь у вас есть динамический массив, а не открытый массив в Execute, и вы можете использовать SetLength для его размера.

+0

Это отлично поработало, спасибо! – Caynadian

 Смежные вопросы

  • Нет связанных вопросов^_^