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

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

D7 only! control '' has no parent window


Sergey_Masloff ©   (2004-10-07 22:54:00) 

Есть у меня библиотека самописных компонент. Написаны еще на D2 а потом их поддержка перешла мне. Без особых проблем портировал их D2->D5->D6 попутно дописав еще несколько. Никаких проблем. С переносом на D7 возникла проблема. Для 2 из 5 компонент при попытке поместить на форму из палитры компонентов вылетает сабж после чего среда помирает.
 Если скопировать кусок DFM из D5 (или 6) и поместить в DFM от D7 то контрол появляется и нормально работает как в design так и в runtime. При этом его можно спокойно копировать через копи-паст никаких ошибок не возникает.
 Если контрол динамически создать в runtime то проблем с его работой также нет.
 Еще симптом -> при попытке вставить с палитры компонент в .pas файл появляется описание компонента а в .DFM -> sic! или не появляется или появляется но в странном виде

не
object MyControl: TMyControl
 Left = ...
 ...
а
 TMyControl
 Left = ...

то есть нет части objectObjectName

У кого есть идеи как хотя бы поймать в каком месте засада - пишите. Родина вас не забудет.


Sergey_Masloff   (2004-10-09 20:27:00) [1]

Вобщем проблема практически решена (или наоборот).
я в
>Sergey_Masloff   (08.10.04 21:26) [12]
писал что нашел и переписал пару мест написаных явно неаккуратно.
Но к ошибке они вроде бы отношения иметь не могли.
Кроме того по совету Юрия и MBo убрал Invalidate(). Вроде бы все бесполезно Но! сейчас пришел домой хотел еще покопаться и неожиданно обнаружил что ошибка ТЕПЕРЬ возникает ТОЛЬКО в Delphi7 С УСТАНОВЛЕНЫМ UPDATE PACK. (До внесения изменений возникала точно независимо от Update Pack).
 Если удастся написать минимальный пример гарантированно вызывающий ошибку буду писать Борландам.


Семен Сорокин   (2004-10-09 19:47:00) [2]

было нечто подобное, при создании компонента - наследника TCustomControl в конструкторе создавался TTabSet (из закладки Win 3.1) и тут же ему прописывался ряд свойств (Parent, Anchors, OnChange...) в Design-time при попытке бросить компонент из палитры на форму вылетал сабж, избавился от этого тем что в конструкторе оставил только само создание (TTabset.Create), а присвоение всез св-в вынес в переопределенный метод CreateWnd, что самое интересно что выше было создание и задание св-в других визуальных компонентов (TScrollBox) - там этого не наблюдалось.

ЗЫ. можно попробовать задать создаваемым компонентам уникальные имена (Name), тогда сабж точно будет указывать на каком компоненте это происходит.


Юрий Зотов   (2004-10-09 08:34:00) [3]

Сергей, пока ничего токового в голову не приходит. Внешне все выглядит нормально, но могут быть какие-то хитрости во введенных свойствах (точнее, с их сохранением, когда writer не может сработать правильно). Можно показать объявления классов от TParentFindClassMDS до TPanelFindMDS ?


Sergey_Masloff   (2004-10-08 21:26:00) [4]

Юрий Зотов ©   (08.10.04 21:18) [11]
К сожалению сейчас с "глючным" не повторю :(
У меня дома компоненты не установлены. А на работе нет возможности в Интернет выходить... Но на 99% уверен что в глючном варианте есть все кроме

object pf_Status:


Этот компонент лежит просто на форме. Если попробовать на панель - эффект тот же.

Кстати даже если не решу проблему полностью то все равно "глюк" принес пользу. При внимательном просмотре кода компонент нашел несколько не очень аккуратно написаных мест до которых в ином случае руки бы не дошли никогда.


Юрий Зотов   (2004-10-08 21:18:00) [5]

Так это кусок из какого DFM? Судя по наличию "object" - из неглючного, а надо бы видеть глючный. И еще (важно!) - внутри какого ParentComponent'а сидит этот кусок?


Sergey_Masloff   (2004-10-08 19:31:00) [6]

Продолжаем ;-)
Юрий, Борис спасибо за внимание к проблеме. Но пока не решается. Убирание invalidate не помогло.

Про код DFM. Цитирую:

object pf_Status: TPanelFindMDS
       Left = 246
       Top = 6
       Width = 173
       Height = 119
       Caption = 'Статус договора'
       TabOrder = 5
       AlignmentButton = taRightJustify
       ButtonAlwaysVisible = False
       MultiSelect = True
       ManualEdit = False
       CustomList = True
       CustomStrings.Strings = (
         '1 -> З -> Заявление'
         '2 -> В -> Выпущен'
         '3 -> А -> Аннулирован'
         '4 -> Д -> Прекращен страхователем'
         '5 -> Щ -> Прекращен страховщиком')
       DefaultSelect.Strings = (
         '1'
         '2'
         '3')
       Columns = 0
       ShowOriginal = False
       AddSearch = False
       ShowField = sfShortname
     end


Вставленый в DFM Delphi7 компонент абсолютно нормально работает в design и в runtime и позволяет себя многократно копировать в design при этом сообщений об ошибках нет.


Юрий Зотов   (2004-10-08 08:28:00) [7]

Да, Invalidate здесь явно ни к чему и действительно может дать "has no parent window". Но на чудеса с DFM это не влияет, поэтому вот это: "Если скопировать кусок DFM из D5 (или 6) и поместить в DFM от D7 то контрол появляется и нормально работает" так и остается непонятным. Хорошо бы было взглянуть на этот кусок (и уточнить, внутри какого объекта он сидит в DFM).


MBo   (2004-10-08 07:34:00) [8]

для чего в конструкторе Invalidate? Я бы его в первую очередь попробовал перенести в CreateWnd или вообще убрать - WM_PAINT все равно придет после создания.


Sergey_Masloff   (2004-10-08 06:56:00) [9]

да TParentFindClassMDS = class(TPanel)


Sergey_Masloff   (2004-10-08 06:49:00) [10]

По конструкторам. Вроде бы ничего криминального. Это базовый класс:

constructor TParentFindClassMDS.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 fLangIsn := 0;

 fMainDictiContainer  := nil;
 MainStrings          := nil;
 FirstShow            := False;
 fShowOriginal        := False;
 fAddSearch           := False;

 sDefaultSelect       := TStringList.Create();
 sInFindFormProperty  := TStringList.Create();
 sOutFindFormProperty := TStringList.Create();

 ShowField := sfShortname;
 FindFormDestroy := True;
end;

Так как не все потомки имеют проблему дело наверное не в нем. Вот конструктор "проблемного" потомка

constructor TPanelFindMDS.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 fManualEdit := True;
 fButtonAlwaysVisible := false;

 fFromDataSet := nil;
 fList := TStringList.Create();

 bFind  := TSpeedButton.Create(Self);
 with bFind do begin
   Parent:=self;
   Glyph.LoadFromResourceName(HInstance, 'B_FIND');
   NumGlyphs:=2;
   OnClick := FindClick;
   ShowHint:=True;
   Hint:='Îòáîð';
 end;

 bClear := TSpeedButton.Create(Self);
 with bClear do begin
   Parent:=self;
   Glyph.LoadFromResourceName(HInstance, 'B_CLEAR');
   NumGlyphs:=2;
   OnClick := ClearClick;
   ShowHint:=True;
   Hint:='Î÷èñòèòü';
 end;

 bList := TCheckListBox.Create(Self);
 with bList do begin
   Parent:=self;
   OnKeyDown  := ListBoxKeyDown;
   OnDblClick := ListBoxDblClick;
   ShowHint:=True;
   Hint := '';
   OnMouseMove := bListMouseMove;
   OnClickCheck := ListBoxClickCheck;
 end;

 MainStrings := bList.Items;
 LName := TLabel.Create(Self);
 LName.Parent := self;
 fPrevItem := -1;
 Invalidate();
end;

еще перекрыт Loaded но ничего криминального

procedure TPanelFindMDS.Loaded;
begin
inherited loaded;
SetListStrings(fList);
end;


Юрий Зотов   (2004-10-08 01:53:00) [11]

Надо бы взглянуть на код конструктора и методов, отвечающих за сохранение в DFM  (если в компоненте они перекрыты).


MBo   (2004-10-07 23:23:00) [12]

>Но почему только в design
Увы, не знаю. Предположение только по subj.


Sergey_Masloff   (2004-10-07 23:16:00) [13]

MBo ©   (07.10.04 23:05) [2]
 Хорошо, попробую. Но почему только в design и только при переносе из палитры компонент? copy + paste работают... Но вообще ничего не хочу отметать попробую.
 Странно что до D7 это нигде не вылезло.


MBo   (2004-10-07 23:05:00) [14]

возможно, какие-то проблемы с обращением к окну в конструкторе  - тогда поможет перенос кода, связанного с этим, в перекрытый CreateWnd


Sergey_Masloff   (2004-10-07 22:55:00) [15]

да, забыл сказать - Delphi Architect, легальная, зарегистрированная с Update - вобщем это не проблема кривой хакнутой копии.


Наверх

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