如何使用TTaskDialog该类(在Delphi 2009及更高版本中)?官方文档没有帮助.实际上,通过使用CodeInsight或VCL源代码检查类,您可以学到更多.那里没有教学解释,但至少也没有错误(嗯,只有几个).
就在最近,我想知道如何回应对话框中的超链接点击.实际上,设置tfEnableHyperlinks标志,您可以在对话框的文本部分中包含HTML超链接.(好吧,文档说的是标志:"如果设置,内容,页脚和扩展文本可以包含超链接."当然,使用<AHTML元素实现链接是"显而易见的" .)我设法弄清楚我自己使用该OnHyperLinkClick事件来响应超链接的点击.但是这个事件是一个TNotifyEvent,所以你怎么知道点击了什么链接?好吧,文档没有说明这一点,所以我不得不猜测.最终我发现URL对话框的公共属性已经设置好了,所以我可以做到
procedure TmainFrm.TaskDialogHyperLinkClicked(Sender: TObject);
begin
if Sender is TTaskDialog then
with Sender as TTaskDialog do
ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOWNORMAL);
end;
Run Code Online (Sandbox Code Playgroud)
官方文档说,关于这个属性:
URL包含"任务"对话框的URL.
现在,你必须承认,这是一个很好的解释!但它比这更糟糕:文档不仅缺乏解释,还包含错误.例如,
ExpandButtonCaption:此按钮的附加信息.
那不是很准确.什么按钮?如果你显示这个特定属性的帮助,它说
ExpandButtonCaption包含扩展标题时要显示的其他文本.
也不好.标题是什么?一个正确的解释是
ExpandButtonCaption是按钮旁边显示的文本,用户可以展开对话框以显示更多信息.例如,此属性可能是"更多详细信息".
无论如何,目前,我正在尝试使用两个命令链接按钮创建一个对话框.我知道操作系统可以显示带有标题和更长解释的这些按钮,但我似乎无法使用它来使其工作TTaskButton.文档不是很好.
但是,我不会在SO处询问如何实现这一特定事物,而是提出另一个问题:
是否有TTaskDialog类的任何(非官方)文档?
是否可以在过程/函数中获取当前过程/函数的名称作为字符串?我想在编译时会有一些"宏"扩展.
我的情况是这样的:我有很多程序被给予记录,他们都需要从检查记录的有效性开始,因此他们将记录传递给"验证程序".如果记录无效,验证程序(所有程序都是同一个程序)会引发异常,并且我希望异常的消息不包括验证程序的名称,而是包含调用验证程序的函数/过程的名称程序(自然地).
就是,我有
procedure ValidateStruct(const Struct: TMyStruct; const Sender: string);
begin
if <StructIsInvalid> then
raise Exception.Create(Sender + ': Structure is invalid.');
end;
Run Code Online (Sandbox Code Playgroud)
然后
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProcN');
...
end;
Run Code Online (Sandbox Code Playgroud)
如果我可以写出类似的内容,那么它会更容易出错
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
Run Code Online (Sandbox Code Playgroud)
然后每次编译器遇到{$ PROCNAME}时,它只是将当前函数/过程的名称替换为"宏"作为字符串文字.
更新
第一种方法的问题在于它容易出错.例如,由于复制粘贴,你很容易弄错:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
Run Code Online (Sandbox Code Playgroud)
或错别字:
procedure SomeProc3(const Struct: TMyStruct); …Run Code Online (Sandbox Code Playgroud) 我已经对我的文本编辑器进行了一些非常严肃的重构.现在代码少得多,扩展组件要容易得多.我大量使用OO设计,例如抽象类和接口.但是,在性能方面,我注意到了一些损失.问题在于阅读大量的记录.当一切都发生在同一个对象内部时速度很快,但通过接口完成时速度很慢.我制作了最简单的程序来说明细节:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
const
N = 10000000;
type
TRecord = record
Val1, Val2, Val3, Val4: integer;
end;
TArrayOfRecord = array of TRecord;
IMyInterface = interface
['{C0070757-2376-4A5B-AA4D-CA7EB058501A}']
function GetArray: TArrayOfRecord;
property Arr: TArrayOfRecord read GetArray;
end;
TMyObject = class(TComponent, IMyInterface)
protected
FArr: TArrayOfRecord;
public
procedure InitArr;
function GetArray: TArrayOfRecord;
end;
TForm3 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3; …Run Code Online (Sandbox Code Playgroud) 有时,在RAD Studio 2009(Delphi)中进行编码时,代码编辑器的行为会发生变化.在这样的事件之后,在字符输入上不再清除选择.这通常发生在非常激烈的编码会话(每秒很多字符!)之后,所以我可能会意外地击中键盘(快捷方式)组合.
是这样的吗?如何"修复"这个问题?(我希望我的选择能够在字符输入时得到解决!)
如何计算Delphi中字符串中某个字符的出现次数?
例如,假设我有以下字符串并且想要计算其中的逗号数:
S := '1,2,3';
Run Code Online (Sandbox Code Playgroud)
然后我想获得2结果.
我想可能与以前的SO问题有一些重叠,但我找不到关于这个主题的Delphi特定问题.
假设您要检查无符号的32位整数变量"MyAction"是否等于任何常量ACTION1,ACTION2,...,ACTIONn,其中n是 - 比如说1000.我想,除了更优雅之外,
case MyAction of
ACTION1: {code};
ACTION2: {code};
...
ACTIONn: {code};
end;
Run Code Online (Sandbox Code Playgroud)
比...快得多
if MyAction = ACTION1 then
// code
else if MyAction = ACTION2 then
// code
...
else if MyAction = ACTIONn then
// code;
Run Code Online (Sandbox Code Playgroud)
我猜if if变量需要时间O(n)来完成(即找到正确的动作)如果正确的动作ACTIONi具有高的i值,而case变量需要更少的时间(O(1)?) .
我正在使用MathJax在我的网站上显示公式.开箱即用,MathJax识别许多函数,例如sin,cos......,但很多函数都缺失,例如sech(双曲正割)和csch(双曲余割).我知道我仍然可以通过\text诸如的方式在公式中使用这些函数
\text{sech} u
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿做\sech工作.为此,我试过了
<div style="display:none">
$\DeclareMathOperator{\sech}{sech}
\DeclareMathOperator{\csch}{csch}$
</div>
Run Code Online (Sandbox Code Playgroud)
之后<body>.(我之后也尝试添加星号DeclareMathOperator.)
这几乎可行.现在的问题是
\sech^2 u
Run Code Online (Sandbox Code Playgroud)
把广场放在上面 sech,而不是在它之后(证明).有没有办法来解决这个问题?在MathJax中定义新函数('运算符')的首选方法是什么?当然有一个好方法,因为没有全方位的双曲线函数谁能活下去?!
为什么IE最容易陷入困境?无论如何,我想用单个图像替换正常的hr线,有点像 - § - 符号(在它的侧面).试图让它看起来优雅:)
看来在IE中实际摆脱边界的唯一方法是设置颜色:css值.这样做会不幸地覆盖设置为背景图像的任何内容,并使整个hr成为颜色的参数.
它不可能将它包装在一个div中,甚至不能真正应用一个类,因为将使用该站点的客户端正在使用一个所见即所得的文本编辑器,我并不喜欢黑客插入div包裹的hr.
我距离添加带有jquery的div块包装器只有一步之遥,但这似乎从根本上说是错误的(霰弹枪与核桃) - 任何建议?
在这个例子中
procedure foobar;
var tab:array of integer;
begin
setlength(tab,10);
end;
Run Code Online (Sandbox Code Playgroud)
是阵列被破坏还是内存泄漏?
在C/C++中你总是有
SizeOf(array[N] of T) = N * SizeOf(T);
Run Code Online (Sandbox Code Playgroud)
在Pascal/Delphi中,您可以使用'packed array'来确保上面的断言是正确的,但'packed'说明符对Delphi中的数组有什么实际价值吗?我无法创建一个'unpacked'数组的例子,数组似乎总是'打包':
type
A = array[0..2] of Byte;
B = array[0..99] of A;
C = packed record
C1, C2, C3: Byte;
end;
D = array[0..99] of C;
procedure TForm10.Button1Click(Sender: TObject);
begin
Assert(SizeOf(A) = 3);
Assert(SizeOf(B) = 300);
Assert(SizeOf(D) = 300);
end;
Run Code Online (Sandbox Code Playgroud)
(C/C++结构和Delphi记录是不同的 - 它们可以'解包',因此由于字段的对齐,结构的大小大于字段大小的总和.)
delphi ×8
performance ×2
alignment ×1
arrays ×1
case ×1
code-editor ×1
compile-time ×1
css ×1
delphi-2009 ×1
delphi-2010 ×1
delphi-xe2 ×1
html ×1
if-statement ×1
interface ×1
mathjax ×1
memory-leaks ×1
oop ×1
packed ×1
procedure ×1
selection ×1
ttaskdialog ×1