小编use*_*348的帖子

TAction.OnUpdate事件是否会降低性能?

在Delphi XE7中,我使用此技巧根据是否选择了ListView中的项目来自动启用或禁用工具栏按钮("编辑ListView项目"),以防止用户在没有ListView时单击按钮选择的项目:

  • 将TActionList放在VCL表单上.
  • 在ActionList中创建一个动作actTest.
  • 将TButton放在表单上.
  • 将操作分配actTest给按钮.
  • 在表单上放置一个TListView.
  • 在ListView中创建两个项目.
  • OnUpdate该事件actTest的行动写:

     procedure TForm1.actTestUpdate(Sender: TObject);
     begin
       actTest.Enabled := ListView1.SelCount > 0;
       CodeSite.Send('actTestUpdate'); // gets fired very often!
     end;
    
    Run Code Online (Sandbox Code Playgroud)

现在,您可以看到根据是否选择了ListView中的项目来启用或禁用该按钮,与您是使用鼠标还是使用键盘或以编程方式选择/取消选择项目无关.

但是,在CodeSite Live Viewer中,我可以看到actTestUpdate事件是连续且非常频繁地触发的,因此该语句很快actTest.Enabled := ListView1.SelCount > 0;就被执行了.

所以我的问题是:这会降低性能吗?如果是,是否有另一种技巧可以实现上述目的?

delphi taction tlistview delphi-xe7

10
推荐指数
3
解决办法
1370
查看次数

Delphi:ListView(vsReport)单列标题标题与自定义字体颜色?

在带有vsReport ViewStyle的ListView中,如何自定义任何单列标题标题的字体颜色?例如(第二列标题标题具有红色字体颜色): 在此输入图像描述

windows delphi listview columnheader delphi-xe2

9
推荐指数
2
解决办法
5089
查看次数

HTML Character Entities和Delphi之间的数字等价?

HTML字符实体𝕒:

在此输入图像描述

可以使用此HTML代码从数字120146创建:

<!DOCTYPE html>
<html>
<style>
body {
    font-size: 20px;
}
</style>
<body>

<p>I will display &#120146;</p>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

其中一些扩展字符符号可以在HTML和Delphi 10.1.2中使用相同的数字值创建.例如:

双方&#174;Chr(174)创建了"注册商标"符号字符®

双方&#163;Chr(163)创建了"咚咚"标记符号£

等等.

不幸的是,这不符合上述数量的情况下120146,其中Chr(120146)在Delphi中创建一个"有趣的中国符号".

那么如何&aopf;从Delphi中的数字120146创建上面的字符符号?哪个是数值范围,HTML和Delphi之间的上述数字等价是否有效?

html delphi html-entities delphi-10.1-berlin

8
推荐指数
1
解决办法
178
查看次数

如何检测滚动条是否位于最底部?

很容易检测到a的垂直滚动条TScrollBox是否位于最顶层:

IsScrollBarAtTop := ScrollBox1.VertScrollBar.Position = 0;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是如何检测a的垂直滚动条TScrollBox是否处于非常底部?

在此输入图像描述

delphi scrollbar tscrollbox delphi-10.1-berlin

7
推荐指数
2
解决办法
1398
查看次数

必须在TRegEx.Create之后释放TRegEx对象吗?

TRegEx在Delphi 10.1.2中看到了几个Delphi的使用示例,如下所示:

try
  RegexObj := TRegEx.Create(REGEX_EXTRACTEMAILADDRESSES, [roIgnoreCase]); 
  MatchResults := RegexObj.Match(ThisPageText);
  while MatchResults.Success do
  begin
    slEmailAddressesOnThisPage.Add(MatchResults.Value);
    MatchResults := MatchResults.NextMatch();
  end;
except
  on E: ERegularExpressionError do
  begin
    // Todo: Log Syntax error in the regular expression
  end;
end;
Run Code Online (Sandbox Code Playgroud)

所以我想知道TRegEx在这样的例子中创建后是否必须显式释放对象?

regex delphi delphi-10.1-berlin

7
推荐指数
1
解决办法
522
查看次数

Delphi XE2:跳转到CHM中的锚点?

在Delphi XE2程序中,如何跳转到CHM帮助文件主题中的锚点?锚具有以下格式(从HTML HelpViewer中显示CHM文件的主题页面的源中提取):

<a name="my_anchor_id"></a>
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

Application.HelpJump('MyTopicName.htm#my_anchor_id');
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用:它确实跳到了这个主题,但只是跳到主题的顶部,而不是主题,这是几个向下滚动的页面.

delphi chm anchor html-help delphi-xe2

6
推荐指数
1
解决办法
1621
查看次数

带有TEncoding.UTF8的TFile.ReadAllText省略了前3个字符

我有一个以这行开头的UTF-8文本文件:

