Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с созданием компонента. [D6, Win2k]


Voron ©   (2001-12-28 12:49:00) 

У меня такая проблема:
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.


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

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


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

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо