Конференция "Компоненты" » Помогите, делаю Wizzard незнаю как подступится…
 
  • Kolan © (03.04.07 15:23) [0]
    Начало тут:
    http://pda.delphimaster.net/?n=0&id=1175586374

    Итак нужно сделать компонент(или скорее всего два) для построения Wizzard'ов.

    Осн задача. Чтобы можно было делать в дизан тайме.

    Что я придумал:
    Написал расширеную версию TAction — TWizzardStep. В нем добавил события OnShow — показать шаг. OnUnExecute — откатить назад.

    А теперь зам виззард. Визард список шагов. Поэтому это потомок TActionList.

    Запарился вот с чем:
    Я посчитал что за такие действия типа «Вперед», «Назад»… Должен отвечать сам виззард. Отсюда задача:
    Сделать у визарда такие свойства чтобы можо было «цеплять» их на любые контролы, но чтобы обработка реакции веласть самим визардом — она одинаковая всегда…

    Вразумите, плз :)
  • Сергей М. © (03.04.07 16:20) [1]
    Пока ув. ЮЗ не появился, исследуй внимательно ($DELPHI)\Source\Vcl\ActnCtrl.pas - оно оч даже по твоей теме.
  • Kolan © (03.04.07 16:28) [2]
    > [1] Сергей М. ©   (03.04.07 16:20)
    > Пока ув. ЮЗ не появился, исследуй внимательно ($DELPHI)\Source\Vcl\ActnCt
    > rl.pas — оно оч даже по твоей теме.

    Пошел исследовать.
  • Kolan © (03.04.07 16:32) [3]
    > Помогите, делаю Wizzard незнаю как подступится…

    Не обязательно помогать мне разбираться в том что я придумал, может есть готовый паттерн(понятно что в GoF нет)…
  • Сергей М. © (03.04.07 16:38) [4]

    > Не обязательно помогать мне разбираться в том что я придумал


    Не то что "обязательно" - оно нафих не нужно)

    Бо ты пытаешься изобрести велосипед с эн-угольными колесами)
  • Kolan © (03.04.07 16:42) [5]
    > эн-угольными колесами)

    Я чувствую это сам. Как надо то скажите.
    Можно попростому, пользуясь тем что уже есть, но мастер сложный. Хочется поудобнее сделать…
  • Юрий Зотов © (03.04.07 16:44) [6]
    > Сделать у визарда такие свойства чтобы можо было «цеплять» их на
    > любые контролы, но чтобы обработка реакции веласть самим визардом —
    > она одинаковая всегда…

    private
     FOnMyEvent: TMyEvent;
    protected
     procedure DoMyEvent; dynamic;
    published
     property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
    end;

    procedure ...DoMyEvent;
    begin
     ... // Обработка 1
     if Assigned(FOnMyEvent)
       FOnMyEvent(Self, ...);
     ... // Обработка 2
    end;


    И в коде, где надо, вызываем DoMyEvent. То есть, и свои действия выполняем, и юзерское событие обрабатываем (ежели оно есть).
  • Kolan © (03.04.07 16:51) [7]
    > То есть, и свои действия выполняем, и юзерское событие обрабатываем
    > (ежели оно есть).

    Не понял :( Вот я нажимаю на кнопку и что? Выполнится DoMyEvent? Да? Если да, то почему?
  • Сергей М. © (03.04.07 16:53) [8]

    > Kolan ©   (03.04.07 16:51) [7]


    > я нажимаю на кнопку и что?

    Рекомендую не испытывать терпение ув. ЮЗ)
  • Kolan © (03.04.07 16:58) [9]
    > Рекомендую не испытывать терпение ув. ЮЗ)

    Блин, ну че теперь не спрашивать? Не понял я :(
    Предлогается создать у кнопок(к примеру) OnClick и там вставить Wizzard.DoMyEvent ? Так DoMyEvent вроде защищена.

    И еще надо же уметь делать ассоцированый контрол невидимым, недоступным(например поля заполнены неверно, конпка далее недоступна…).
  • DimaBr (03.04.07 17:01) [10]
    Предлагаю описать начальное желание, а не промежуточные действия.

    Вы хотите чтобы на контролах висели Actions которые можно было подменять динамически вперёд-назад. Я правильно понял ???
  • Kolan © (03.04.07 17:08) [11]
    > Предлагаю описать начальное желание

    Сделать виззард.


    > Вы хотите чтобы на контролах висели Actions которые можно
    > было подменять динамически вперёд-назад.

    Примерно, только экшены не подменяються. Внутри экшенов всегда один и тот же код:
    Для кнопки «далее >»:
    выпольнить текущий шаг
    Показать следующий шаг.

  • Kolan © (03.04.07 17:17) [12]
    В итоге должно получится так:
    Кидаю на форму Wizzard. Добавляю шаги. Для кожного шага делаю нужные OnShow OnExecute.
    Конкретным контролам, кнопкам например, назначаю экшены «< Назад» «Вперёд >» «Отмена»…
  • Наиль © (03.04.07 17:59) [13]
    > Кидаю на форму Wizzard. Добавляю шаги.

    Когда читаю эту фразу, то представляется, как на заснеженной форме лежит господин Wizzard. А на снегу остались следы от его шагов. Абстракционизм, какой-то. Опираясь на такую подсказку тяжело что-то посоветовать.
    В своих программах, при создании "Мастеров" (волшебников, Wizzard'ов) у меня кнопки Назад и Вперёд в единственном экземпляре. Как следствие, никаких экшенов им не требуется. В зависимости от того какой экран "Мастера" виден, кнопки Вперёд/Назад могут "бледнеть", исчезать или менять название (Вперёд<->Готово).
  • Kolan © (03.04.07 18:03) [14]
    В зависимости от того какой экран «Мастера» виден, кнопки Вперёд/Назад могут «бледнеть»
    А в зависимости от данных введенных?

    Я понял — это простой вариант, я его рассматривал… Просто мастер спецефичный и должен пользователя преостеречь от всего по возможности… + Могут быть ошибки(штатные) и нужно показывать специальные шаги(экраны если угодно) и знать что было до этого…
  • Наиль © (03.04.07 18:23) [15]
    В моём случае это решалось так:
    Имелся список страниц (экранов, шагов) в определённом порядке, вернее их состояний "должна быть видна"/"не д.б. видна".
    При изменении данных на текущей странице (CheckBox, RadioButton, Password) состояние одной или нескольких следующих страниц менялось (в событиях соотвествующих компонент). При нажатии на Далее происходил переход к следующей "должна быть видна" странице. В случае если страница последняя, то Вперёд заменяется на Готово.
  • Kolan © (03.04.07 18:28) [16]
    > Имелся список страниц

    Поподробнее плз — TList или что?


    > состояние одной или нескольких следующих страниц менялось

    Что такое состояние? Тоже объект?
  • Наиль © (03.04.07 18:39) [17]
    Списком страниц может быть всё что угодно. На твой вкус.
    У себя я использовал
    Set of Byte

    в котором хранились состояния "Виден"/"Невиден" и больше ни чего. Исходил из предположения, что порядок страниц заложен окончательно и изменению не подлежит. В случае если такой уверености нет, удобнее использовать массив или TList.
  • Kolan © (03.04.07 18:44) [18]
    > При нажатии на Далее происходил переход к следующей «должна
    > быть видна» странице.

    Только переход у тебя был?
    Те что делалось при нажатии на далее?
    Наверно у тебя был большой case и там в зависомомти от номера страницы выполнялись действия — так?
    Если так, то вот это и не подходит… :(
  • DimaBr (04.04.07 08:50) [19]

    > Внутри экшенов всегда один и тот же код:
    > Для кнопки «далее >»:
    > выпольнить текущий шаг
    > Показать следующий шаг.

    Для чего тогда создавать кучу Actions ??? Создаются два, на OnUpdate которых пишем case в зависимости от страницы.
  • DimaBr (04.04.07 08:52) [20]
  • Kolan © (04.04.07 11:38) [21]
    > case в зависимости от страницы.

    Этого не хочу как раз.
  • Kolan © (04.04.07 11:39) [22]
    > Есть уже готовый визард

    Готовый не хочу, хочу сам.
  • DimaBr (04.04.07 12:12) [23]
    Я не понимаю смысла в многочисленных Actions если они выполняют один и тотже код.

    Внутри экшенов всегда один и тот же код:
 
Конференция "Компоненты" » Помогите, делаю Wizzard незнаю как подступится…
Есть новые Нет новых   [134428   +40][b:0][p:0.001]