<HEAD><META name=GENERATOR content="MSHTML 10.00.9200.16521"><body>
Run Code Online (Sandbox Code Playgroud)

当我TFile.ReadAllText使用TEncoding.UTF8 读取此文件时:

MyStr := TFile.ReadAllText(ThisFileNamePath, TEncoding.UTF8);
Run Code Online (Sandbox Code Playgroud)

然后省略文本文件的前3个字符,因此MyStr导致:

'AD><META name=GENERATOR content="MSHTML 10.00.9200.16521"><body>...'
Run Code Online (Sandbox Code Playgroud)

但是,当我在TFile.ReadAllText没有TEncoding.UTF8的情况下读取此文件时:

MyStr := TFile.ReadAllText(ThisFileNamePath);
Run Code Online (Sandbox Code Playgroud)

然后完整正确地读取文件:

<HEAD><META name=GENERATOR content="MSHTML 10.00.9200.16521"><body>...
Run Code Online (Sandbox Code Playgroud)

是否TFile.ReadAllText有缺陷?

delphi utf-8 text-files delphi-xe2

6
推荐指数
1
解决办法
3371
查看次数

如何避免Free内部函数破坏函数结果?

此代码创建一个AV:

function PAIsMainAppWindow(Wnd: THandle): Boolean;
var
  ParentWnd: THandle;
  ExStyle: DWORD;
begin
  if IsWindowVisible(Wnd) then
  begin
    ParentWnd := THandle(GetWindowLongPtr(Wnd, GWLP_HWNDPARENT));
    ExStyle := GetWindowLongPtr(Wnd, GWL_EXSTYLE);
    Result := ((ParentWnd = 0) or (ParentWnd = GetDesktopWindow)) and
      ((ExStyle and WS_EX_TOOLWINDOW = 0) or (ExStyle and WS_EX_APPWINDOW <> 0));
  end
  else
    Result := False;
end;

function PAEnumTaskWindowsProc(Wnd: THandle; List: TStrings): Boolean; stdcall;
var
  Caption: array [0..1024] of Char;
begin
  if PAIsMainAppWindow(Wnd) and (GetWindowText(Wnd, Caption, SizeOf(Caption)) > 0) then
    List.AddObject(ExtractFileName(GetProcessNameFromWnd(Wnd)), Pointer(Wnd));
  Result := True;
end;

function …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-10-seattle

6
推荐指数
1
解决办法
162
查看次数

错误的MessageDlg图标与DlgType mtConfirmation常量?

在Delphi 10.1.2 Berlin中,在一个Vcl.Dialogs.MessageDlg函数中,DlgType常量mtInformationmtConfirmation创建相同的对话框图标.例如:

if Vcl.Dialogs.MessageDlg('Do you really want to remove the selected item?',  mtConfirmation, mbOKCancel, 0) = mrOk then
begin
  RemoveTheSelectedItem;
end;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

if Vcl.Dialogs.MessageDlg('Do you really want to remove the selected item?',  mtInformation, mbOKCancel, 0) = mrOk then
begin
  RemoveTheSelectedItem;
end;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但不应该DlgType常数mtConfirmation显示一个问号图标,(作为其他DlgType常量mtWarningmtError创建每个不同的图标)?

如何使用常量获得问号图标?DlgTypemtConfirmation

delphi dialog delphi-10.1-berlin

6
推荐指数
1
解决办法
1687
查看次数

在Delphi中ListView上的半透明层?

在Delphi XE2中,我有一个带有图像缩略图的ListView。当我单击其中一个缩略图时,我希望ListView被黑色半透明层覆盖,并使单击的图像放大到该层的顶部。

由于不可能将TImage放在ListView的顶部,因此我尝试对AlphaBlend 128透明度使用另一种形式的图层。但是,此AlphaBlend形式也使TImage对其具有Alpha透明性。

因此,目标似乎是使图层形成AlphaBlend透明的,而不是其上的图像。如何做到这一点?


在2012年8月7日编辑:

解决了!!多亏了雷米·勒博(Remy Lebeau),他给了我育儿形象的决定性暗示。我从TMS找到了TW7Image,这是我知道的唯一具有不透明度(即AlphaBlend)属性的图像类型。我使用了以下过程:

在W7Image中,在“图片”属性中加载“黑色”图像,将“不透明度”设置为192,并设置“拉伸”模式。

将其他图像设置为“中心”,“比例”等,然后:

// In this order (!):
// 1.
imgSemiTransparentBlackLayer.Parent := MyListView;
imgSemiTransparentBlackLayer.Align := alClient;
// 2.
imgTop.Picture.LoadFromFile('MyPicture.png');
imgTop.Parent := MyListView;
imgTop.Align := alClient;
Run Code Online (Sandbox Code Playgroud)

delphi image-zoom delphi-xe2

5
推荐指数
1
解决办法
1575
查看次数