我正在寻找一个生成Delphi源代码文档的工具,我想尝试一下Doc-O-Matic Express(免费).是否有任何指导初学者如何使用Doc-O-Matic Express来记录Delphi源代码(管理doc-o-matic项目,首选docblock样式,完整的docblock语法等)?
我有RTTI TRttiMethod.Invoke,stdcall和const参数的问题:
obj := TClassRecordTest.Create;
try
b.a := 10; b.b := 100;
a.a := 1; a.b := 2;
writeln('b.a='+IntToStr(b.a)+' b.b='+IntToStr(b.b));
writeln;
writeln('call test1');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test1', @a, @b));
writeln('test1 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 2; a.b := 3;
writeln('call test2');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test2', @a, @b));
writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 3; a.b := 4;
writeln('call test3');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test3', @a, @b));
writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 4; a.b := 5;
writeln('call test4'); …Run Code Online (Sandbox Code Playgroud) Delphi允许3个版本的Copy功能:
function CopyTest(const S: string): string;
begin
Result:= Copy(S, 1, 5);
Result:= Copy(S, 1);
// Result:= Copy(S); // not allowed for strings, allowed for dyn arrays
end;
Run Code Online (Sandbox Code Playgroud)
FreePascal似乎只编译第一个(3-arg)版本; 对于其他人我有编译时错误
Error: Wrong number of parameters specified for call to "$fpc_ansistr_copy"
Run Code Online (Sandbox Code Playgroud)
我是否遗漏了一些FPC编译器开关或CopyFree Pascal中没有过载?
例如,如何为类过程声明类型
type
TTest = class
procedure Proc1;
class procedure Proc2;
class procedure Proc3; static;
end;
TProc1 = procedure of object;
TProc2 = ???;
TProc3 = ???;
Run Code Online (Sandbox Code Playgroud) 考虑一下代码:
procedure DoSmthSecret;
var
Seed: array[0..31] of Byte;
begin
// get random seed
..
// use the seed to do something secret
..
// erase the seed
FillChar(Seed, SizeOf(Seed), 0);
end;
Run Code Online (Sandbox Code Playgroud)
代码的问题是:FillChar是编译器内在的,并且编译器可能会"优化它".问题是C/C++编译器所知,请参阅SecureZeroMemory.现代Pascal编译器(Delphi,FPC)可以进行这样的优化,如果可以的话,它们是否提供了与SecureZeroMemory等效的?
假设我有 1Mb 文件,文件指针位于文件的开头。我调用同步ReadFile:
ReadFile(Handle, Buffer, 1024, Result, nil);
Run Code Online (Sandbox Code Playgroud)
调用成功,没有出现错误。结果值(读取的字节数)是否可能小于 1024(读取的字节数)?
我认为这对于磁盘文件来说是不可能的,我不确定ReadFile可以访问其他资源。在编写可以使用不同资源的通用代码时,我是否应该考虑上述情况?
为了避免哲学推测,我可以将问题重新表述如下:
同步 ReadFile 执行无错误,并且读取的字节数小于要读取的字节数。我可以确定达到 EOF 吗?
我已经在表单上添加了组件提示.当组件获得焦点时,我想设置标签组件的标题以显示提示.
我添加了一个TApplicationEvents对象并将OnShowHint事件设置为
procedure TImportFrm.ApplicationEvents1ShowHint(var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo);
begin
HelpLbl.Caption := HintStr;
end;
Run Code Online (Sandbox Code Playgroud)
但是,似乎ShowHint事件仅在鼠标移动时触发.有没有办法在组件获得焦点时触发提示代码,而不必为表单上的每个组件实现OnEnter事件?
我愿意使用以下代码在Delphi XE2中无边界和无标题地设计一个应用程序:
BorderIcons = []
BorderStyle = bsNone
Run Code Online (Sandbox Code Playgroud)
但问题是右键单击任务栏上的应用程序没有菜单,就像上图中一样.然后我在FormShow事件上尝试了以下代码,但还有另一个问题.在左侧和左侧B侧创建一个边框.代码是:
procedure TForm1.FormShow(Sender: TObject);
var
r: TRect;
begin
r := ClientRect;
OffsetRect(r, 0, GetSystemMetrics(SM_CYCAPTION));
OffsetRect(r, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
SetWindowRgn(Handle,
CreateRectRgn(
r.Left, r.Top,
ClientWidth + r.Left, ClientHeight + r.Top), True);
end;
Run Code Online (Sandbox Code Playgroud)
请帮我.
Delphi中两种编码模式之间是否存在实际差异:
版本1
try
try
{Do something}
finally
{Do tidy up}
end
except
{Handle exception}
end;
Run Code Online (Sandbox Code Playgroud)
版本2
try
try
{Do something}
except
{Handle exception}
end
finally
{Do tidy up}
end;
Run Code Online (Sandbox Code Playgroud) 在C#中,我可以创建一个包含特定接口的通用列表,例如:
myList = List<IMyInterface>;
Run Code Online (Sandbox Code Playgroud)
我可以在Delphi XE3中做同样的事情,如果是这样的话怎么样?
我知道我可以创建一个TInterfaceList来存储接口列表,但它不是强类型的,所以我仍然需要在列表中使用对象时进行转换.
有一种强烈的打字方式吗?