GVKun编程网logo

如何在Delphi中定义版本“和up”ifdefs?(delphi 版本)

21

这篇文章主要围绕如何在Delphi中定义版本“和up”ifdefs?和delphi版本展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在Delphi中定义版本“和up”ifdefs?的优缺点,

这篇文章主要围绕如何在Delphi中定义版本“和up”ifdefs?delphi 版本展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在Delphi中定义版本“和up”ifdefs?的优缺点,解答delphi 版本的相关问题,同时也会为您带来c# – 如何在Delphi中检测打印机型号?、delphi – 如何处理.dpr使用部分中的IFDEF、delphi – 是否可以同时为多个指令定义{$IFDEF}?、Delphi 的编译指令 (1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDI的实用方法。

本文目录一览:

如何在Delphi中定义版本“和up”ifdefs?(delphi 版本)

如何在Delphi中定义版本“和up”ifdefs?(delphi 版本)

我正在努力使Log4D在Delphi XE4中工作,并且得到一些编译错误,因为它在uses子句中找不到Contnrs,除非我将它移动到定义的ifdef之外。
{$IFDEF DELPHI5_UP}
  Contnrs,{$ENDIF}

有一点调查发现,ifdef是在一个包含的文件Defines.inc中定义的,它对每个“支持”的delphi版本都有一个块,它阻止了几个版本:

例如:

{$IFDEF VER170}  { Delphi 2005 }
{$DEFINE DELPHI9}
{$DEFINE DELPHI4_UP}
{$DEFINE DELPHI5_UP}
{$DEFINE DELPHI6_UP}
{$DEFINE DELPHI7_UP}
{$ENDIF}

{$IFDEF VER180}  { Delphi 2006 }
{$DEFINE DELPHI10}
{$DEFINE DELPHI4_UP}
{$DEFINE DELPHI5_UP}
{$DEFINE DELPHI6_UP}
{$DEFINE DELPHI7_UP}

因此,尽管如此,您可以轻松地复制并粘贴ifdef for Delphi 2006并创建Delphi XE4块…这似乎是一个不切实际的解决方案。这绝对不是未来的证明…每个新版本你必须去更新这个文件,所以Delphi 4中不存在的一些代码不会使别人的15岁的旧代码爆炸。

所以我想知道是否有更好的方法来进行条件编译,这样才能真正确定在编译该行时是否具有“Delphi 5或更高版本”,而不是需要更新每个出现的每个新版本的delphi的格式。

解决方法

IIRC,Delphi 6引入了条件表达式,这实际上是TLama建议的。要使您的代码使用下面的Delphi版本,您必须检查{$ IFDEF CONDITIONALEXPRESSIONS}。如果未定义,则必须使用旧的VERxxx方案来区分Delphi版本。

对于Delphi 6及更高版本,您可以使用内置的常量CompilerVersion和RTLVersion。你使用哪一个取决于你的代码。无论何时使用CompilerVersion的新编译器功能测试。对于与RTLVersion的RTL或VCL测试相关的任何内容。

对最新的编译器进行编码总是一个好主意,只能使用条件部分来兼容旧版本。所以代替编写{$ IF CompilerVersion> = 26.0}而不是以{$ IF CompilerVersion< 26.0}。因此,在将来,放弃对旧版本编译器的支持要容易得多。

c# – 如何在Delphi中检测打印机型号?

c# – 如何在Delphi中检测打印机型号?

当我插入HP Laserjet 3015时,Windows会检测到正确的型号,然后尝试安装相应的驱动程序.

如何检测连接的打印机的型号?我不想使用安装的打印机列表,因为斑马打印机可以安装一个通用/纯文本驱动程序.

我是一个Delphi和C#程序员,所以任何语言的任何提示将不胜感激.

解决方法

你可以发一个
~HI

到Zebra打印机,它应该返回其型号和fw版本

delphi – 如何处理.dpr使用部分中的IFDEF

delphi – 如何处理.dpr使用部分中的IFDEF

无论何时向项目添加新单元,Delphi都会重建.dpr文件,并且使用部分中的所有IFDEF都将消失.

为了解决这个问题,我通常使用NotePad创建新的.pas文件,并手动将其添加到.dpr文件中.如果我需要表单,我使用File-> New-> Form,然后将.dpr文件还原为以前的版本.如果你问我,不是很好;-)

你怎么处理那件事呢?有没有办法在保留IFDEF的同时在IDE中添加单元?

解决方法

有时我会专门创建一个单元作为所有IFDEF和其他东西的地方,如果它在dpr中,IDE会搞乱.该单元通常位于dpr的uses子句的顶部.这个技巧不适合所有场景,但有时可以节省大量繁琐的工作.

delphi – 是否可以同时为多个指令定义{$IFDEF}?

delphi – 是否可以同时为多个指令定义{$IFDEF}?

是否可以在一个{$ IFDEF}指令中定义多个条件?
我想有这样的语法:
{$IFDEF Condition1 OR Condition2} DoSomething; {$ENDIF}
{$IFDEF Condition1 AND Condition2} DoSomethingElse; {$ENDIF}

谢谢

解决方法

您需要使用 $IF代替:
{$IF Defined(Condition1) or Defined(Condition2)}
DoSomething;
{$IFEND}

Delphi 的编译指令 (1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDI

Delphi 的编译指令 (1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDI

一个程序从无到有的过程是这样的:编辑代码 -> 预处理 -> 编译 (成 dcu 等) -> 链接 (为 exe 等).

什么是预处理?
譬如 VCL 中有很多代码是兼容 Linux 的,在 Windows 下就需要在编译之前预处理掉那些 for Linux 的代码.



1、判断操作系统:


其中的 "MSWINDOWS" 和 "LINUX" 就是 Delphi 预定义的 "条件标识符".


begin  {$IFDEF MSWINDOWS}    ShowMessage(''Windows'');
  {$ENDIF}  {$IFDEF LINUX}    ShowMessage(''Linux'');
  {$ENDIF}end;


2、自定义条件标识符 (DEFINE):


下面例子中自定义了条件标识符: WanYi; 标识符和定义它的指令都不区分大小写,但大家一般惯用大写.


begin  {$DEFINE WANYI}  {$IFDEF WanYi}    ShowMessage(''标识符 WanYi 已定义'');
  {$ELSE}    ShowMessage(''标识符 WanYi 未定义'');
  {$ENDIF}end;


3、取消条件标识符的定义 (UNDEF):


begin  {$DEFINE WANYI}  {$IFDEF WANYI}     ShowMessage(''确认标识符 WanYi 是否定义'');
  {$ENDIF}  {$UNDEF WANYI}  {$IFDEF WANYI}     ShowMessage(''再次确认标识符 WanYi 是否定义'');
  {$ENDIF}end;


4、取消定义的简单办法:


在 {$...} 的 $ 前面随便加点什么,让它变成 "注释", 譬如: {.$}


begin  {.$DEFINE WANYI}  {$IFDEF WANYI}     ShowMessage(''确认标识符 WanYi 是否定义'');
  {$ENDIF}  {.$UNDEF WANYI}  {$IFDEF WANYI}     ShowMessage(''再次确认标识符 WanYi 是否定义'');
  {$ENDIF}end;


5、调试编译指令时特别要注意的:


Delphi 有个常识:如果单元代码没有改变,相应的 dcu 不会重新生成!

因此,为了有准确的调试结果,执行前先用 Shift+F9 强制编译当前工程,然后再 Run;
强制编译所有相关单元也可以,方法: Project -> Build all project.

当然修改下代码也很方便,譬如在代码中打个空格再退回来.



6、测试预定义的 Debug 和 Release:


当我们当新建一个工程,Delphi 默认的是调试 (Debug) 状态,当我们发布软件时应该切换到发布 (Release) 状态.
两种状态下编译指令是有区别的,在 Release 状态下发布的 dcu 或 exe 会更小、更优化.

Debug 和 Release 的切换方法:
进入 Project Manager -> Build Configurations, 在 Debug 或 Release 上双击,或从右键 Activate.

下面的代码可以检测到这种改变,不过要注意上面提到的 Shift+F9 或 Project -> Build all project.


begin  {$IFDEF DEBUG}    ShowMessage(''调试模式'');
  {$ENDIF}  {$IFDEF RELEASE}    ShowMessage(''发布模式'');
  {$ENDIF}end;


7、编译指令写在哪?:


编译指令可以写在代码页的任何地方,不过在代码的不同区域有时也会不同;

譬如: {$APPTYPE GUI} 和 {$APPTYPE CONSOLE} 就只能写在工程文件里才有效.

{$APPTYPE GUI} 和 {$APPTYPE CONSOLE} 分别表示窗口工程和控制台工程.
其中 {$APPTYPE GUI} 是默认的,所以很少见到它.

它甚至可以嵌入到代码行当中,譬如 ActnColorMaps 单元就有这么一句:


begin  SystemParametersInfo(SPI_GETFLATMENU, 0, {$IFNDEF CLR}@{$ENDIF}FlatMenus, 0);end;


8、条件标识符的有效范围:


Delphi 预定义的条件标识符都是全局的,我们用 {$DEFINE ...} 自定义的标识符都是局部的.

如何自定义全局的标识符呢?
Project -> Options... -> 选定 Delphi Compiler -> 点击 Conditional defines 右边小按钮 -> 添加.

不过这和系统预定义的还是有区别,咱们自定义的只能用于当前文件.

如何定义每个文件都可以使用的标识符呢?
从 Project -> Options... 定义后,马上选择左下角的 Default.

这和系统预定义的还是有区别,因为这只能左右以后的文件,管不着以前存在的文件.
如何... 没办法了.

其他编译指令,譬如在 Debug 或 Release 中的设置也都是这样;也就是说:每个文件都有相对独立的编译设置.

看到 Project -> Options... 马上明白了编译指令的设置方法有两种:
1、使用 {$...} 在代码中嵌入;
2、从 Project -> Options... 设置.

但在代码中嵌入有时是不可替代的,譬如现在讨论的条件编译.



9、编译指令有多少?:


现在谈到的还只是条件编译,实际应用最多的是开关编译;在任一代码页执行快捷键 Ctrl+O+O , 然后看看最上面...

下面列出了这些默认设置:


{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N-,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}{$MINSTACKSIZE $00004000}{$MAXSTACKSIZE $00100000}{$IMAGEBASE $00400000}{$APPTYPE GUI}{$WARN SYMBOL_DEPRECATED ON}{$WARN SYMBOL_LIBRARY ON}{$WARN SYMBOL_PLATFORM ON}{$WARN SYMBOL_EXPERIMENTAL ON}{$WARN UNIT_LIBRARY ON}{$WARN UNIT_PLATFORM ON}{$WARN UNIT_DEPRECATED ON}{$WARN UNIT_EXPERIMENTAL ON}{$WARN HRESULT_COMPAT ON}{$WARN HIDING_MEMBER ON}{$WARN HIDDEN_VIRTUAL ON}{$WARN GARBAGE ON}{$WARN BOUNDS_ERROR ON}{$WARN ZERO_NIL_COMPAT ON}{$WARN STRING_CONST_TRUNCED ON}{$WARN FOR_LOOP_VAR_VARPAR ON}{$WARN TYPED_CONST_VARPAR ON}{$WARN ASG_TO_TYPED_CONST ON}{$WARN CASE_LABEL_RANGE ON}{$WARN FOR_VARIABLE ON}{$WARN CONSTRUCTING_ABSTRACT ON}{$WARN COMPARISON_FALSE ON}{$WARN COMPARISON_TRUE ON}{$WARN COMPARING_SIGNED_UNSIGNED ON}{$WARN COMBINING_SIGNED_UNSIGNED ON}{$WARN UNSUPPORTED_CONSTRUCT ON}{$WARN FILE_OPEN ON}{$WARN FILE_OPEN_UNITSRC ON}{$WARN BAD_GLOBAL_SYMBOL ON}{$WARN DUPLICATE_CTOR_DTOR ON}{$WARN INVALID_DIRECTIVE ON}{$WARN PACKAGE_NO_LINK ON}{$WARN PACKAGED_THREADVAR ON}{$WARN IMPLICIT_IMPORT ON}{$WARN HPPEMIT_IGNORED ON}{$WARN NO_RETVAL ON}{$WARN USE_BEFORE_DEF ON}{$WARN FOR_LOOP_VAR_UNDEF ON}{$WARN UNIT_NAME_MISMATCH ON}{$WARN NO_CFG_FILE_FOUND ON}{$WARN IMPLICIT_VARIANTS ON}{$WARN UNICODE_TO_LOCALE ON}{$WARN LOCALE_TO_UNICODE ON}{$WARN IMAGEBASE_MULTIPLE ON}{$WARN SUSPICIOUS_TYPECAST ON}{$WARN PRIVATE_PROPACCESSOR ON}{$WARN UNSAFE_TYPE OFF}{$WARN UNSAFE_CODE OFF}{$WARN UNSAFE_CAST OFF}{$WARN OPTION_TRUNCATED ON}{$WARN WIDECHAR_REDUCED ON}{$WARN DUPLICATES_IGNORED ON}{$WARN UNIT_INIT_SEQ ON}{$WARN LOCAL_PINVOKE ON}{$WARN MESSAGE_DIRECTIVE ON}{$WARN TYPEINFO_IMPLICITLY_ADDED ON}{$WARN RLINK_WARNING ON}{$WARN IMPLICIT_STRING_CAST ON}{$WARN IMPLICIT_STRING_CAST_LOSS ON}{$WARN EXPLICIT_STRING_CAST OFF}{$WARN EXPLICIT_STRING_CAST_LOSS OFF}{$WARN CVT_WCHAR_TO_ACHAR OFF}{$WARN CVT_NARROWING_STRING_LOST OFF}{$WARN CVT_ACHAR_TO_WCHAR OFF}{$WARN CVT_WIDENING_STRING_LOST OFF}{$WARN XML_WHITESPACE_NOT_ALLOWED ON}{$WARN XML_UNKNOWN_ENTITY ON}{$WARN XML_INVALID_NAME_START ON}{$WARN XML_INVALID_NAME ON}{$WARN XML_EXPECTED_CHARACTER ON}{$WARN XML_CREF_NO_RESOLVE ON}{$WARN XML_NO_PARM ON}{$WARN XML_NO_MATCHING_PARM ON}


今天关于如何在Delphi中定义版本“和up”ifdefs?delphi 版本的讲解已经结束,谢谢您的阅读,如果想了解更多关于c# – 如何在Delphi中检测打印机型号?、delphi – 如何处理.dpr使用部分中的IFDEF、delphi – 是否可以同时为多个指令定义{$IFDEF}?、Delphi 的编译指令 (1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDI的相关知识,请在本站搜索。

本文标签: