Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расслоение логики приложения на слои 
:(
    Опции темы
Naf
Дата 26.4.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.4.2007

Репутация: нет
Всего: нет



Имеется слой бизнес-логики, в который входит класс TMetaObject, который содержит событие 
Код

OnInsertObject:TObjectEvent = procedure(Sender:TMetaObject) of object

От этого класса наследуются другие.
В слои визуального представления (формы) вызывается создание объекта потомка TMetaObject. При этом происходят манипуляции в бизнес-логике и наконец вызывается событие OnInsertObject, параметром Sender является объект, вызваший его. Теперь в зависимости от типа Sender должно открыться то или иное диалоговое окно. Как узнать какое диалоговое окно открыть? Не очень хочется пользоваться конструкцией:
Код

if Sender is <ИмяКласса> then ...

PM MAIL   Вверх
Bose
Дата 26.4.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



В классе TMetaObject объявить метод(абстрактный) ShowDialogWindow, и перекрыть(override) его в наследниках. 

После этого в обработчике OnInsertObject вызывать этот метод. 

PM MAIL WWW Skype   Вверх
Naf
Дата 26.4.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.4.2007

Репутация: нет
Всего: нет



Не хотелось бы, вдруг я решу классы бизнес-логики поместить не только в свое приложение, но и в dll превратив их в COM-интерфейсы?
PM MAIL   Вверх
Rennigth
Дата 26.4.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Naf, тогда только if is, к типу класса даже case не прикрутишь. Можно конечно придумать какой-нибудь механизм с регистрацией всех наследников TMetaObject, и какой-нибудь manager будет рулить и распозновать их. Но это тебе уже решать насколько тебе критична универсальность.  smile 



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Bose
Дата 26.4.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(Naf @  26.4.2007,  13:06 Найти цитируемый пост)
Не хотелось бы, вдруг я решу классы бизнес-логики поместить не только в свое приложение, но и в dll превратив их в COM-интерфейсы?

ну тогда вместо вызова метода общего предка делать запрос интерфейса и вызывать метод показывающий это окно. Например:
Код

IShowShowDialogWindow=interface
  procedure ShowDialogWindow;
end;


Либо, как вариант, вводи свою классификацию типов объектов(либо типов DialogWindow) Tmetatype(например). Пусть каждый из наследников TmetaObject возвращает своё собственное значение. И тогда вместо 
Код

if Sender is <ИмяКласса> then ...

используй что-то в типа
Код

procedure TblahblahMetaObject.OnInsertObject(Sender:TObject);
var 
  tmpType: Tmetatype; // или как там этот тип назовёшь
begin
  case (Sender as TMetaObject).GetMetaType of
   ...

Но это, имхо полезно только в случае, если во что бы то ни стало хочешь отвязаться от сравнения классов...  smile 
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0941 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.