Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
9-1115315231
grouzd[E]v
2005-05-05 21:47
2005.09.04
OpenGL - Lists vs. Arrays


9-1115613002
.cpp
2005-05-09 08:30
2005.09.04
Работа с JPG в Delphi


1-1124086008
Чайничек
2005-08-15 10:06
2005.09.04
Can not create file ...


14-1123497616
ЙЦУКЕН
2005-08-08 14:40
2005.09.04
3D-модели химических соединений


4-1121531579
ychenick
2005-07-16 20:32
2005.09.04
USB и Delphi и всё-всё-всё