Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.10.2012, 23:47
StoxFT StoxFT вне форума
Прохожий
 
Регистрация: 21.10.2012
Сообщения: 2
Репутация: 10
По умолчанию Динамическое создание компонентов

Доброго времени суток, знатоки. Собственно сабж:
Есть тип:
Код:
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  
Старый 22.10.2012, 01:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от StoxFT
При компилировании ругается на блок кода с присвоениями от Tag[0] до Tag[4], ошибка: [DCC Error] Unit1.pas: E2016 Array type required;
Мозг кипит, подскажите пожалуйста, где мои кривые руки ошиблись? Заранее благодарен.)

Cкорее всего, путаница в именах при разрешении With.
Переименуй New и Tag во что-нить другое.
Ответить с цитированием
  #3  
Старый 22.10.2012, 02:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

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, а свойство TControl.Tag, которое естественно не является массивом.
Переименуй параметр Tag, а ещё лучше вообще не используй конструкцию with - это потенциальный источник различных недоразумений и непонятных глюков.

И ещё не используй в методах формы глобальную переменную Form1 (и т.п.) - используй вместо этого переменную Self.
Ответить с цитированием
  #4  
Старый 22.10.2012, 03:47
StoxFT StoxFT вне форума
Прохожий
 
Регистрация: 21.10.2012
Сообщения: 2
Репутация: 10
По умолчанию

Собственно, пришлось немножко повыпендриваться.. Проблему решил открытым массивом:
Код:
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  
Старый 22.10.2012, 10:11
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Только уж если
Код:
 NewComp          := TypeClass.Create(Self);
то и
Код:
 NewComp.Parent   := Self;
Ответить с цитированием
  #6  
Старый 22.10.2012, 10:22
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Пользуй TObjectList, массивы не удобные.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 22.10.2012, 10:53
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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;
Вложения
Тип файла: rar RuntimeCompCreate.rar (1.7 Кбайт, 2 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter