Форум: "Компоненты";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
ВнизD7 only! control has no parent window Найти похожие ветки
← →
Sergey_Masloff (2004-10-07 22:54) [0]Есть у меня библиотека самописных компонент. Написаны еще на D2 а потом их поддержка перешла мне. Без особых проблем портировал их D2->D5->D6 попутно дописав еще несколько. Никаких проблем. С переносом на D7 возникла проблема. Для 2 из 5 компонент при попытке поместить на форму из палитры компонентов вылетает сабж после чего среда помирает.
Если скопировать кусок DFM из D5 (или 6) и поместить в DFM от D7 то контрол появляется и нормально работает как в design так и в runtime. При этом его можно спокойно копировать через копи-паст никаких ошибок не возникает.
Если контрол динамически создать в runtime то проблем с его работой также нет.
Еще симптом -> при попытке вставить с палитры компонент в .pas файл появляется описание компонента а в .DFM -> sic! или не появляется или появляется но в странном виде
не
object MyControl: TMyControl
Left = ...
...
а
TMyControl
Left = ...
то есть нет части object ObjectName
У кого есть идеи как хотя бы поймать в каком месте засада - пишите. Родина вас не забудет.
← →
Sergey_Masloff (2004-10-07 22:55) [1]да, забыл сказать - Delphi Architect, легальная, зарегистрированная с Update - вобщем это не проблема кривой хакнутой копии.
← →
MBo © (2004-10-07 23:05) [2]возможно, какие-то проблемы с обращением к окну в конструкторе - тогда поможет перенос кода, связанного с этим, в перекрытый CreateWnd
← →
Sergey_Masloff (2004-10-07 23:16) [3]MBo © (07.10.04 23:05) [2]
Хорошо, попробую. Но почему только в design и только при переносе из палитры компонент? copy + paste работают... Но вообще ничего не хочу отметать попробую.
Странно что до D7 это нигде не вылезло.
← →
MBo © (2004-10-07 23:23) [4]>Но почему только в design
Увы, не знаю. Предположение только по subj.
← →
Юрий Зотов © (2004-10-08 01:53) [5]Надо бы взглянуть на код конструктора и методов, отвечающих за сохранение в DFM (если в компоненте они перекрыты).
← →
Sergey_Masloff (2004-10-08 06:49) [6]По конструкторам. Вроде бы ничего криминального. Это базовый класс:
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;
← →
Sergey_Masloff (2004-10-08 06:56) [7]да TParentFindClassMDS = class(TPanel)
← →
MBo © (2004-10-08 07:34) [8]для чего в конструкторе Invalidate? Я бы его в первую очередь попробовал перенести в CreateWnd или вообще убрать - WM_PAINT все равно придет после создания.
← →
Юрий Зотов © (2004-10-08 08:28) [9]Да, Invalidate здесь явно ни к чему и действительно может дать "has no parent window". Но на чудеса с DFM это не влияет, поэтому вот это: "Если скопировать кусок DFM из D5 (или 6) и поместить в DFM от D7 то контрол появляется и нормально работает" так и остается непонятным. Хорошо бы было взглянуть на этот кусок (и уточнить, внутри какого объекта он сидит в DFM).
← →
Sergey_Masloff (2004-10-08 19:31) [10]Продолжаем ;-)
Юрий, Борис спасибо за внимание к проблеме. Но пока не решается. Убирание 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 21:18) [11]Так это кусок из какого DFM? Судя по наличию "object" - из неглючного, а надо бы видеть глючный. И еще (важно!) - внутри какого ParentComponent"а сидит этот кусок?
← →
Sergey_Masloff (2004-10-08 21:26) [12]Юрий Зотов © (08.10.04 21:18) [11]
К сожалению сейчас с "глючным" не повторю :(
У меня дома компоненты не установлены. А на работе нет возможности в Интернет выходить... Но на 99% уверен что в глючном варианте есть все кроме
object pf_Status:
Этот компонент лежит просто на форме. Если попробовать на панель - эффект тот же.
Кстати даже если не решу проблему полностью то все равно "глюк" принес пользу. При внимательном просмотре кода компонент нашел несколько не очень аккуратно написаных мест до которых в ином случае руки бы не дошли никогда.
← →
Юрий Зотов © (2004-10-09 08:34) [13]Сергей, пока ничего токового в голову не приходит. Внешне все выглядит нормально, но могут быть какие-то хитрости во введенных свойствах (точнее, с их сохранением, когда writer не может сработать правильно). Можно показать объявления классов от TParentFindClassMDS до TPanelFindMDS ?
← →
Семен Сорокин © (2004-10-09 19:47) [14]было нечто подобное, при создании компонента - наследника TCustomControl в конструкторе создавался TTabSet (из закладки Win 3.1) и тут же ему прописывался ряд свойств (Parent, Anchors, OnChange...) в Design-time при попытке бросить компонент из палитры на форму вылетал сабж, избавился от этого тем что в конструкторе оставил только само создание (TTabset.Create), а присвоение всез св-в вынес в переопределенный метод CreateWnd, что самое интересно что выше было создание и задание св-в других визуальных компонентов (TScrollBox) - там этого не наблюдалось.
ЗЫ. можно попробовать задать создаваемым компонентам уникальные имена (Name), тогда сабж точно будет указывать на каком компоненте это происходит.
← →
Sergey_Masloff (2004-10-09 20:27) [15]Вобщем проблема практически решена (или наоборот).
я в
>Sergey_Masloff (08.10.04 21:26) [12]
писал что нашел и переписал пару мест написаных явно неаккуратно.
Но к ошибке они вроде бы отношения иметь не могли.
Кроме того по совету Юрия и MBo убрал Invalidate(). Вроде бы все бесполезно Но! сейчас пришел домой хотел еще покопаться и неожиданно обнаружил что ошибка ТЕПЕРЬ возникает ТОЛЬКО в Delphi7 С УСТАНОВЛЕНЫМ UPDATE PACK. (До внесения изменений возникала точно независимо от Update Pack).
Если удастся написать минимальный пример гарантированно вызывающий ошибку буду писать Борландам.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.014 c