Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Директивы условной компиляции


Автор: Matrex 6.4.2012, 11:56
Коллеги! Доброго времени суток!

Вопрос по директивами условной компиляции. Как в Delphi проверить наличие либо отсутствие определенного юнита на машине пользователя и в момент компиляции проекта отключать некоторые участки кода (отключить - $IFDEF – это я знаю, а как быть с юнитом?).


Автор: northener 6.4.2012, 14:25
На машине пользователя от директив компиляции уже никакой пользы нет. Все участки кода уже скомпилированы. Да и никаких юнитов на машине пользователя тоже нет. Уточните ваш вопрос.

Автор: Matrex 6.4.2012, 15:07
Пересекающиеся проекты. Товарищ хочет использовать мою библиотеку, но не хочет ставить себе сторонние компоненты (в данном конкретном случае это VirtualTrees).
Можно ли переменную UseTVirtualTree определить автоматически по наличию/отсутствии у него на машине модуля (файла) VirtualTrees.pas.


Код

{$define UseTVirtualTree}

uses IdHashMessageDigest, idHash,CheckLst,
     Variants, ComObj, math,infoform, NB30, ShlObj, ActiveX, DateUtils,
     Tabs,ExtCtrls, StdCtrls,IniFiles,Registry,Controls,

     {$IFDEF UseTVirtualTree}
     VirtualTrees, 
     {$ENDIF}

     Graphics, ZLib,
     Classes, SysUtils, Masks, StrUtils, Forms, Types,
     ShellAPI, Windows, ComCtrls, Winsock, Oracle, OracleData, DBCtrls;


Автор: northener 6.4.2012, 15:13
Цитата(Matrex @  6.4.2012,  15:07 Найти цитируемый пост)
Можно ли переменную UseTVirtualTree определить автоматически по наличию/отсутствии у него на машине модуля (файла) VirtualTrees.pas.

Нет. Но он может при компиляции ручками выключить соответствующую опцию 
Код

{.$define UseTVirtualTree}

Автор: Matrex 6.4.2012, 15:31
Этот модуль живет в Subversion. Поэтому если мы будем постоянно менять значение переменной будет не хорошо – мы погрязнем в ревизиях.

Теоретически мы видели три решения:

1.    Это как я пытался объяснить сразу.

2.    Сделать inc-файл. В нем прописать определение этой переменной. На этапе компиляции подключать его к моему модулю типа {$i usetree.inc} (типа у меня этот файл есть, у товарища этого файла нет). Но компилятор у него пишет "файл отсутствует". Может можно как то отключить эту проверку?

3.    Сделать эту переменную (UseTVirtualTree) глобальной. Минус – для всех проектов мне придется прописывать эту переменную в свойствах проекта – Этот вариант работает.

Автор: Snowy 6.4.2012, 16:13
Если компонент не используется в дизайнтайм, а только в рантайм, то нет никакой необходимости его устанавливать. Пусть юзает наздоровье.

Вариант 2: Использовать компонент только тогда, когда установлена соответствующая переменная.
Для этого не обязательно прописывать её в коде. Можно прописать её в строке компилятора, или в свойствах проекта.
Если юзается студия, то, кроме вариантов Release и Debug, можно добавить свой кастомный вариант, где указать эту директиву.

Автор: Matrex 6.4.2012, 16:23
Цитата

Можно прописать её в строке компилятора, или в свойствах проекта.


Похоже, что так и придется сделать… Это действительно работает... Другого варианта я пока не вижу…

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)