![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Доброго времени суток, знатоки. Собственно сабж:
Есть тип: Код:
TListClass = array [ 0..3 ] of TControlClass; Код:
ListClass : TListClass = (TEdit , TButton , TCheckBox , TLabel); Код:
function TForm1.RuntimeCompCreate(Tag: Array of Variant; CType: Integer): Boolean;
var
TypeClass : TControlClass;
New : TControl;
begin
if (CType >= 0) then begin
TypeClass := TControlClass(ListClass[CType]);
New := TypeClass.Create(Self);
With New do begin
Parent := Form1;
Left := Tag[0];
Top := Tag[1];
Height := Tag[2];
Width := Tag[3];
Name := Tag[4];
end;
if TypeClass = TEdit then begin
(New as TEdit).TextHint := Tag[5];
(New as TEdit).Text := Tag[6];
end;
if TypeClass <> TEdit then begin
Caption := Tag[5];
end;
end;
end;При компилировании ругается на блок кода с присвоениями от Tag[0] до Tag[4], ошибка: [DCC Error] Unit1.pas: E2016 Array type required; Мозг кипит, подскажите пожалуйста, где мои кривые руки ошиблись? Заранее благодарен.) Последний раз редактировалось StoxFT, 21.10.2012 в 23:53. |
|
#2
|
|||
|
|||
|
Цитата:
Cкорее всего, путаница в именах при разрешении With. Переименуй New и Tag во что-нить другое. |
|
#3
|
||||
|
||||
|
lmikle прав.
Вот эту конструкцию: Код:
With New do begin
Parent := Form1;
Left := Tag[0];
Top := Tag[1];
Height := Tag[2];
Width := Tag[3];
Name := Tag[4];
end;Код:
New.Parent := Form1; New.Left := New.Tag[0]; New.Top := New.Tag[1]; New.Height := New.Tag[2]; New.Width := New.Tag[3]; New.Name := New.Tag[4]; Переименуй параметр Tag, а ещё лучше вообще не используй конструкцию with - это потенциальный источник различных недоразумений и непонятных глюков. И ещё не используй в методах формы глобальную переменную Form1 (и т.п.) - используй вместо этого переменную Self. |
|
#4
|
|||
|
|||
|
Собственно, пришлось немножко повыпендриваться.. Проблему решил открытым массивом:
Код:
function TForm1.RuntimeCompCreate(Tag: Array of const; CType: Integer): Boolean;
var
TypeClass : TControlClass;
NewComp : TControl;
begin
if (CType >= 0) then begin
TypeClass := TControlClass(ListClass[CType]);
NewComp := TypeClass.Create(Self);
NewComp.Parent := Form1;
NewComp.Left := Tag[0].VInteger;
NewComp.Top := Tag[1].VInteger;
NewComp.Height := Tag[2].VInteger;
NewComp.Width := Tag[3].VInteger;
NewComp.Name := String(Tag[4].VString);
if TypeClass = TEdit then begin
(NewComp as TEdit).TextHint := String(Tag[5].VString);
(NewComp as TEdit).Text := String(Tag[6].VString);
end;
end;
end;Функция динамически создаёт визуальный компонент, принимая в качестве параметров открытый массив. Код скинул на всякий случай, может быть кому-нибудь будет интересно. Спасибо вам за то что отозвались. Последний раз редактировалось StoxFT, 22.10.2012 в 04:05. |
|
#5
|
|||
|
|||
|
Только уж если
Код:
NewComp := TypeClass.Create(Self); Код:
NewComp.Parent := Self; |
|
#6
|
||||
|
||||
|
Пользуй TObjectList, массивы не удобные.
|
|
#7
|
||||
|
||||
|
Код:
procedure TForm1.RuntimeCompCreate(Data: array of Variant); var AClass: TControlClass; AControl: TControl; APropInfo: PPropInfo; begin AClass:=TControlClass(GetClass(Data[0])); AControl:=AClass.Create(Self); AControl.Parent:=Self; AControl.Left:=Data[1]; AControl.Top:=Data[2]; AControl.Width:=Data[3]; AControl.Height:=Data[4]; APropInfo:=GetPropInfo(AControl, 'Caption'); if Assigned(APropInfo) then SetStrProp(AControl, APropInfo, Data[5]); APropInfo:=GetPropInfo(AControl, 'Text'); if Assigned(APropInfo) then SetStrProp(AControl, APropInfo, Data[5]); end; использование: Код:
begin RegisterClass(TLabel); RegisterClass(TEdit); RegisterClass(TButton); RuntimeCompCreate(['TLabel', 10, 10, 0, 0, 'Label']); RuntimeCompCreate(['TEdit', 80, 10, 100, 21, 'Edit']); RuntimeCompCreate(['TButton', 200, 10, 75, 25, 'Button']); end; |