-
Здравствуйте, Сделал компонент наследник TWinControl. Он может создовать объекты(Похоже на TPageControl). Создаются так:
procedure TWizzardEditor.ExecuteVerb(Index: Integer);
begin
inherited;
case Index of
0:
begin
if Component is TCustomWizzard then
begin
(Component as TCustomWizzard).AddPage(Designer.UniqueName('WizzardPage'));
Designer.Modified;
end;
end;
end;
end;
function TCustomWizzard.AddPage(PageName: string): Integer;
var
TempPage: TCustomWizzardPage;
begin
TempPage := CreatePage;
InitializePage(TempPage, PageName);
Result := FPages.Add(TempPage);
end;
function TWizzard.CreatePage: TCustomWizzardPage;
begin
Result := TWizzardPage.Create(Self.Owner);
end;
Так вот если у созданых «страниц» Owner НЕ форма, то они не видны в окне «Structurte». Временно решил проблему так:
Result := TWizzardPage.Create(Self.Owner); Вопросы: 1. Почему если владелец НЕ форма их не видно? 2. Как сделать правильно, тк мой вариант явно неправильный, тк Self.Owner невсегда форма?
-
> TempPage := CreatePage; > InitializePage(TempPage, PageName); > Result := FPages.Add(TempPage);
А почему плюем на ОПП, и пишем не так: TempPage := TWizzardPage.Create(Self.Owner);;
TempPage.InitializePage(PageName);
Result := FPages.Add(TempPage);
-
1. Потому что дизайнер формы их не видит. 2. Result := Designer.CreateComponent(TCustomWizzardPage,Component,Left,Top,Width,Height);
TCustomWizzardPage(Result).Wizzard := (Component as TCustomWizzard);
А уж в SetWizard призвести добавление во внутренний список и инициализацию.
-
> TempPage.InitializePage(PageName);
С этим соглашусь. А с этим: TempPage := TWizzardPage.Create(Self.Owner);; Нет. Это что же мне всегда переписывать AddPage если надо создать наследника? Это кажись что-то вроде «фабрично метода»
> DimaBr © (13.04.07 08:53)
Понятно, благодарю.
-
TempPage := Designer.CreateComponent(TWizzardPage, Component, 0,0,0,0); Говорит: [Pascal Error] KSoftWareWizzardEditorUnit.pas(36): E2010 Incompatible types: 'TWizzardPage' and 'TComponent' Хотя: TWinControl
^
|
TCustomWizzardPage
^
|
TWizzardPage
-
TempPage := Designer.CreateComponent(TWizzardPage, Component, 0,0,0,0) as TWizzardPage;
-
var A: TControl;
B: TComponent;
begin
B := A;
A := B;
end;
-
Блин, я думал он на это ругается :(. Designer.CreateComponent(TWizzardPage , Component, 0,0,0,0) Понятно
-
Угу, получилось. Теперь еще вопрос. Вот у меня значится на однм контроле лежат несколько других. И в окне «structure» соответственно дерево: Wizzard:
WizzardPage1
WizzardPage2
WizzardPage3 Вопрос какое событие происходит при нажатии на дочерние элементы? Это нужно для того чтобы все кроме выбранного скрыть, чтобы был виден только он
-
Если вы говорите о дизайнере, то думаю можно попытаться отловить WM_SETFOCUS, но затея кажется глупая. Закройте окно «structure» и инспектор, и выберите потом другую панель !!!
-
> но затея кажется глупая
Ладно, вопрос. У меня вышел аналог TPageContol(по виду), но нет корешков. Как мен сделать возможность переключаться меж ними в дизанере. Те чтобы создать 3 штуки например, а потом накидать контролов?
-
Popup (Previous Page, Next Page)
-
> Popup
Дык это где должно быть? Механизм пказать/скрыть допустим есть. Но когда и кто будет вызывать?
-
> Как мен сделать возможность переключаться меж ними в дизанере.
Кинте на форму TPageControl, нажмите над ним правой кнопкой мыши. Вот вам и Popup с сменой страниц
-
А я понял. Соотв реализовать еще 2 «Verb'а»
Вроде понятно
-
Вот еще проблемма: В окре «структура» созданые TWizzardPage как-бы прозрачные. А если на них кинуть кнопку например, то получается, что кнопка лежит на форме, а не на TWizzardPage.
-
procedure TWizzardEditor.ExecuteVerb(Index: Integer);
begin
inherited;
case Index of
0: 1,2: begin TempPage := TWizzardPage(Component).GetNexPage(Index = 1);
Designer.SelectComponent(TempPage);
end;
end;
end; Не забудьте, то при выборе из окон «structure» и инспектор панель тоже должна почвится.
-
Попробуйте перетащить кинутую кнопку за пределы панели. Если это вам удалось, значит она(кнопка) действительно лежит не на панели. Тогда очевидно что ваша панель не принимает контролы в дизайнере. Скорее всего поможет constructor TMyPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csAcceptsControls] ... end;
-
> DimaBr © (16.04.07 12:40)
Сделал. Но это тут не прием. Когда я их только создаю, они(пиктограмки страниц в окне «структура») уже какбы прозрачные
-
Может из-за этого
ControlStyle := ControlStyle + [csAcceptsControls, csNoDesignVisible];
|