![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Реализация интерфейса-мастера.
Kolan © (2008-02-29 17:02:00)Здравствуйте,
Разрабатываю программу для тач скрина. Интерфейс (все представляют терминал оплаты) состоит из нескольких экранов, которые работают как мастер.
Вопрос как это реализовать?
Как показывать окна я придумал, имхо, надо использовать некие мета данные, где описаны какие окна должны открываться.
А вот как быть с остальными (кроме показа окон) действиями?
Допустим есть 4 шага. На шаге 2 пользователь вводит данные, а на шаге 4 их надо обработать как-то.
У меня есть идея, но она мне ненравится из за условного выражения.
Чтобы перейти на сл экран пользователь жмет «далее». Соотв при нажатии далее возникает событие «Далее(Sender)», где сендер это окно где нажали далее. Какое следующее окно паказать написанно в мета данных, а что сделать определяется по Sender.
То есть что-то вроде:
if Sender.StepNumber = 2 then
if Sender.StepNumber = 4 then
ShowMessge()
Мне ненравится такой подход из за if'а
А что вы посоветуете?
Семеныч (2008-03-03 14:03:00) [81]> Kolan © (03.03.08 13:35) [7]
Вместо if можно вызывать некий метод (или процедуру), но не напрямую, а по ссылке, которая хранится в некоей переменной и устанавливается конечным автоматом в зависимости от его текущего состояния.
Kolan (2008-03-03 13:35:00) [82]Плохо тем, что неудобно добавлять или удалять экраны. Кроме того экранов много и иф будет большой неудобно. А еще есть как-бы разные ветки, несвязаные друг с другом, и все это будет в одном месте
clickmaker (2008-03-03 13:15:00) [83]
> Мне ненравится такой подход из за if'а
не вижу логики.
Чем if-то плох?
Kolan (2008-03-03 10:09:00) [84]Мож есть у кого еще идеи?
Kolan (2008-03-01 14:07:00) [85]> Может взять компонент аля wizard?
А как он работает?
Визард (собссно есть свой) это страницы (на подобии PageControl) которые лежат на форме, то есть. Мне бы хотелось не создавать ненужные окна.
b z (2008-03-01 12:42:00) [86]
> Мож есть еще идеии?
Может взять компонент аля wizard?
Kolan (2008-03-01 10:37:00) [87]> И анализировать этот State при действиях
И сделать большой кейс? Ну я тоже самое и предложил, только в моем случае эти стейты хроняться в самих окнах как бы, и передаются по событию
В стейтах плохо то, что трудно модифицировать такой автомат, я так пробовал.
Например бы такой:
case Stae of:
asStartState:
begin
DoSmth;
State := asState2;
end;
asasState2:
begin
State := CompleteState;
end;
asCompleteState:
begin
end;
Теперь если надо вставить asState1 между asStartState и asasState2, то надо менять ссылки неудобно.
Кроме того, нафига состояния если состояние однозначно связано с показываемым экраном, так почему бы не использовать сам экран(то есть форму у меня) в качестве состояния.
Если бы надо было бы только показывать экраны, то я бы сделал, наверно, такой файлик:
У окон есть номера.
[0.0]
Next=0.1
[0.1]
Next=0.2
Back=0.1
То есть некие мета данные Загружал бы его и при возникновении события «Back» в окне «0.1» я бы знал, что надо перейти в окно 0.1
Но вот как быть с выполнением действий хз.
Плюс ко всму окон много и кейс будет здоровый
Мож есть еще идеии?
Игорь Шевченко (2008-03-01 00:05:00) [88]
> А что вы посоветуете?
Конечный автомат.
type
TAutomataState = (asStartState, asState1, asasState2, asCompleteState);
И анализировать этот State при действиях