У меня есть форма, которая позволяет использовать для выбора записи и этой формы, а затем возвращает идентификатор записи и произвольное количество значений полей, которые могут потребоваться вызывающей форме. Чтобы сделать это, у меня есть функция, которая обрабатывает создание выбора формы и передает все значения и из вызывающей формы: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 тоже не работает.
Это отлично поработало, спасибо! – Caynadian