Форум: "Основная";
Поиск по всему сайту: 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.05 c
1-52565           Yuraz                 2001-12-28 14:00  2002.01.17  
Хотелось бы сделать ProgressBar в модальном окне для своей программы, не знаю как...


7-52670           Дядька Форгер         2001-09-27 08:13  2002.01.17  
Вовместимость


1-52575           Alexandr              2001-12-28 13:22  2002.01.17  
Delphi & Help


3-52518           kva                   2001-12-17 13:47  2002.01.17  
Создать временную таблицу со структурой заданной таблицы


3-52513           vangog                2001-12-17 10:55  2002.01.17  
порядковый номер строки в DBGrid