![]() |
| ||
|
|
Новости |
Поиск |
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'а
А что вы посоветуете?
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