-
Начало тут:
http://pda.delphimaster.net/?n=0&id=1175586374Итак нужно сделать компонент(или скорее всего два) для построения Wizzard'ов.
Осн задача. Чтобы можно было делать в дизан тайме.
Что я придумал:
Написал расширеную версию TAction TWizzardStep. В нем добавил события OnShow показать шаг. OnUnExecute откатить назад.
А теперь зам виззард. Визард список шагов. Поэтому это потомок TActionList.
Запарился вот с чем:
Я посчитал что за такие действия типа «Вперед», «Назад»
Должен отвечать сам виззард. Отсюда задача:
Сделать у визарда такие свойства чтобы можо было «цеплять» их на любые контролы, но чтобы обработка реакции веласть самим визардом она одинаковая всегда
Вразумите, плз :)
-
Пока ув. ЮЗ не появился, исследуй внимательно ($DELPHI)\Source\Vcl\ActnCtrl.pas - оно оч даже по твоей теме.
-
> [1] Сергей М. © (03.04.07 16:20)
> Пока ув. ЮЗ не появился, исследуй внимательно ($DELPHI)\Source\Vcl\ActnCt
> rl.pas оно оч даже по твоей теме.
Пошел исследовать.
-
> Помогите, делаю Wizzard незнаю как подступится…
Не обязательно помогать мне разбираться в том что я придумал, может есть готовый паттерн(понятно что в GoF нет)
-
> Не обязательно помогать мне разбираться в том что я придумал
Не то что "обязательно" - оно нафих не нужно)
Бо ты пытаешься изобрести велосипед с эн-угольными колесами)
-
> эн-угольными колесами)
Я чувствую это сам. Как надо то скажите.
Можно попростому, пользуясь тем что уже есть, но мастер сложный. Хочется поудобнее сделать
-
> Сделать у визарда такие свойства чтобы можо было «цеплять» их на
> любые контролы, но чтобы обработка реакции веласть самим визардом —
> она одинаковая всегда…
private
FOnMyEvent: TMyEvent;
protected
procedure DoMyEvent; dynamic;
published
property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
end;
procedure ...DoMyEvent;
begin
...
if Assigned(FOnMyEvent)
FOnMyEvent(Self, ...);
...
end;
И в коде, где надо, вызываем DoMyEvent. То есть, и свои действия выполняем, и юзерское событие обрабатываем (ежели оно есть).
-
> То есть, и свои действия выполняем, и юзерское событие обрабатываем
> (ежели оно есть).
Не понял :( Вот я нажимаю на кнопку и что? Выполнится DoMyEvent? Да? Если да, то почему?
-
> Kolan © (03.04.07 16:51) [7]
> я нажимаю на кнопку и что?
Рекомендую не испытывать терпение ув. ЮЗ)
-
> Рекомендую не испытывать терпение ув. ЮЗ)
Блин, ну че теперь не спрашивать? Не понял я :(
Предлогается создать у кнопок(к примеру) OnClick и там вставить Wizzard.DoMyEvent ? Так DoMyEvent вроде защищена.
И еще надо же уметь делать ассоцированый контрол невидимым, недоступным(например поля заполнены неверно, конпка далее недоступна
).
-
Предлагаю описать начальное желание, а не промежуточные действия.
Вы хотите чтобы на контролах висели Actions которые можно было подменять динамически вперёд-назад. Я правильно понял ???
-
> Предлагаю описать начальное желание
Сделать виззард.
> Вы хотите чтобы на контролах висели Actions которые можно
> было подменять динамически вперёд-назад.
Примерно, только экшены не подменяються. Внутри экшенов всегда один и тот же код:
Для кнопки «далее >»:
выпольнить текущий шаг
Показать следующий шаг.
-
В итоге должно получится так:
Кидаю на форму Wizzard. Добавляю шаги. Для кожного шага делаю нужные OnShow OnExecute.
Конкретным контролам, кнопкам например, назначаю экшены «< Назад» «Вперёд >» «Отмена»
-
> Кидаю на форму Wizzard. Добавляю шаги.
Когда читаю эту фразу, то представляется, как на заснеженной форме лежит господин Wizzard. А на снегу остались следы от его шагов. Абстракционизм, какой-то. Опираясь на такую подсказку тяжело что-то посоветовать.
В своих программах, при создании "Мастеров" (волшебников, Wizzard'ов) у меня кнопки Назад и Вперёд в единственном экземпляре. Как следствие, никаких экшенов им не требуется. В зависимости от того какой экран "Мастера" виден, кнопки Вперёд/Назад могут "бледнеть", исчезать или менять название (Вперёд<->Готово).
-
В зависимости от того какой экран «Мастера» виден, кнопки Вперёд/Назад могут «бледнеть»
А в зависимости от данных введенных?
Я понял это простой вариант, я его рассматривал
Просто мастер спецефичный и должен пользователя преостеречь от всего по возможности
+ Могут быть ошибки(штатные) и нужно показывать специальные шаги(экраны если угодно) и знать что было до этого
-
В моём случае это решалось так:
Имелся список страниц (экранов, шагов) в определённом порядке, вернее их состояний "должна быть видна"/"не д.б. видна".
При изменении данных на текущей странице (CheckBox, RadioButton, Password) состояние одной или нескольких следующих страниц менялось (в событиях соотвествующих компонент). При нажатии на Далее происходил переход к следующей "должна быть видна" странице. В случае если страница последняя, то Вперёд заменяется на Готово.
-
> Имелся список страниц
Поподробнее плз TList или что?
> состояние одной или нескольких следующих страниц менялось
Что такое состояние? Тоже объект?
-
Списком страниц может быть всё что угодно. На твой вкус.
У себя я использовал
Set of Byte
в котором хранились состояния "Виден"/"Невиден" и больше ни чего. Исходил из предположения, что порядок страниц заложен окончательно и изменению не подлежит. В случае если такой уверености нет, удобнее использовать массив или TList.
-
> При нажатии на Далее происходил переход к следующей «должна
> быть видна» странице.
Только переход у тебя был?
Те что делалось при нажатии на далее?
Наверно у тебя был большой case и там в зависомомти от номера страницы выполнялись действия так?
Если так, то вот это и не подходит
:(
-
> Внутри экшенов всегда один и тот же код:
> Для кнопки «далее >»:
> выпольнить текущий шаг
> Показать следующий шаг.
Для чего тогда создавать кучу Actions ??? Создаются два, на OnUpdate которых пишем case в зависимости от страницы.
-
-
> case в зависимости от страницы.
Этого не хочу как раз.
-
> Есть уже готовый визард
Готовый не хочу, хочу сам.
-
Я не понимаю смысла в многочисленных Actions если они выполняют один и тотже код.
Внутри экшенов всегда один и тот же код: