Delphi(可能还有许多其他语言)都有类助手.这些提供了一种向现有类添加额外方法的方法.没有做一个子类.
那么,班主任的好用途是什么?
我有一个像这样定义的结构:
const
MaxSignalRecords=255;
type
TSignalRecord=record
signal1 : integer;
signal2 : integer;
signal3 : integer;
signal4 : integer;
signal5 : integer;
signal6 : integer;
bsignal1 : Boolean;
bsignal2 : Boolean;
bsignal3 : Boolean;
bsignal4 : Boolean;
bsignal5 : Boolean;
bsignal6 : Boolean;
end;
TListSignals = Array[0..MaxSignalRecords-1] of TSignalRecord;
Run Code Online (Sandbox Code Playgroud)
此结构用于在如下算法中进行数千次计算:
for i:=1 to 900000 do
begin
CleartheList(MyList);
DotheMath(MyList);
DotheChart(MyList);
end;
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种快速的方法来将我的值初始化TListSignals为0和false.
现在我用这个:
procedure ClearListSignals(var ListSignals:TListSignals);
var
i :Integer;
begin
for i := 0 to MaxSignalRecords - 1 do …Run Code Online (Sandbox Code Playgroud) 这就是我想要做的.我有一个项目必须在某些版本的Delphi或更高版本中编译.我想使用条件编译器指令来测试Delphi版本,然后使用自定义消息生成自定义编译器错误.如果无法发生错误,能够生成自定义编译器警告或提示也是适当的.
当然,我可以在条件代码段中放入一些不可编辑的giberish,这很好.但我的问题是"我可以有条件地生成自定义编译器错误吗?"
谢谢Johan和Serg.
这是解决方案,以及有关该问题的更多详细信息.我有一个最初在Delphi 2007中构建的应用程序.它包括连接到Web服务的Internet Direct组件.这些使用SSL.我最近将我的SSL库升级到更高版本,而这些版本与Delphi 2007 Indy组件的搭配并不是很好.我现在添加了以下编译器指令,以确保不再使用Delphi 2007或更早版本编译此应用程序:
{$IF CompilerVersion <= 19.0} // Delphi 2007 = 19.0
{$MESSAGE Error 'This project must be compiled in Delphi 2009 or later'}
{$IFEND}
Run Code Online (Sandbox Code Playgroud) Delphi XE2的新功能包含以下内容.
现在打包强制字节对齐记录
如果您的遗留代码使用打包记录类型,并且您想要与外部DLL或C++链接,则需要从代码中删除"packed"一词.packed关键字现在强制字节对齐,而在过去它不一定这样做.行为更改与Delphi 2009中的C++对齐兼容性更改有关.
我不明白这一点.我正在努力解决这一问题:而在过去,它并不一定会这样做.我无法调和的是,压缩总是导致记录的字节对齐,据我所知.任何人都可以给出一个非字节对齐的打包记录的例子吗?显然,这必须是早期版本.
为什么文档说"如果你想与外部DLL或C++链接,你需要删除代码中的单词"?如果外部代码使用了#pragma pack(1)那么如果打包是非限制我们该怎么办?
$ALIGN指令怎么样?是{$A1} and {$A-}相当于packed或者是有一些额外的意义与packed?
我似乎错过了一些东西,如果有人能够解释这一点,我会很感激.或者文档真的很差?
更新
我有理由相信文档是指记录本身的对齐而不是记录的布局.这是一个小程序,它表明packed记录的使用强制记录的对齐为1.
program PackedRecords;
{$APPTYPE CONSOLE}
type
TPackedRecord = packed record
I: Int64;
end;
TPackedContainer = record
B: Byte;
R: TPackedRecord;
end;
TRecord = record
I: Int64;
end;
TContainer = record
B: Byte;
R: TRecord;
end;
var
pc: TPackedContainer;
c: TContainer;
begin
Writeln(NativeInt(@pc.R)-NativeInt(@pc.B));//outputs 1
Writeln(NativeInt(@c.R)-NativeInt(@c.B));//outputs 8
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
这在Delphi …
但是我学习编程,在用Pascal语言进行结构化编程之后,我开始用Delphi学习OOP.
所以,我真的不明白strict private指令和那个指令之间的区别protected.所以这是我的代码,它是关于"包"的创建,它只是我的Delphi课程的介绍,老师告诉我们如何创建对象:
uses
SysUtils;
Type
Tbag= class (Tobject)
strict private
FcontenM : single;
Fcontent : single;
protected
function getisempty : boolean;
function getisfull: boolean;
public
constructor creer (nbliters : single);
procedure add (nbliters : single);
procedure clear (nbliters : single);
property contenM : single read FcontenM;
property content : single read Fcontent;
property isempty : boolean read getisempty;
property isfull : boolean read getisfull;
end;
function Tseau.getisempty;
begin
result := Fcontent = 0;
end;
function …Run Code Online (Sandbox Code Playgroud) 我想知道什么样的操作符重载是可能的(以及什么版本的Delphi)?感谢Hallvard对运算符重载的精彩描述,我知道:
但是,我不知道的是'=','<=','<','<>','>'和'> ='运算符的名称.这些存在,我可以使用Delphi版本吗?
PS:我现在仍然使用Delphi 2009,所以如果2010年提供这些,我会有另一个强大的升级论据;-)
Delphi有这个列表:Delphi内在例程
但该列表不完整.
哪些无证的内在函数存在,因为它们的目的何时和目的是什么?
Delphi 2006引入了新的记录功能,使其更加"面向对象".
在哪种情况下,记录类型更适合于设计而不是类类型?使用这些记录类型有哪些优势?
我总是想知道这一点,但为什么运算符重载不适用于Delphi中的类?
我记得在跑步时读了一次答案,它说它会与某些东西发生冲突,但我记不起来了.据我所知,只有隐式运算符可能会导致一些问题,因为类存储在堆上并且赋值实际上是堆地址的副本(基本上是复制指针).
我正在阅读Delphi XE中的RAD Studio Documentaion.这里有一些文字.
[Delphi参考 - > Delphi语言指南 - >程序和单元 - >使用命名空间 - >搜索命名空间 - >多单元命名空间]
多单元命名空间
如果单元声明引用相同的命名空间,则多个单元可以属于同一命名空间.例如,可以使用以下单元声明创建两个文件unit1.pas和unit2.pas:
// in file 'unit1.pas'
unit MyCompany.ProjectX.ProgramY.Unit1
// in file 'unit2.pas'
unit MyCompany.ProjectX.ProgramY.Unit2
Run Code Online (Sandbox Code Playgroud)
在此示例中,命名空间MyCompany.ProjectX.ProgramY逻辑上包含unit1.pas和unit2.pas中的所有接口符号.
命名空间中的符号名称必须是唯一的,跨命名空间中的所有单元.
在上面的示例中,Unit1和Unit2都定义了一个名为mySymbol的全局接口符号,这是一个错误
我测试了这个.代码如下.
-----------------------------------------------------------------
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Lib.A in 'Lib.A.pas',
Lib.B in 'Lib.B.pas';
begin
WriteLn ( TestValue ) ;
ReadLn ;
end.
-----------------------------------------------------------------
unit Lib.A;
interface
const TestValue : Integer = 10 ;
implementation
end.
-----------------------------------------------------------------
unit Lib.B;
interface
const TestValue : Integer = 10 ; …Run Code Online (Sandbox Code Playgroud) delphi ×10
class ×3
delphi-2006 ×1
delphi-xe ×1
delphi-xe2 ×1
helper ×1
intrinsics ×1
namespaces ×1
oop ×1
record ×1