Конференция "Компоненты" » Action внутри компонента, чтобы он был доступен всем.
 
  • Kolan © (09.07.07 10:05) [0]
    Здравствуйте,
     У меня в компоненте есть поле
    FNextAction: TAction;

    я его создаю в конструкторе компонента:
     FNextAction := TAction.Create(Self);



    Так вот если теперь кинуть, допустим, кнопку на форму, то список
    Action

    у кнопки будет пуст. Видимо надо сделать что-то еще(кроме создания).

    Что?  

    ЗЫ
     
    RegisterActions

    как я понял это не то.
  • Сергей М. © (09.07.07 10:18) [1]
    When instantiating TAction at runtime, assign a TActionList or TActionManager component to the new action’s ActionList property after calling Create.
  • Kolan © (09.07.07 10:26) [2]
    > assign a TActionList or TActionManager

    А если я не хочу?
  • Kolan © (09.07.07 10:27) [3]
    То есть он мне не нужен или подругому никак? То есть я внутри компонента завиду еще поле типа TActionList, создам его и назначу — так?
  • Сергей М. © (09.07.07 10:40) [4]
    Инспектор объектов при открытии св-ва Action некоего контрола с целью  редактирования просматривает список существующих объектов класса TActionList, чей Owner есть та же самая форма, которой принадлежит этот контрол.
    Делай выводы ...
  • Kolan © (09.07.07 10:47) [5]

    > чей Owner есть та же самая форма, которой принадлежит этот
    > контрол.

    То есть при создании
    TActionList

    я должен указать Owner не  
    Self

    , а
    Self.Owner

    (Компонент мой не визуяльный).

    Вроде понятно…
  • Сергей М. © (09.07.07 10:53) [6]

    > То есть при создании TActionList я должен указать Owner
    > не  Self, а Self.Owner


    Не Self.Owner, а ссылку на форму, которая прямо или косвенно владеет твоим компонентом.

    Заметь, что компонент м.б. "брошен" не непосредственно на форму, а, например, на  TPanel на этой форме. В этом случае Owner'ом твоего компонета буде панель, а не сама форма.

    Думаю, прежде чем создавать свой TActionList, следует поискать на форме уже существующие ActionList'ы, дабы не плодить лишний.
  • Kolan © (09.07.07 10:56) [7]
    > Заметь, что компонент м.б. «брошен» не непосредственно на
    > форму

    Я о том и спрашиваю. А как её получить эту «сылку на форму»?
  • Сергей М. © (09.07.07 11:00) [8]

    > как её получить эту «сылку на форму»?


    var
     AOwner: TComponent;
    ..
    AOwner := Owner;
    while Assigned(AOwner) and not (AOwner is TForm) do
     AOwner := AOwner.Owner;
  • DimaBr © (09.07.07 11:00) [9]
    Чтобы стало видно нужно создать его на форме.
    Имея компонент на форме, очень легко выбрать его в инспекторе и нажать кнопочку Delete. Что будет потом ? Скорее всего AV. Оно вам нужно ??? Попробуйте найти другое решение...
  • Kolan © (09.07.07 11:11) [10]
    > Попробуйте найти другое решение…

    Что я хочу вообще.

    Есть объект
    А

    и много объектов
    Б

    .
    А

    знает какой из
    Б

    сейчас
    текущий

    . И есть
    кнопка

    .

    В
    А

    и в каждом
    Б

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

    Бросив на фому компонент
    А

    человек получает возмлжность установить
    кнопке

    событие  
    А

    . Он это делает…

    Далее при смене текущего
    Б

    событие назначеное кнопке изменяется. Оно берётся из
    Б

    .

    Смыс в чем:
    1. Если сейчас текущий объект типа
    Б

    =
    Б1

    .
     То:
    Б1.Enabled := False

    дисэйблит кнопку.

    2. Допустип у Б2 Caption = 'Привет'. Тогда при установлении Б2 текущим на кнопке появися «Привет».

    Вот как-то так.
  • Kolan © (09.07.07 11:12) [11]
    > [8] Сергей М. ©   (09.07.07 11:00)

    Ясно.
  • Kolan © (09.07.07 11:37) [12]
    Непонятно?

    Раньше я использовал такую вешь:

    TActionState = class(TPersistent)
     strict private
       FVisible: Boolean;
       FEnabled: Boolean;
       FChecked: Boolean;

       FCaption: string;
     strict protected
       procedure AssignTo(Dest: TPersistent); override;
     public
       constructor Create;

     published
       property Visible: Boolean read FVisible write FVisible default True;
       property Enabled: Boolean read FEnabled write FEnabled default True;
       property Checked: Boolean read FChecked write FChecked default False;
       property Caption: string read FCaption write FCaption;
     end;



    И компонент Б имел свйоство типа
    TActionState

    .

    А в событии OnShow компонента Б писал:
     NextButton.Caption := Sender.NextActionState.Caption;
     NextButton.Visible := Sender.NextActionState.Visible;
     NextButton.Enabled := Sender.NextActionState.Enabled;



    Недостаток 1 — если изменил Сво-во Enabled, то оно не вступит в силу пока не произайдет OnShow.

    А с Action все синхранизируется сразу. Поэтому я с ними и мучаюсь.
  • DimaBr © (09.07.07 11:53) [13]

    > Бросив на фому компонент А человек получает возмлжность установить кнопке событие  А

    несвязанное предложение
    Вообще непонятен ход вашей мысли. Это что, всё тот же визард ???
  • Kolan © (09.07.07 12:04) [14]
    > Это что, всё тот же визард ???

    Да. Я тот использовал в двух проектах. Выявились недостатки. Теперь устроняю. :)
    Начал с того, что устраняю неудобство [12].
    Как с этим разберусь буду мучать вас про коллекции :). Если сан не пойму.


    > Вообще непонятен ход вашей мысли.

    Вот вы кинули на форму
    TActionList

    . Создали там
    Action1

    . Смотрике в кнопке в поле
    Action

    появилясь возможность выбрать
    Action1

    .

    Аналогично. Бросили на форму мой визард. Смотрике в кнопке в поле
    Action

    появилась возможность выбрать
    NextStepAction

    . То есть это действие уже находится и обрабатывается самим визардом. Оно в нем уже есть. Осталось только назначить его контролу.
  • DimaBr © (09.07.07 12:19) [15]
    А мне так понравилось название
    http://pda.delphimaster.net/?id=1178537817&n=12

    Ясно.
    Тогда при создании компонента - создаём нужный Action, и пересоздаём при удалении в дизайнере если конечно не удаляется сам визард
  • DimaBr © (09.07.07 12:27) [16]
    Наверное не мешало бы переписать редактор дабы эти Action-ы нельзя было удалить из него.
  • ЮЮ © (09.07.07 12:31) [17]
    По-моему, логичнее у невизуального визарда опубликовать св-во ButtonNext: TControl для связи с визуальным объектом, отвечающми за кнопку далее, у которой динамически менять обработчик OnClick.

    Да и сам визард логичнее унаслежлвать от TActionList - код то пользователь компонента для каждого щага где-то должен писать, да и отпадет вопрос "Как с этим разберусь буду мучать вас про коллекции "


    > Недостаток 1 — если изменил Сво-во Enabled, то оно не вступит
    > в силу пока не произайдет OnShow.
    > А с Action все синхранизируется сразу. Поэтому я с ними
    > и мучаюсь.


    никто не мешает вызвать метод TMyWizard.Show(Self) в любом другом методе TMyWizard, который может изменить св-ва визуальных контролов, как это делается повсеместно в VCL (напр., Invalidate, Repaint, Refresh)
  • Kolan © (09.07.07 12:37) [18]
    > Тогда при создании компонента — создаём нужный Action, и
    > пересоздаём при удалении в дизайнере если конечно не удаляется
    > сам визард

    Не понял.

    1. Смысл то в чем(раз уж вы раскрыли что это визард :) ). У визара есть 3 св-ва
    Action

    (назад, вперёд, отмена) книув визард человек получает возможность назначить эти св-ва контролам.

    2. Далее у каждого шага визарда есть тоже 3
    Action

    но их назначить нельзя, их чел. меняет как хочет(назвние, видимость).

    Итак имея возможность (1) чел назначил кнопкам
    Action'ы

    визарда.
    А что надо делать при смене шага?
    Надо чтобы к кнопкам применились
    Action'ы

    из тек. шага. Иначе нельзя будет писать
    Step.NextAction.Enabled := False;

    .
    То есть надо сделать:
     Wizzard.Action := Step.Action



    А куда денуться Action визарда?

    Что-то я неврублюсь ка сделать :(
  • Kolan © (09.07.07 12:40) [19]
    > Наверное не мешало бы переписать редактор дабы эти Action-
    > ы нельзя было удалить из него.

    А разве до него получится добраться? Про наличие
    ActionList

    вообще никто не узнает.


    > По-моему, логичнее у невизуального визарда опубликовать
    > св-во ButtonNext: TControl


    Это вариант проще у Action больше свойств(checked например). Вдруг я не только кнопки менять буду. И потом что делать с Caption ?
  • Kolan © (09.07.07 12:50) [20]
    Может и в прям не парится а завизаться на кнопках?
  • ЮЮ © (09.07.07 12:50) [21]
    > Это вариант проще у Action больше свойств(checked например)
    > . Вдруг я не только кнопки менять буду. И потом что делать
    > с Caption ?


     ButtonNext.Action := FNextAction;


    Если наследоваться от TActionList, то
     ButtonNext.Action := Actions[ItemIndex] c контролем ItemIndex

  • Kolan © (09.07.07 12:52) [22]
    > [21] ЮЮ ©   (09.07.07 12:50)

    А, идея ясна.
  • DimaBr © (09.07.07 12:58) [23]
    Давайте посмотрим компонент ( у меня февральская версия, где визард и его шаги отдельные компоненты в палитре ).
  • Kolan © (09.07.07 13:43) [24]
    > у меня февральская версия, где визард и его шаги отдельные
    > компоненты в палитре

    Да. Так и сейчас. Вы знаете вариант ЮЮ имхо удачный. Оч. простой.

    Итак. У шагов есть
    Action'ы

    уже созданые, пользователи настраивают их как хотят. А в визарде есть
    TControl'ы

    их пользователь назначает.

    При смене шага:

    begin
     if Assigned(FNextControl) then
       FNextControl.Action := AWizzardStep.NextAction;

     if Assigned(FPreviousControl) then
       FPreviousControl.Action := AWizzardStep.PreviousAction;

     if Assigned(FCancelControl) then
       FCancelControl.Action := AWizzardStep.CancelAction;
    end;



    Мну вроде устриивает, шас еще поэксперементирую…
  • DimaBr © (09.07.07 14:14) [25]
    Предлагаю породить TWizardStep от TBasicAction и добавлять/удалять вместе с визаром.
    Тогда они видны будут извне
  • Kolan © (09.07.07 15:02) [26]
    > Предлагаю породить TWizardStep от TBasicAction и добавлять/удалять
    > вместе с визаром.

    От TBasicAction не, а зачем.

    А вот избавится от отдельного TWizardStep надо. Сейчас покапаюсь сам, а потом еще задам вопросы.

    Благодарю за обсуждение, данная проблема решена.
  • DimaBr © (09.07.07 15:45) [27]
    посмотри, вот пример хранения трёх Action в компоненте и видимость их наружи
    http://ifolder.ru/2612931
  • Kolan © (09.07.07 22:36) [28]
    Сйчас посмотрю.
 
Конференция "Компоненты" » Action внутри компонента, чтобы он был доступен всем.
Есть новые Нет новых   [119258   +41][b:0.001][p:0.003]