-
Начало тут: 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 в зависимости от страницы.
|