|
|
Регистрация | << Правила форума >> | 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, массивы не удобные.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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; Пишу программы за еду. __________________ |