Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Вниз

Помогите с созданием компонента. 


Voron   (2001-12-28 12:49) [0]

У меня такая проблема:
unit CustomTreeView1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, ComCtrls;
type
TCustomTreeView1 = class(TCustomTreeView)
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
constructor TCustomTreeView1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Items.Add(nil, "My new node");
end;
procedure Register;
begin
RegisterComponents("Try", [TCustomTreeView1]);
end;
end.

компилируется, но когда кидаю компонент на форму выдается ошибка: "Control "" has no parent window" как так has no parent window?
Если в конструкторе
if not (csDesigning in ComponentState) then Items.Add(nil, "My new node");
то все работает, но в десижен тайме естественно Node не создается. А мне надо чтоб и при добавлении компонента на форму автоматически Node создавались, как быть?
И еще: в связи с этой проблемой копал исходники TShelTreeView модуль ShellCtrls там:
TCustomShellTreeView = class(TCustomTreeView, IShellCommandVerb)
а выше:
IShellCommandVerb = interface ["{7D2A7245-2376-4D33-8008-A130935A2E8B}"]
Что такое это такое и как сей интерфейс юзать?
Никакой информации по IShellCommandVerb не нашел.
Помагите, плиз, разобраться.
С уважением, Voron.



Юрий Зотов   (2001-12-28 13:07) [1]

В контролах серии ComCtrl многие методы работают через посылку сообщений собственному окну (рекомендую посмотреть исходники - увидите сами). В том числе, вызов Items.Add тоже, скорее всего, приводит к посылке сообщения.

Но во время работы конструктора никакого окна еще нет - оно создается позже, при вызове CreateWnd. Отсюда и ошибка.

Вывод - замещайте не конструктор, а метод CreateWnd, а уже в нем (строго ПОСЛЕ inherited) вызывайте Items.Add.



Voron   (2001-12-28 13:57) [2]

2 Юрий Зотов ©
Благодарю, то что надо.
Но один вопрос - если я пишу в конструкторе
if not (csDesigning in ComponentState) then Items.Add(nil, "My new node");
и запускаю приложение с этим компонентом, то при появлении формы на экране в моем компоненте Node уже создан. В связи с этим, и вышесказанным Вами мне непонятно, в рантайме при вызове моего конструктора окно уже создано, так получается?
Чем в моем случае отличается создание моего TreeView в рантайме и в десижентайме? Каких механизмов я не понимаю, подскажите, плиз, какие разделы справки почитать.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.03 c
3-52477           Макс                  2001-12-14 13:32  2002.01.17  
Фильтрация в ADOTable


1-52524           XeN                   2001-12-26 17:59  2002.01.17  
DelphiX


4-52689           Вадим                 2001-11-16 17:31  2002.01.17  
Имя компьютера


1-52525           Beat                  2001-12-27 10:21  2002.01.17  
TIcon 16x16 а не 32x32?


3-52454           Анастасия             2001-12-13 18:51  2002.01.17  
Помогите, пожалуйста, срочно!!!