![]() |
| ||
|
|
Новости |
Поиск |
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'а
А что вы посоветуете?
KSergey (2008-03-06 13:54:00) [21]Да, не факт, что sStateCanceled, sStateEnded есть смысл добавлять в общую кучу состояний
Может удобнее отдельный флажек завести.
KSergey (2008-03-06 13:52:00) [22]> Kolan © (06.03.08 09:42) [60]
> Есть 3 формы.
>
> TForm1, TForm2, TForm3
>
> Есть 3 состояния:
>
> TStates = ( sState1, sState2, sState3 );
> Пусть из формы 1 надо вытащить и сохранить переменную S и передать её TForm3.
Я не понимаю что тут может быть непонятно. Лучже бы ваш пример глянуть.
Вот мое видение, очень схематично. Предполагаю (для краткости), что все формы созданы ранее. Конструкции пишу очень на память, в хелп за синтаксисом лазить лень. Так что формально может и не компилируемый код.
mrNext, mrBack, mrCancel - просто доопретелил бы свои, отсутствующие.
Расширим TStates:
TStates = ( sState1, sState2, sState3 , sStateCanceled, sStateEnded );
Ну и код некоей процедуры, запускаемой при старте программы:
CurState: TStates;
CurState := sState1;
while ((CurState <> sStateCanceled) OR (CurState <> sStateEnded))
begin
case CurState
sState1:
begin
Res := Form1.ShowModal;
if Res <> mrCanceled then
DataModule.ParameterS = Form1.S;
if Res = mrNext then CurState := State2;
end;
sState2:
begin
Res := Form2.ShowModal;
if Res = mrNext then CurState := State3
else if Res = mrBack then CurState := State1;
end;
sState3:
begin
Form3.S := DataModule.ParameterS;
Res := Form3.ShowModal;
if Res = mrBack then CurState := State2;
end;
end;
// Здесь в CurState имеем sStateCanceled или sStateEnded
// Делаем что нам надо после завершения визарда, если его завершение вообще предполагается.
Этот вариант для случая, когда нужны непоследовательные варианты перехода между шагами, зависящие от введенных данных (здесь просто не показано для простоты). Добавляется в логику if Res = ... then CurState := ...
Если же все перемещения только тупо вперед-назад - то проще массив ссылок на формы (или классы) - и тупо индекс гонять. Или если перечисление (классов, например) - то к переменной типа перечисление применимы Inc/Dec (если не ошибаюсь) и возможность определения граничный это элемент или нет.
KSergey (2008-03-06 13:30:00) [23]По поводу передаваемых данных "из формы в форму" - предлагаю уйти от этой практики (уже писал об этом!)
Раз уж это цельный визард - то наверняка суть не столько в том, чтобы из формы в форму что-то передать - а настроить несколькими формами параметры некоего цельного внешнего объекта.
А значит и разносить данные по фотмама - нецелесообразно, по-моему. Даже если часть данных, нужных для форм, не требуются внешнему объекту - ну просто сгруппировать соотв. образом это все в структуре - да и всех дел.
KSergey (2008-03-06 13:23:00) [24]> Семеныч (06.03.08 10:49) [62]
> Ветка держится неделю. Ей-богу, за это время можно было
> уже весь визард написать.
Вот все о том же пытаются сказать.
Блин, давно бы уже написал хоть как-нибудь - и было бы видно: хорошо это или нет.
Бесполезно так вот на расстоянии получить ответ, который стопудово будет самым правильным.
Хотя я помнимаю это желание, сам им часто страдаю.
clickmaker (2008-03-06 11:22:00) [25]
> [63] clickmaker © (06.03.08 11:06)
>
> > Пусть из формы 1 надо вытащить и сохранить переменную
> S
> > и передать её TForm3.
кстати, о птичках.
Почему бы не сделать список данных форм, ключом в котором будет класс формы (или имя класса)?
Форма при по нажатию на Next просто добавляет/обновляет данные в этот список.
Тогда на любом шаге можно обратится к данным одной из предыдущих форм вызовом Data := GetFormData(Form1).
Где data - наследник абстрактного класса наподобие TFormData. Из экземпляров наследников этого класса и состоит список.
форма 3 знает, что ей надо получить именно TForm1Data:
var
Data: TForm1data;
Data := GetFormData('Form1');
clickmaker (2008-03-06 11:06:00) [26]
> Пусть из формы 1 надо вытащить и сохранить переменную S
> и передать её TForm3.
а какие проблемы?
массив параметров, индекс = шаг
для пущей универсальности в структуре, которая хранит параметры отдельно взятого шага, можно юзать Variant или что-то типа Name = Value
Семеныч (2008-03-06 10:49:00) [27]> Kolan © (06.03.08 09:42) [60]
Ветка держится неделю. Ей-богу, за это время можно было уже весь визард написать. Притом, достаточно неплохо приспособленный для своей последующей модификации, ежели она потребуется.
Не мудри. Из пушки по воробьям стреляешь. Это не та задача, где требуется Гради Буча сначала проштудировать.
oxffff (2008-03-06 10:36:00) [28]NO COMMENTS. :)
Kolan (2008-03-06 09:42:00) [29]> Сам же написал: «такой трудно сопроваждать». И это понятно,
> т.к. вся логика разбросана по разным местам.
А, я думал он наоборот считает что это нормально
Я честно так и не понял что конкретно вы предлагаете.
Давайте на простом примере.
Есть 3 формы.
TForm1, TForm2, TForm3
Вы говорите используй состояния ок. Есть 3 состояния:
TStates =
(
sState1,
sState2,
sState3
);
Как предлагается все это увязать? Пусть из формы 1 надо вытащить и сохранить переменную S и передать её TForm3.
Варик с сразу созданными формами еще плох тем, что придется делать очищение их.
> Keep It Simple Stupid
Вот клянусь именно этого и хочу, но не получается :(
KSergey (2008-03-06 09:33:00) [30]> Kolan © (06.03.08 09:24) [58]
> > No comments!
> Почему?
Сам же написал: "такой трудно сопроваждать". И это понятно, т.к. вся логика разбросана по разным местам.
Kolan (2008-03-06 09:24:00) [31]> No comments!
Почему?
Германн (2008-03-06 03:31:00) [32]
> Kolan © (05.03.08 20:33) [56]
>
> > что круглые сутки отображать одну из этих 25 форм
>
> Не это некй измеритель. То есть формы сменяют друг друга.
> Программа то раьботает с БД, то с ком портом…
>
>
Ну и пусть формы меняются. Тем более KSergey © (05.03.08 17:37) [54].
А при чём тут БД или Сом-порт?
>
> У меня есть даже самописный компонент такой. Там вся логика
> получается в событиях OnExecute (так работают большиство
> визардов) и.т.д. Опыт паказал, что код такой трудно сопроваждать.
>
>
No comments!
Kolan (2008-03-05 20:33:00) [33]> что круглые сутки отображать одну из этих 25 форм
Не это некй измеритель. То есть формы сменяют друг друга. Программа то раьботает с БД, то с ком портом
> Сделал case и радуешься.
Я его и сделал, только вот строки использовал в кач состояни(наверно переделаю). А как предлагается?
> Но все равно. PageControl
У меня есть даже самописный компонент такой. Там вся логика получается в событиях OnExecute (так работают большиство визардов) и.т.д. Опыт паказал, что код такой трудно сопроваждать.
Кроме того в визаде только далее и назад, ну отмена, а тут у меня хз сколько событий будет.
TStas (2008-03-05 19:01:00) [34]Но все равно. PageControl - по сути, те же формы. 25 - это очень даже пристойное число и сразу их создать, если прога никогда не выключается - вполне разумное решение. Я верю, что мощнее, но принцип-то тот же: нажмите кнопочку 1, посмотрите, сколько вы ошибок наделали, вернитесь к шагу 1 и т. д. Это тот же принцип, что и мастера установки чего-нибудь.
>если в память влезут Так ведь сама форма (экземпляр) не очень много занимает в памяти, а класс формы там так и так висит. А потом ну не байты же вы считаете.
KSergey (2008-03-05 17:37:00) [35]> Kolan © (05.03.08 16:22) [53]
> Нехочется держать все в памяти.
А я бы все же замерил. Памяти потребление.
Т.к. если аппарат будет заниматься только тем, что круглые сутки отображать одну из этих 25 форм - то скорее эффективнее их сразу все создать (если в память влезут и скорее всего влезут), нежели каждый раз напрягать менеджер кучи перераспределять адресное пространство.
Еще не известно не загнется ли этот менеджер через месяц непрерывной работы приолжения постоянно перераспределяя память (в смысле - не фрагментируется ли память до полного изнеможения).
Kolan (2008-03-05 16:22:00) [36]> PageControl использовать
Нехочется держать все в памяти. Аппарат гораздо менее мощный чем платилка.
TStas (2008-03-05 16:12:00) [37]Простите чайника, может, я чего-то не понимаю, но почему нельзя PageControl использовать? И, конечно, Sender, а не case? Это же, как я понял, получится что-то вроде телефонной платилки? Просто я когда-то задавал аналогичный вопрос и мне ответили, что это и есть общепринятый способ. TabVisible := False и все. И тут хоть 100 шагов можно вставить, если пользователь не уйдет. И последовательность как угодно менять. и обращаться к ним хоть через Sender, хоть через ActivePageIndex
Игорь Шевченко (2008-03-05 11:44:00) [38]
> Самое доинное — 5 шагов.
И чего ты маешься ? Классы-фигасы. Сделал case и радуешься. Код вполне сопровождаемый получится.
Keep It Simple Stupid
Kolan (2008-03-05 10:22:00) [39]Нет, это всего возможных. Самое доинное 5 шагов.
Игорь Шевченко (2008-03-05 10:21:00) [40]Kolan © (05.03.08 08:59) [48]
Это как понимать ? Некоторое действие будет выполняться за 25-30 шагов ?
Никому плохо не станет ?