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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Условия для компилятора 
:(
    Опции темы
gesper
Дата 1.1.2013, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



В Delphi можно организовать проверку по условию, чтобы часть когда включалась в программу только если есть к примеру какой то модуль подключенный в программе?

пример:

в программу добавлены Unit1, Unit2, Unit4
на форме есть кнопка с тремя частями кода. Хочу чтобы одна из частей когда не игнорировалась компилятором, если в программе отсутствует подключенный модуль Unit3.

Одну и туже форму хочу использовать в разных программах, где отличия будут в наборе модулей.

Дерективы описанные в этой теме http://forum.vingrad.ru/topic-157380.html могут проверять как то наличие файлов?

Это сообщение отредактировал(а) gesper - 1.1.2013, 17:34
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
northener
Дата 2.1.2013, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

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



Можно, но по другому.
Код

uses 
  main,
  {$IFDEF UseUnit3}
   unit3,
   {$ENDIF}
   Unit1, Unit2, Unit3;
    



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
skyboy
Дата 2.1.2013, 01:50 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



человече, мой совет - не надо делать так, это не очень хорошо. 
я понимаю, что условия разные. иногда надо "сделать на вчера", но если есть хоть денек на "подумать", лучше не брать первое попавшееся решение. 
в данном случае, вариант с условными директивами нихрена не гибкое, не очевидное, не расширяемое, и толком не отлаживаемое.
давай же подробности — найдем архитектурное решение вместо костыля  smile 
PM MAIL   Вверх
gesper
Дата 2.1.2013, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Цитата(skyboy @ 2.1.2013,  01:50)
человече, мой совет - не надо делать так, это не очень хорошо. 
я понимаю, что условия разные. иногда надо "сделать на вчера", но если есть хоть денек на "подумать", лучше не брать первое попавшееся решение. 
в данном случае, вариант с условными директивами нихрена не гибкое, не очевидное, не расширяемое, и толком не отлаживаемое.
давай же подробности — найдем архитектурное решение вместо костыля  smile

Описание задачи я дал - внутри формы иметь возможноть компилировать при отсутствии нескольких модулей. Пример, это программа с своей БД и отдельно выполненная программа с тем же окном БД для ее заполнения. Если директивы на ваш взгляд не лучшее решение, то какие есть предложения, как вы такие ситуации решаете(на примерах)? Чем не лучше указаный вариант?

Добавлено @ 02:49
Цитата(northener @ 2.1.2013,  01:39)
Можно, но по другому.
Код

uses 
  main,
  {$IFDEF UseUnit3}
   unit3,
   {$ENDIF}
   Unit1, Unit2, Unit3;
    

сделал но с дополнением, чтобы везде дерективы не писать, модулей много...

Код


{$I def.inc}// один файл определяет какие модули и части кода использовать
uses 
  Window,Form,...,SysUtils
  {$IFDEF UseUnit1} ,unit1 {$ENDIF}
  {$IFDEF UseUnit2} ,unit2 {$ENDIF}
  {$IFDEF UseUnit3} ,unit3 {$ENDIF}  
   ;    


Это сообщение отредактировал(а) gesper - 2.1.2013, 02:51
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
skyboy
Дата 2.1.2013, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



зачем у тебя uses файла, который не используется?
а если используется — нормален ли код, который не получит доступа к unit3?

Добавлено через 19 секунд
и вопрос века — что же в себе содержит unit3?
PM MAIL   Вверх
gesper
Дата 2.1.2013, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Цитата(skyboy @ 2.1.2013,  08:34)
зачем у тебя uses файла, который не используется?
а если используется — нормален ли код, который не получит доступа к unit3?

Добавлено @ 08:34
и вопрос века — что же в себе содержит unit3?

Извини, что носом тыкаю, но два раза сказал


Одну и туже форму хочу использовать в разных программах, где отличия будут в наборе модулей.

Поясняю: Есть форма, из которой управляетса содержимое, ну к примеру, 3-х классов. Есть идея иметь отдельно некоторые функции программы, в виде маленькой программы. Естественно, что форма будет требовать unit-ы которые относяться к полному функционалу, что нам не нужно. Через директивы компилятора это в принцыпе очень удобно получилось реализовать. Просто и удобно. Действия программы уже были на функции разбиты и заключить их в условия компилятора не составило трудов. Вот так.

unit1,2,3 - это описания разных классов и их функции.

Учусь на практике, когда есть время, может когда то более лаконичный вариант буду знать smile

Это сообщение отредактировал(а) gesper - 2.1.2013, 14:45
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
skyboy
Дата 2.1.2013, 16:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Цитата(gesper @  2.1.2013,  13:44 Найти цитируемый пост)
Извини, что носом тыкаю, но два раза сказал
Одну и туже форму хочу использовать в разных программах, где отличия будут в наборе модулей

ты мне не ответил на вопрос — что мешает сделать код этой "формы" не зависящим от других модулей.
если у тебя обращение к коду стороннего модуля происходит по условию, то надо было сделать родительский основной класс, который знать не знает про дополнительные модули, и его наследник — в котором часть методов переопределяется для обращения к какому-то стороннему модулю.
PM MAIL   Вверх
northener
Дата 2.1.2013, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

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



Цитата(gesper @  2.1.2013,  02:44 Найти цитируемый пост)
сделал но с дополнением, чтобы везде дерективы не писать, модулей много...

Я делал по другому. Сделал несколько проектов с разными именами и в Defines/Conditionals каждого записал разные наборы условий. Из этих проектов составил группу проектов. Теперь если изменяется один из общих модулей делаю Build all projects.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
gesper
Дата 2.1.2013, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Цитата(skyboy @ 2.1.2013,  16:49)
Цитата(gesper @  2.1.2013,  13:44 Найти цитируемый пост)
Извини, что носом тыкаю, но два раза сказал
Одну и туже форму хочу использовать в разных программах, где отличия будут в наборе модулей

ты мне не ответил на вопрос — что мешает сделать код этой "формы" не зависящим от других модулей.
если у тебя обращение к коду стороннего модуля происходит по условию, то надо было сделать родительский основной класс, который знать не знает про дополнительные модули, и его наследник — в котором часть методов переопределяется для обращения к какому-то стороннему модулю.

Понимаю о чем ты, но сформулировать сложно почему так делаю.

Есть общие понятия описывающие человека физиологически(родительский класс), но врачу так же нужны данные, чем оличиается мальчки от девочки. И этот врач может работать в мужской клинике, а может в общей клинике, где лечат и тех и других. Если ему изначально не заложить не предоставить полного описания отличий (класса наследника) то он не сможет вылечит пациента. 

Многие программы страдают тем, что используют типовой инспектор обьектов работы с БД, и недают пользователью удобного интрефейса управления данными. Либо мы даем программе модули, где сказано в чем отличия классов, либо получаем неработающую форму редактора, или неудобную форму редактора. 

Цитата

Я делал по другому. Сделал несколько проектов с разными именами и в Defines/Conditionals каждого записал разные наборы условий. Из этих проектов составил группу проектов. Теперь если изменяется один из общих модулей делаю Build all projects.

я так же, только модули общие в папке "general" и сгруппировать не успел еще проекты, поскольку прорабатываю менеджер работы с БД, а потом нарасчивать функционал начну.
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
northener
Дата 3.1.2013, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

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



Цитата(skyboy @  2.1.2013,  16:49 Найти цитируемый пост)
Цитата(gesper @  2.1.2013,  13:44 Найти цитируемый пост)
Извини, что носом тыкаю, но два раза сказал
Одну и туже форму хочу использовать в разных программах, где отличия будут в наборе модулей

ты мне не ответил на вопрос — что мешает сделать код этой "формы" не зависящим от других модулей.
если у тебя обращение к коду стороннего модуля происходит по условию, то надо было сделать родительский основной класс, который знать не знает про дополнительные модули, и его наследник — в котором часть методов переопределяется для обращения к какому-то стороннему модулю. 

Вы не "въехали" в вопрос/сабж.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
skyboy
Дата 3.1.2013, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



northener, можешь пояснить?
PM MAIL   Вверх
northener
Дата 3.1.2013, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

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



Цитата(skyboy @  3.1.2013,  09:35 Найти цитируемый пост)
northener, можешь пояснить? 

Постараюсь.
Вот есть у меня проект. ПО работающее с неким внешним железом, показывающее его состояние, посылающее ему команды по требованию оператора, полующее и анализирущее ответы железа.  К этому ПО желательно иметь демоверсию, которая выглядит и "работает" абсолютно также, но не работает с реальным железом, а симулирует такую работу. Кроме того есть т.н. дополнительное рабочее место. ПО, которое выглядит также как основное, показывающее реальное текущее состояние железа, но не управляющее этим железом. Все три программы имеют почти одинаковый набор модулей/дочерних окон. Как мне удобнее всего организовать поддержку такого ПО? Имхо с помощью условной компиляции.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
skyboy
Дата 3.1.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



в данном случае идеально работать с железом(драйвером его, видимо) не напрямую, а через оболочку-прокси(спец класс). 
эта оболочка-прокси имеет три класса наследника: полноценная работа, рид онли(когда управляющие сигналы просто глушатся) и эмулятор.
условная компиляция в данном случае действительно пригодится для автоматизации билда, но будет не на уровне подключения модулей, а в фабрике/фабричном методе, генерирующем объект-прокси того или иного класса в зависимости от переменной окружения(к примеру, если target=DEMO, то driverProxy = TSimulatingDriver.create();)
даже если нужны немного другие наборы классов/окон, лучше сделать одну фабрику, чем по всему проекту распихивать логику сборки в виде операторов условной компиляции. 
собственно, для того фабрики и используются ведь — чтоб инкапсулировать логику генерации в одном месте.
П.С. понятно, что специфики проекта я не знаю. но по-прежнему кажется, что лучше такие проблемы решать архитектурно, а не "в лоб".
PM MAIL   Вверх
northener
Дата 4.1.2013, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

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



Цитата(skyboy @  3.1.2013,  16:53 Найти цитируемый пост)
понятно, что специфики проекта я не знаю. но по-прежнему кажется, что лучше такие проблемы решать архитектурно, а не "в лоб". 

Заметьте, что я сказал "имхо лучше", а вы сказали то, что я выше процитировал. Очевидно что в подобных случаях общего единственно верного решения просто быть не может!

Цитата(skyboy @  3.1.2013,  16:53 Найти цитируемый пост)
в данном случае идеально работать с железом(драйвером его, видимо) не напрямую, а через оболочку-прокси(спец класс).

В моём случае это лишние накладные расходы, ибо с железом (железо кстати тоже моё) я работаю по СОМ-порту. Но дело не только в работе с железом. То "дополнительное рабочее место", о котором я говорил в своём ответе не может само работать с этим железом, ибо СОМ-порт неразделяемый ресурс. Т.е. с железом работает только основная рабочая программа, а дополнительная(которая предназначена работать на другом компьютере в локальной сети) получает информацию о состоянии железа от основной. А значит тут ещё присутствует IPC.

Цитата(skyboy @  3.1.2013,  16:53 Найти цитируемый пост)
чем по всему проекту распихивать логику сборки в виде операторов условной компиляции.

На самом деле если хорошо продумать архитектуру проекта, то "распихивание по всему проекту операторов условной компиляции" не такое уж ужастное/громоздкое занятие. Но вот только проблема - где взять грамотного "архитектора проекта"?


Это сообщение отредактировал(а) northener - 4.1.2013, 01:37


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
gesper
Дата 4.1.2013, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Разговоры у вас, у меня все проще без железа, только "подушки" smile

Программа разрабатываемая для своей работы, за меня исполняющая расчеты, составление спецификаций и некоторых журналов. Часть этой программы непременика для моих колег, но вот вторая ее часть очень им помочь может, вот и решено было вырвать часть программы, без потери функционала.
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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