Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создаю объекты своего класса, и не могу Parent присвоить [D6, WinXP]


Надежда ©   (2005-03-25 11:23:00) 

Здравствуйте, уважаемые Мастера! Помогите, пожалуйста.

У меня есть класс от TLabel, в котором добавлены пара своих полей. В базе данных хранится имя требуемого объекта, имя этого класса для него, а несколько пар значений "имя свойства" и "значение свойства", в числе которых "Parent" и <имя родительского компонента>.
Требуется создать объект - экземпляр класса, найти по имени парента, присвоить его объекту, затем установить остальные свойства.
Вот с парентом как раз и проблема. Делаю я это так

type
 TMyLabel = class(TLabel)
  private
   { Private declarations }
  public
   { Public declarations }
   DestObjectName: string;
   DestObjectId: integer;
 end;
 --------
procedure ......

var
tmpParent:TWinControl;
tmpL: TControl;
tmpClass : TClass;
// .....прочее
begin
 //описание объекта
 cdsElem.AppendRecord(['lblTest','TMyLabel']);
 //описание свойств
 cdsProps.AppendRecord(['Parent','PanParams']);
 cdsProps.AppendRecord(['DestObjectName','DBChart1']);
 cdsProps.AppendRecord(['DestObjectId','123']);

 //создание объекта
 tmpClass := FindClass(cdsElemEClassName.AsString);
 //объект
 tmpL := TControl(tmpClass.Create());

 (tmpL as TComponent).Name := cdsElemEName.AsString;

 tmpParent := TWinControl(FindComponent(cdsPropsprpValue.AsString));
 if (tmpL is TControl)
 then (tmpL as TControl).Parent := tmpParent;

На последнюю строчку в run-timee выдается AccessViolation :-(
Заранее простите, если я действую? как полный ламер, но подскажите, пожалуйста, в чем я накосячила :-)


Надежда   (2005-03-25 16:09:00) [1]

Спасибо еще раз за помощь, я воспользовалась вариантом установки всем объектам одного Owner'а, затем через FindComponent получаю ссылку на объект, независимо от парента


Юрий Зотов   (2005-03-25 15:12:00) [2]

Если под словом "имя" понимается значение свойства Name, то нужно знать Owner'а. У него есть метод FindComponent.

Еще для потомков TControl можно использовать FindChildControl - но тогда нужно знать Parent'а.

Еще для потомков TWinControl можно использовать FindСontrol (но тогда нужно знать не имя, а хэндл окна), или FindVCLWindow (но тогда нужно знать не имя, а координаты любой точки, принадлежащей окну).


Надежда   (2005-03-25 14:39:00) [3]

Спасибо Вам огромное, Юрий, помогло, поправила, теперь объект создается.

Если не трудно, подскажите, пожалуйста, могу ли я получить ссылку на объект, если знаю его имя, но не знаю точно в момент поиска объекта ни класса объекта, ни родителя?

Заранее благодарна за любую помощь


Юрий Зотов   (2005-03-25 13:33:00) [4]

Похоже, вызывается конструктор не того класса, который нужен.

tmpClass := FindClass(cdsElemEClassName.AsString);
if tmpClass.InheritsFrom(TControl) then
begin
 tmpL := TControlClass(tmpClass).Create(владелец);
 ...
end
else
 ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо