![]() |
| ||
|
|
Новости |
Поиск |
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 18:02:00) [1]> clickmaker © (06.03.08 17:41) [86]
> procedure TWizardFrame1.SaveData;
> procedure TWizardFrame2.SaveData;
Вот я тоже, к стати, думал, что так будет лучше и правильнее.
Но надеялся, что автор сам сможет подобный перенос сделать, потому писать не стал :)
Kolan (2008-03-06 17:58:00) [2]Понял. Много лишнего делать придется для каждого окна. Я же хочу его не закрывать пока оно еще может понадобится в том же виде.
ЗЫ
Вообще пошел я делать, всех благодарю. :)
clickmaker (2008-03-06 17:41:00) [3]
> где ты будешь сохранять данные в GetNextFrameClass что ли?
в SaveData у конкретного фрейма. Который знает, что ему нужно сохранить.
Для любителей примеров:
TWizardData = class
public
UserName: string;
Email: string;
Address1: string;
Address2: string;
Phone: string;
end;
var
WizardData: TWizardData; // глобальная
procedure TWizardFrame1.SaveData;
begin
WizardData.UserName := edName.Text;
WizardData.Email := edEmail.Text;
end;
procedure TWizardFrame2.SaveData;
begin
WizardData.Address1:=
...
end;
можно структуру разнести по нескольким, по числу страниц. Тогда будет глобальный список вместо переменной
Kolan (2008-03-06 17:31:00) [4]> опять двадцать пять. Список кто мешает сделать с данными?
А опять 25 из-за того, что я реально невижу где ты будешь сохранять данные в GetNextFrameClass что ли?
Kolan (2008-03-06 17:28:00) [5]
> не ну правда.
Есть ессно, только толку от них мало, я же хочу узнать как еще можно.
1. На счет сохранения я думаю, что это приличный геморой, бо формы разные, как их запоминать ..
2. Раз у тебя есть событие Next, значит будут и другие. Логика будет по ним распыляться. А еще часть её будет вGetNextFrameClass и GetPriorFrameClass- тоже распыление.
Я прошу пример, не потому, что хочу скопировать его, вставить и все. Я хочу точно понять что предлагается, без кода понять невозможно.
Разница между "И анализировать этот State при действиях" и KSergey © (06.03.08 13:52) [67] огромна (для меня), хотя вроде одно и тоже.
clickmaker (2008-03-06 17:20:00) [6]
> событий типа TWizardForm.Next() разное кол-во на разных
> формах
это как?
> есть как запомнить на шаге 2 и показать на шаге 4
опять двадцать пять. Список кто мешает сделать с данными?
KSergey (2008-03-06 17:19:00) [7]> Kolan © (06.03.08 17:15) [80]
> Тут непонятно:
Мне вот любопытно: а у самого мысли есть по этим вопросам?
не ну правда. Сначала выкладыватся жутко навороченный код, а потом вдруг начинают задаваться элементарные вопросы.. Я вот никак не могу в голове своей это срастить...
Kolan (2008-03-06 17:18:00) [8]> [79] KSergey © (06.03.08 17:13)
А если как ты предлагаешь сразу все создать, то надо будет очишать, сохранять и востанавливать состояния окон
Kolan (2008-03-06 17:15:00) [9]
> как-то так
Тут непонятно:
1. Как и куда сохранять данные фрейма.
2. Как и когда их восстанавливать.
3. Куда помещать логику связей. То есть как запомнить на шаге 2 и показать на шаге 4.
4. Что делать с тем пунктом, что событий типаTWizardForm.Next()разное кол-во на разных формах...
KSergey (2008-03-06 17:13:00) [10]> b z (06.03.08 17:07) [78]
> Можно (или нужно) "захэшировать", с учетом - Back (Previous) и т.д.
Автору хочется напрягать менеджер кучи и ядро винды для создания окон и выделения/уничтожения для них GDI-объектов по полной программе.
Флаг ему в руки.
b z (2008-03-06 17:07:00) [11]
> Вопрос снимается, она же по ShowModal закрывается…
формы, патерны, классы, "фигасы" ... :(
> FCurrentFrame.Free;
Можно (или нужно) "захэшировать", с учетом - Back (Previous) и т.д.
clickmaker (2008-03-06 16:59:00) [12]
> только на мини примере
type
TWizardFrame = class(TFrame)
...
TStep1Frame = class(TWizardFrame)
...
TStep25Frame = class(TWizardFrame)
...
TWizardFrameClass = class of TWizardFrame;
var
FCurrentFrame: TFrame;
procedure TWizardForm.Next()
begin
FcurrentFrame.SaveData();
FCurrentFrame.Free;
CurrFrameClass := GetNextFrameClass(Step); // TWizardFrameClass
FCurrentFrame := CurrFrameClass.Create(Self);
FCurrentFrame.Parent := Self;
FCurrentFrame.Visible := true;
end;
как-то так
Kolan (2008-03-06 16:47:00) [13]> понаделай фреймов, а потом по нажатию кнопок на форме убирай
> один, создавай и показывай другой
Понимаешь, когда ты так говориш, то я в принципе понимаю. Но в принципе я и так могу понять. А точо понять что ты предлагаешь можно только на мини примере. Типа [67] KSergey.
> впрочем, непонятно
Суть в предыдущих 70 постах. :)
Kolan (2008-03-06 16:42:00) [14]Вопрос снимается, она же по ShowModal закрывается
clickmaker (2008-03-06 16:33:00) [15]
> Приведи пример…
dfm сюда выложить? Злой ты ))
понаделай фреймов, а потом по нажатию кнопок на форме убирай один, создавай и показывай другой
Parent := Form, ну и тыпы
впрочем, непонятно как [71] сочетается с [4] - "Визард (собссно есть свой) — это страницы (на подобии PageControl) которые лежат на форме"
Kolan (2008-03-06 16:25:00) [16]> [72] clickmaker © (06.03.08 16:23)
> почему не одна форма с меняющимися фреймами?
Потому, что ты понимаешь как это сделать, а я нет. Приведи пример
clickmaker (2008-03-06 16:23:00) [17]
> как при возврашении назад из шага 3 в шаг 2 показать форму?
> Она же уже показана, причем модально
для каждой страницы - форма модально?
почему не одна форма с меняющимися фреймами?
Kolan (2008-03-06 16:21:00) [18]
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;
Интересно, а как при возврашении назад из шага 3 в шаг 2 показать форму? Она же уже показана, причем модально
Kolan (2008-03-06 15:10:00) [19]Все, я все понял, сделаю как KSergey, только с возвращ. занчениями сделаю как у меня
Я понял в чем тут плюс, формами легко управлять. Благодарю еще раз :)
Kolan (2008-03-06 15:05:00) [20]> По поводу передаваемых данных «из формы в форму»
Из формы в ворму я ниче не буду передавать. Буду использовать посетителя, то есть форма для работы будет требовать интерфейсы. Это метод проверен, и он оч. удобен.
> Блин, давно бы уже написал хоть как-нибудь
Я пока другие места прорабатывал
> [67] KSergey © (06.03.08 13:52)
Вот, пример которого я хотел :)
if Res mrCanceled then
DataModule.ParameterS = Form1.S;
if Res = mrNext then CurState := State2;
В вот этих результатов (mrCanceled, mrNext ) может быть еще несколько, на каждой форме разное кол-во. На одной «Добавить», на другой «Настройки» . Придется при возникновении нового дополнять перечисление.
В итоге вроде у меня получается почти тоже самое, только строки типа '0.1' надо заменить на константы. А вот с возврящаемыми значениями у меня лучьше имхо, они прям из экшенов беруться
Вообще пример я понял. Благодарю, пригодится.