![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 - вобщем это не проблема кривой хакнутой копии.