Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизЧто лучше использовать в конструкторе - Variant или array of var? Найти похожие ветки
← →
kombat © (2004-05-31 18:32) [0]Если форма которая служит родителем для всех остальных (TfrmBIT_BaseForm = class(TForm)), и в наследниках нужно при создании передавать разные параметры, значения которых должны быть доступны при OnCreate наследника.
Для этого я переопределяю конструктор формы по умолчанию.
И вот тут возникает вопрос как лучше делать.
У меня есть два варианта
1) constructor Create(AOwner: TComponent; AvParams:array of variant); reintroduce; overload;
//*************************************************
constructor TfrmBIT_BaseForm.Create(AOwner: TComponent; AvParams:array of variant);
begin
FAsChild := False; { форма не внедренная }
FvParams:=@AvParams;
inherited Create(AOwner);
end; { end of Create }
//*************************************************
И потом уже FvParams[i] использую
форму наследника вызываю как fTest(["Param1", Param2])
1) constructor Create(AOwner: TComponent; AvParams: variant); reintroduce; overload;
//*************************************************
constructor TfrmBIT_BaseForm.Create(AOwner: TComponent; AvParams:variant);
begin
FAsChild := False; { форма не внедренная }
FvParams:=AvParams;
inherited Create(AOwner);
end; { end of Create }
//*************************************************
И потом уже FvParams[i] использую
форму наследника вызываю как fTest(VarArrayOf(["Param1", Param2]))
=====================================================
Кто может подсказать, как правильнее, где подводные камни и может это вообще как-то по другому делается?
Спасибо за внимание ))
← →
Тимохов © (2004-05-31 19:03) [1]я больше люблю array of variant.
причина заключена в том, что в таком списке можно держать даже variant, которые не известны дельфи, т.е. vtype не является известным для дельфи. в variant можно держать массивы из НЕ всех элементов.
в частности это проявляется для типа 14 - varDecimal.
← →
kombat © (2004-05-31 19:12) [2]а в таком варианте как
constructor TfrmBIT_BaseForm.Create(AOwner: TComponent; AvParams:array of variant);
begin
FAsChild := False; { форма не внедренная }
FvParams:=@AvParams;
inherited Create(AOwner);
end; { end of Create }
ничего криминального нет? нигде боком не вылезет?
и как проверить что какие-то параметры переданы? При использовании variant я писал так
function fTest(ApiCur: pointer; AvParams: variant): TfrmBIT_BaseForm;
begin
if AvParams=Unassigned then
frmTest := TfrmTest.Create(Application)
else
frmTest := TfrmTest.Create(Application, AvParams);
Result := frmTest;
if frmTest.RunForm(ApiCur) then
begin
frmTest.Free;
frmTest := nil;
end;
end;
а как проверить AvParams=Unassigned в случае с array of variant?
← →
kombat © (2004-05-31 19:20) [3]кажись сам понял ))
if High(AavParams) < 0 then
frmTest := TfrmTest.Create(Application)
else
frmTest := TfrmTest.Create(Application, AavParams);
← →
Тимохов © (2004-05-31 19:23) [4]
> FvParams:=@AvParams;
Зачем вам адрес.
просто FvParams:=AvParams;
> if High(AavParams) < 0 then
if lenght(AavParams) = 0 then
← →
kombat © (2004-05-31 19:27) [5]если ставлю
FvParams: array of variant;
то при FvParams:=AvParams при компиляции говорит
Incompatible types: "Array" and "dynamic array"
← →
Тимохов © (2004-05-31 19:36) [6]
> kombat © (31.05.04 19:27) [5]
не пользуйтесь array of в параметрах.
пишите так
type
tmyarray = array of variant;
var
fv: tmyarray;
procedure someproc(v: tmyarray);
begin
fv := v;
end;
и все будет ок.
← →
kombat © (2004-05-31 20:17) [7]а параметры уже просто вот так
someproc(["sds", 2]) передать не удастся? говорит Ordinar type required
← →
GuAV © (2004-05-31 21:26) [8]
> someproc(["sds", 2])
Дык это, имхо, array of const
← →
kombat © (2004-05-31 21:30) [9]array of const
на это понятие я уже вышел в поиске, счас читаю как это правильно делать.
Блин, как все таки отсутствие теоретической подготовки мешает (( Такие вопросы задают наверное только новички, а я ж не первый год успешно с базами работаю, но вот только в сторону, и приехали ...
← →
Тимохов © (2004-06-01 10:10) [10]
> kombat © (31.05.04 20:17) [7]
да будет ругаться.
я всегда делаю так.
type
tmyarray = array of variant;
var
a: tmyarray;
procedure Proc(prm: array of variant);
begin
setlength(a, length(prm));
for i := 0 to high(prm) do a[i] := prm[i];
// можно эти две строчики в серсисную процедуру запизать.
end;
array of const я не пользуюсь, т.к. считаю это устаревшей штукой, которая имеет право на существование только потому, что появилась раньше, чем array of variant.
imho
← →
GuAV © (2004-06-01 11:25) [11]
> array of const я не пользуюсь, т.к. считаю это устаревшей
> штукой, которая имеет право на существование только потому,
> что появилась раньше, чем array of variant.
>
> imho
а другое обоснование у этого imho есть ?
"The array of const construction is equivalent to array of TVarRec. TVarRec, declared in the System unit, represents a record with a variant part that can hold values of integer, Boolean, character, real, string, pointer, class, class reference, interface, and variant types"
, чем же лучше array of variant
← →
Тимохов © (2004-06-01 11:31) [12]
> , чем же лучше array of variant
тем, что может хранить не только указанные типы, а например тип vardecimal и некоторые другие...
← →
GuAV © (2004-06-01 17:01) [13]
> vardecimal
Что это вообще такое? Как его объявить? И если это variant, то imho array of const и должна воспринимать его как variant.
← →
Тимохов © (2004-06-01 17:14) [14]
> GuAV © (01.06.04 17:01) [13]
насколько я знаю variant это не изобретение delphi.
вообще говоря такой тип есть в windows (или что-то подобное).
типов, которые например поддерживает ms sql сервер больше, чем те которые может обрабатывать delphi. Например тип сервера decimal(28,10) в дельфи не имеет аналога. если переменной типа variant присвоить значение decimal, то присвоится то нормально (дельфи при копировании забивает на то, что она не знает некоторые типы), но ариф. операции над таким variantом будут не возможны. Это к вопросу "что такое vardecimal".
Далее комментировать почему я не пользуюсь array of const не могу, т.к. уже не помню какие были веские причины несколько лет назад, когда я от array of const отказался в пользу array of variant.
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.03 c