Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Реализация интерфейса-мастера.


Страницы:   1 2 3 4 5

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' надо заменить на константы. А вот с возврящаемыми значениями у меня лучьше имхо, они прям из экшенов беруться…

Вообще пример я понял. Благодарю, пригодится.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо