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'а…

А что вы посоветуете?


Kolan   (2008-03-05 08:59:00) [41]

> Автор, а у тебя сколько шагов и сколько различных форм вызывается
> ?

Где-то 25 ±5.
Из них 1-2 используются в нескольких местах.


Игорь Шевченко   (2008-03-04 21:42:00) [42]

Автор, а у тебя сколько шагов и сколько различных форм вызывается ?


oxffff   (2008-03-04 19:48:00) [43]


> oxffff ©   (04.03.08 19:47) [45]

Sorry
(TAbstractStepClass)) =  (TAbstractStep))
TAbstractStepClass=class of TAbstractStep;


oxffff   (2008-03-04 19:47:00) [44]


> oxffff ©   (04.03.08 19:40) [44]


А шаги задаются на лету (DLL).
Например шаг
  Выбор директории (класс TStepDirectorySelection(TAbstractStepClass)), где
TAbstractStepClass=class of TAbstractStepClass;

Controler.Add(TStepDirectorySelection.create(TStepConfirm)    <-параметр следующий шаг.
Причем не обязательно определять порядок создания.
Шаги можно доинициализировать в порядке добавления других шагов (естественно предусмотрев это в виде контракта).


oxffff   (2008-03-04 19:40:00) [45]


> Усложняя "ядро".


Да нет здесь никакого усложнения вся логика перехода может быть посредоточена NodeStep, который запрашивает у контролера нужный переход по строке, по классовому типу и т.д.
Причем переход может быть статичен,
либо динамический передача параметра перехода (следующего шага) в конструкторе. Задача контролера выполнить действие по запросу нода, предоставить экземпляр типа по строке или классовому типу. И все. Причем действительно контроллер отвязан от логики (можно не перекомпилировать)
А логика задается в Шагах.


KSergey   (2008-03-04 16:12:00) [46]

> Kolan ©   (04.03.08 16:00) [42]
> Не ничего, а мак. просто. :)

Так опять же - это от ситуации зависит.
Если переход межту отдельными шагами весьма не тривиален - то от case - не отвертеться. Ну либо от каких-либо метаданных, которые по сути будут этот case описывать. Усложняя "ядро".

Если же логика простейшая - то [11].


Kolan   (2008-03-04 16:00:00) [47]

> ничего

Не ничего, а мак. просто. :) Строковые мож и прям не поделу…


KSergey   (2008-03-04 15:58:00) [48]

Я не знаю что еще можно добавлять
Я вроде все написал.

По поводу статичности - не понятно о какой динамике речь. Что-то - в любом случае править: или код программы или метаданные в виде внешнего файла, к примеру (это для особых ценителей настроек без перекомпиляции).

Про перечисления - я лишь говорю о том, что не надо тут использовать строковые константы. Просто не по делу тут строки.

Короче принципиально архитектурно я не вижу как это все можно изменить так, чтобы при добавлении/изменении ничего еще и не править :)


Kolan   (2008-03-04 14:53:00) [49]

> А у тебя тоже все статично.

Ну а как без этого, хоть ListClass не править.


> Захочешь добавить будешь править свой

Этим мне и ненравится кейс… О чем собссно и вся ветка с самого начала…

Имел это ввиду…


oxffff   (2008-03-04 14:48:00) [50]


> Kolan ©   (04.03.08 14:17) [38]


Перечитай сначала. :)


Kolan   (2008-03-04 14:17:00) [51]

> А у тебя тоже все статично. Захочешь добавить будешь править
> свой

Ну а как без этого, хоть ListClass не править. Этим мне и ненравится кейс… О чем собссно и вся ветка с самого начала…


oxffff   (2008-03-04 14:05:00) [52]


> Kolan ©   (04.03.08 12:54) [36]
> А делать такую хрень:
> ListClass : TListClass  = (TEdit , TButton , TCheckBox ,
>  TLabel ) ;


А у тебя тоже все статично. Захочешь добавить будешь править свой

procedure TSystemController.Act(ASenderWindowCode,
APerformedActionName: string);
begin
if ASenderWindowCode = 'Start' then
begin
  ShowWindow('0.0');
end;                

if ASenderWindowCode = '0.0' then
begin
  if APerformedActionName = 'Settings' then
    ShowWindow('7.0');
end;

if ASenderWindowCode = '7.0' then
begin
  if APerformedActionName = 'Back' then
    ShowWindow('0.0');    
end;

end;


Kolan   (2008-03-04 12:54:00) [53]

А делать такую хрень:
ListClass : TListClass  = (TEdit , TButton , TCheckBox , TLabel ) ;

Длинну которой придется кажды раз руками менять, и в которую еще надо будет вручную добавлять компоненты я нехочу. Я сделал тоже самое, но более автоматизировано.

Каждая форма регистрирует совй класс в фабрике:
initialization
GetWindowsFactory.AttachTouchFormClass(TSettingsForm);


А вот создание:
function TWindowsFactory.CreateWindow(AWindowCode: string;
 AControllerInterface: IControllerInterface;
 AOtherInterfacesObjetc: TObject): TCustomTouchForm;
var
 FormClass: TCustomTouchFormClass;
begin
 Result := nil;
 FormClass := FFormsClasses.FindFormClass(AWindowCode);
 if FormClass <> nil then
   Result := FormClass.Create(AWindowCode, AControllerInterface, AOtherInterfacesObjetc);
end;


Kolan   (2008-03-04 12:50:00) [54]

> [34] KSergey ©   (04.03.08 12:44)

Ты че издеваешься что ли? Ты думаешь я незнаю как создать форму что ли? Ты покажи напримере как ты сделаешь с состояниями, я же мысли не читаю.

«Используй перечисление» — это что, то что их как-то можно использовать я понимаю и так? Тут же вопрос именно как все организовать…


KSergey   (2008-03-04 12:44:00) [55]

> Kolan ©   (04.03.08 12:37) [33]
>  как инстанцировать и убивать формы…

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
раздел "Лень, как источник вдохновения."


Kolan   (2008-03-04 12:37:00) [56]

> А чем [1] не нравится?

Я не поняимаю как конкретно рпелагается это решнение использовать, как инстанцировать и убивать формы…


KSergey   (2008-03-04 12:17:00) [57]

> Kolan ©   (04.03.08 11:56) [31]
> > указанному классу создавать
> А кто укажет его?

Тот же контроллер, но сразу нужный класс формы шага. И все. Никаких рукописных фабрик классов не надо.

> Kolan ©   (04.03.08 11:56) [31]
> Ладно, а где их хранить, приведи пример…

А чем [1] не нравится?


Kolan   (2008-03-04 11:56:00) [58]

> Зачем люди переносят заморочки, требуемые в С++

Я его с трудм читаю…

> указанному классу создавать

А кто укажет его?


> А использовать по тексту строковые константы — ваще капец.

Ладно, а где их хранить, приведи пример…


KSergey   (2008-03-04 11:30:00) [59]

Зачем люди переносят заморочки, требуемые в С++ в дельфийский код? В дельфи можно и без всякие рукописных прибабахнутых фабрик объекты по указанному классу создавать, все для этого в компиляторе уже есть. Зачем отсебятину придумывать? Да и все сознаддые формы в Screen.Forms уже есть. Хотя, конечно, иногда бывает проще свой список поддерживать, только для требуемых форм, но тоже вопрос еще.

А использовать по тексту строковые константы - ваще капец. Описка в букве - и превед отладчег. Можно ведь и просто константами все описать, причем - перчислением, как и было сказано. Они - integer, их проверять быстрее у процессора выходит, да и описки - компилятором все отловятся.

В общем на мой вкус - много лишних сущностей. Но это наверняка субъективно.


Kolan   (2008-03-04 10:45:00) [60]

К когду контроллера прилагается State Chart…


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

Наверх

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