Конференция "Компоненты" » Если Owner не форма, то экземпляр не видно в окне «structure»
 
  • Kolan © (12.04.07 19:56) [0]
    Здравствуйте,
     Сделал компонент наследник 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

    невсегда форма?
  • homm © (13.04.07 05:24) [1]
    > TempPage := CreatePage;
    > InitializePage(TempPage, PageName);
    > Result := FPages.Add(TempPage);

    А почему плюем на ОПП, и пишем не так:

    TempPage := TWizzardPage.Create(Self.Owner);;
    TempPage.InitializePage(PageName);
    Result := FPages.Add(TempPage);

  • DimaBr © (13.04.07 08:53) [2]
    1. Потому что дизайнер формы их не видит.
    2.
    Result := Designer.CreateComponent(TCustomWizzardPage,Component,Left,Top,Width,Height);
    TCustomWizzardPage(Result).Wizzard := (Component as TCustomWizzard);


    А уж в SetWizard призвести добавление во внутренний список и инициализацию.
  • Kolan © (13.04.07 21:53) [3]
    > TempPage.InitializePage(PageName);

    С этим соглашусь.

    А с этим:
    TempPage := TWizzardPage.Create(Self.Owner);;


    Нет.

    Это что же мне всегда переписывать AddPage если надо создать наследника?
    Это кажись что-то вроде «фабрично метода»…

    >  DimaBr  ©   (13.04.07 08:53)


    Понятно, благодарю.
  • Kolan © (16.04.07 09:24) [4]
    TempPage := Designer.CreateComponent(TWizzardPage, Component, 0,0,0,0);


    Говорит:
    [Pascal Error] KSoftWareWizzardEditorUnit.pas(36): E2010 Incompatible types: 'TWizzardPage' and 'TComponent'



    Хотя:

    TWinControl
        ^
        |
    TCustomWizzardPage
        ^
        |
    TWizzardPage

  • DimaBr © (16.04.07 10:55) [5]

    TempPage := Designer.CreateComponent(TWizzardPage, Component, 0,0,0,0)  as  TWizzardPage;

  • DimaBr © (16.04.07 10:58) [6]

    var A: TControl;
        B: TComponent;
    begin
     B := A;
    //    но не наоборот
     A := B;  
    end;

  • Kolan © (16.04.07 11:15) [7]
    Блин, я думал он на это ругается :(.
    Designer.CreateComponent(TWizzardPage

    , Component, 0,0,0,0)

    Понятно…
  • Kolan © (16.04.07 11:22) [8]
    Угу, получилось.
    Теперь еще вопрос. Вот у меня значится на однм контроле лежат несколько других.
    И в окне «structure» соответственно дерево:
    Wizzard:
     WizzardPage1
     WizzardPage2
     WizzardPage3



    Вопрос какое событие происходит при нажатии на дочерние элементы?

    Это нужно для того чтобы все кроме выбранного скрыть, чтобы был виден только он…
  • DimaBr © (16.04.07 11:32) [9]
    Если вы говорите о дизайнере, то думаю можно попытаться отловить WM_SETFOCUS, но затея кажется глупая. Закройте окно «structure» и инспектор, и выберите потом другую панель !!!
  • Kolan © (16.04.07 11:36) [10]
    > но затея кажется глупая

    Ладно, вопрос. У меня вышел аналог TPageContol(по виду), но нет корешков. Как мен сделать возможность переключаться меж ними в дизанере. Те чтобы создать 3 штуки например, а потом накидать контролов?
  • DimaBr © (16.04.07 11:55) [11]
    Popup (Previous Page, Next Page)
  • Kolan © (16.04.07 12:04) [12]
    > Popup

    Дык это где должно быть? Механизм пказать/скрыть допустим есть. Но когда и кто будет вызывать?
  • DimaBr © (16.04.07 12:18) [13]

    > Как мен сделать возможность переключаться меж ними в дизанере.

    Кинте на форму TPageControl, нажмите над ним правой кнопкой мыши. Вот вам и Popup с сменой страниц
  • Kolan © (16.04.07 12:23) [14]
    А я понял. Соотв реализовать еще 2 «Verb'а»… Вроде понятно…
  • Kolan © (16.04.07 12:36) [15]
    Вот еще проблемма:
    В окре «структура» созданые TWizzardPage как-бы прозрачные. А если на них кинуть кнопку например, то получается, что кнопка лежит на форме, а не на TWizzardPage.
  • DimaBr © (16.04.07 12:40) [16]
    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;{case}
    end;



    Не забудьте, то при выборе из окон «structure» и инспектор панель тоже должна почвится.
  • DimaBr © (16.04.07 12:46) [17]
    Попробуйте перетащить кинутую кнопку за пределы панели. Если это вам удалось, значит она(кнопка) действительно лежит не на панели. Тогда очевидно что ваша панель не принимает контролы в дизайнере. Скорее всего поможет
    constructor TMyPanel.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    ControlStyle := ControlStyle + [csAcceptsControls]
    ...
    end;
  • Kolan © (16.04.07 12:52) [18]
    > DimaBr ©   (16.04.07 12:40)

    Сделал. Но это тут не прием. Когда я их только создаю, они(пиктограмки страниц в окне «структура») уже какбы прозрачные…
  • DimaBr © (16.04.07 12:55) [19]
    Может из-за этого

    ControlStyle := ControlStyle + [csAcceptsControls, csNoDesignVisible];
 
Конференция "Компоненты" » Если Owner не форма, то экземпляр не видно в окне «structure»
Есть новые Нет новых   [134466   +3][b:0][p:0.003]