Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1085725091
Сергей Ю.
2004-05-28 10:18
2004.06.13
Вопрос про TButton (если их много :))


1-1085910407
Aleksoza
2004-05-30 13:46
2004.06.13
NewComponent


14-1085611831
Мазут Береговой
2004-05-27 02:50
2004.06.13
Вот обидно. Всё придумывают в России, а известность получают


3-1085031404
Vogul
2004-05-20 09:36
2004.06.13
Отображение больших объемов данных в Dataset


3-1084972116
ka
2004-05-19 17:08
2004.06.13
Доступ к записям таблицы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский