Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
3-1121704689
xroot
2005-07-18 20:38
2005.09.04
Установка базы


8-1113240383
Eraser
2005-04-11 21:26
2005.09.04
Print Screen видео


9-1113469655
Xeno
2005-04-14 13:07
2005.09.04
Сценаристы откликнетесь?!


3-1121936680
Fynjy1984
2005-07-21 13:04
2005.09.04
сумму по модулю DBGridEh


1-1124097276
BJValentine
2005-08-15 13:14
2005.09.04
Вывод текста в консольном приложении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский