小编And*_*and的帖子

如何使用TTaskDialog?

如何使用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类的任何(非官方)文档?

delphi ttaskdialog

26
推荐指数
3
解决办法
9743
查看次数

如何在Delphi中获取当前过程/函数的名称(作为字符串)

是否可以在过程/函数中获取当前过程/函数的名称作为字符串?我想在编译时会有一些"宏"扩展.

我的情况是这样的:我有很多程序被给予记录,他们都需要从检查记录的有效性开始,因此他们将记录传递给"验证程序".如果记录无效,验证程序(所有程序都是同一个程序)会引发异常,并且我希望异常的消息不包括验证程序的名称,而是包含调用验证程序的函数/过程的名称程序(自然地).

就是,我有

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)

delphi procedure compile-time

25
推荐指数
2
解决办法
2万
查看次数

Delphi接口性能问题

我已经对我的文本编辑器进行了一些非常严肃的重构.现在代码少得多,扩展组件要容易得多.我大量使用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)

delphi oop performance interface

24
推荐指数
2
解决办法
1410
查看次数

RAD Studio 2009持久选择问题:错误还是功能?

有时,在RAD Studio 2009(Delphi)中进行编码时,代码编辑器的行为会发生变化.在这样的事件之后,在字符输入上不再清除选择.这通常发生在非常激烈的编码会话(每秒很多字符!)之后,所以我可能会意外地击中键盘(快捷方式)组合.

是这样的吗?如何"修复"这个问题?(我希望我的选择能够在字符输入时得到解决!)

delphi delphi-2009 selection code-editor

22
推荐指数
1
解决办法
733
查看次数

如何计算字符串中某个char的出现次数?

如何计算Delphi中字符串中某个字符的出现次数?

例如,假设我有以下字符串并且想要计算其中的逗号数:

S := '1,2,3';
Run Code Online (Sandbox Code Playgroud)

然后我想获得2结果.

delphi delphi-2010 delphi-xe2

22
推荐指数
4
解决办法
3万
查看次数

德尔福表现:案例与If

我想可能与以前的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)?) .

  1. 我是否正确,开关速度更快?
  2. 我是否认为在开关盒中找到正确动作所需的时间实际上与n无关?也就是说,检查一百万个案件比检查10个案件真的需要更长的时间吗?
  3. 这究竟是如何工作的?

delphi performance if-statement case

21
推荐指数
3
解决办法
5686
查看次数

如何在MathJax中定义一个新函数('operator')?

我正在使用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中定义新函数('运算符')的首选方法是什么?当然有一个好方法,因为没有全方位的双曲线函数谁能活下去?!

mathjax

19
推荐指数
1
解决办法
2584
查看次数

删除IE上的<hr />边框样式

为什么IE最容易陷入困境?无论如何,我想用单个图像替换正常的hr线,有点像 - § - 符号(在它的侧面).试图让它看起来优雅:)

看来在IE中实际摆脱边界的唯一方法是设置颜色:css值.这样做会不幸地覆盖设置为背景图像的任何内容,并使整个hr成为颜色的参数.

它不可能将它包装在一个div中,甚至不能真正应用一个类,因为将使用该站点的客户端正在使用一个所见即所得的文本编辑器,我并不喜欢黑客插入div包裹的hr.

我距离添加带有jquery的div块包装器只有一步之遥,但这似乎从根本上说是错误的(霰弹枪与核桃) - 任何建议?

html css internet-explorer

16
推荐指数
1
解决办法
3万
查看次数

动态数组是否超出范围时会自动解除分配?

在这个例子中

procedure foobar;
var tab:array of integer;
begin
  setlength(tab,10);
end;
Run Code Online (Sandbox Code Playgroud)

是阵列被破坏还是内存泄漏?

delphi memory-leaks reference-counting dynamic-arrays

16
推荐指数
1
解决办法
1万
查看次数

Delphi中的数组和压缩数组有什么区别吗?

在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记录是不同的 - 它们可以'解包',因此由于字段的对齐,结构的大小大于字段大小的总和.)

arrays delphi alignment packed

15
推荐指数
1
解决办法
4551
查看次数