- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在Delphi 10.2 Tokyo中实现以下目标:我需要Delphi不仅为每个窗口自动设置大图标,而且还要自动设置大图标和小图标。对于某些表格和TApplication,我需要有一个在运行时更改图标的机会。我希望做到这一点而无需修改VCL.Forms.pas
(小图标是显示在窗口标题栏中的一个标题,位于窗口标题的左侧)。TCustomForm
中有一个函数:
function GetIconHandle: HICON;
VCL.Forms.pas
的引号:
SendMessage(Handle, WM_SETICON, ICON_BIG, GetIconHandle);
ICON_BIG
和
ICON_SMALL
的代码编译的程序的屏幕截图。右栏标记为v7.4.16.22,是同一程序的屏幕快照,该程序没有显式设置大小图标,而只是将
TIcon
分配给表单,然后使用其标准代码的Delphi仅分配大图标,因此Windows会通过大图标调整Windows标题栏中的图像大小。您可能会看到,由于标准的Delphi行为,质量变得很差。
VCL.Forms.pas
的接口(interface)部分中的GetIconHandle从静态更改为虚拟,将其从
function
更改为
procedure
并添加了两个参数:
procedure GetIconHandle(var Big, Small: HICON); virtual;
var
Big, Small: HICON;
begin
[...]
GetIconHandle(Big, Small);
SendMessage(Handle, WM_SETICON, ICON_BIG, LParam(Big));
SendMessage(Handle, WM_SETICON, ICON_SMALL, LParam(Small));
[...]
VCL.Forms.pas
?
Create
或Destroy
。在以前的Delphi版本中,仅编写class
而没有任何祖先隐式地从TObject
继承了它,但是当我使用dcc32
命令行选项通过dcc32 -Q -M -$D- -$M+
从命令行编译代码时,会发生此错误,即在基类中找不到Create
或Destroy
。 procedure LoadIconPair(var Big, Small: hIcon; AName: PChar);
begin
if Win32MajorVersion < 4 then
begin
Big := LoadIcon(hInstance, AName);
Small := 0;
end
else
begin
Big := LoadImage(hInstance, AName, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
Small := LoadImage(hInstance, AName, IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
end;
end;
GetSystemMetrics(SM_CXICON)
,
GetSystemMetrics(SM_CYICON)
用于大图标,
GetSystemMetrics(SM_CXSMICON)
和
GetSystemMetrics(SM_CYSMICON)
用于小图标。
LoadIconPair
,然后通过覆盖的
procedure GetIconHandle(var Big, Small: HICON); override;
返回句柄。
VCL.Forms.pas?
(这是主要问题)-我需要有机会(对于某些表格和TApplication)更改图标在运行时。 Create
或Destroy
吗? ICON_BIG
,我们必须再次设置图标,这一次设置大小。您是否知道如何修补VCL.Forms.pas以在设置大图标时添加设置
ICON_SMALL
的想法,所以我们仅修补
implementation
部分,并将调用一些消息,甚至是WM_USER + N来请求图标从表单处理,我们的TForm后代将实现此消息处理程序?
最佳答案
从理论上讲,不允许修补Delphi核心VCL/RTL源的interface
部分。您以前这样做的事实现在以回旋镖的形式返回。在大多数情况下,您可以在不打补丁的情况下做所需的事情,例如通过使用继承,类助手,在运行时修补代码,绕行,以及在其他情况下(后者是IMO的最后手段)修补implementation
部分,并为您的项目使用本地副本,这是允许的-另请参见 How to recompile modifications to VCL source file
和 How to change VCL code?
我建议在应用程序中为所有表单(我认为任何大型项目都应该这样做)创建一个祖先基类,并覆盖CreateWnd
:
procedure TBaseForm.CreateWnd;
var
Big, Small: HICON;
begin
inherited;
if BorderStyle <> bsDialog then
begin
GetIconHandles(Big, Small);
if Big <> 0 then
SendMessage(Handle, WM_SETICON, ICON_BIG, LParam(Big));
if Small <> 0 then
SendMessage(Handle, WM_SETICON, ICON_SMALL, LParam(Small));
end;
end;
procedure TBaseForm.GetIconResName(var Name: string);
begin
Name := 'MAINICON';
end;
procedure TBaseForm.GetIconHandles(var Big, Small: HICON);
var
ResName: string;
begin
Big := 0;
Small := 0;
GetIconResName(ResName);
if ResName = '' then Exit;
Big := LoadImage(HInstance, PChar(ResName), IMAGE_ICON,
GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON),
0);
Small := LoadImage(HInstance, PChar(ResName), IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
0);
end;
GetIconResName
。
TMyChildForm = class(TBaseForm)
protected
procedure GetIconResName(var Name: string); override;
end;
procedure TMyChildForm.GetIconResName(var Name: string);
begin
Name := 'SPIDERMAN';
end;
This is not a complete solution...
ICON_BIG
发送到窗体/应用程序窗口句柄。 (Delphi7/Win7)。 (这就是为什么我要求
MCVE 的原因。包括有关您的Icons格式的信息。而不仅仅是像您一样的代码片段...)
Application.Icon
,应用程序就会使用
CM_ICONCHANGED
通知表单(请参阅:
procedure TApplication.IconChanged(Sender: TObject);
)。因此您可以通过
SendMessage(Application.Handle, WM_SETICON...
(这不会触发
CM_ICONCHANGED
)或直接设置
Application.Icon
(也将触发
CM_ICONCHANGED
)在该消息处理程序中重新设置Application图标。如果需要,通过
WM_SETICON
消息设置大小图标。您还需要设置类(class)图标:
SetClassLong(Application.Handle, GCL_HICON, FIcon);
CM_ICONCHANGED
就会覆盖它。
TBaseForm = class(TForm)
private
procedure CMIconChanged(var Message: TMessage); message CM_ICONCHANGED;
...
procedure TBaseForm.CMIconChanged(var Message: TMessage);
...
WM_SETICON
消息处理程序:
TBaseForm = class(TForm)
private
procedure WMSetIcon(var Message: TWMSetIcon); message WM_SETICON;
...
procedure TBaseForm.WMSetIcon(var Message: TWMSetIcon);
begin
if (Message.Icon <> 0) and (BorderStyle <> bsDialog) then
begin
// this big icon is being set by the framework
if Message.BigIcon then
begin
// FBigIcon := LoadImage/LoadIcon...
// if needed set Message.Icon to return a different big icon
// Message.Icon := FBigIcon;
// in practice create a virtual method to handle this section so your child forms can override it if needed
inherited;
FSmallIcon := LoadImage/LoadIcon...
// set small icon - this will also re-trigger WMSetIcon
Perform(WM_SETICON, ICON_SMALL, FSmallIcon);
end else
inherited;
end
else
inherited;
end;
关于windows - 除了ICON_BIG之外,如何使Delphi 10.2 Tokyo荣誉ICON_SMALL(窗口标题栏图标)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44746352/
请在标记为重复之前阅读。 我正在创建一组依赖智能卡进行身份验证的应用程序。到目前为止,每个应用程序都单独控制智能卡读卡器。几周后,我的一些客户将同时使用多个应用程序。因此,我认为创建一个控制身份验证过
我想设置一个小程序,从数据库中检索信息,然后根据请求将该信息分发给另一个程序。例如,一个名为“Master”的程序将从数据库中检索数据并创建一个对象集合(列表、数组等,无论哪种效果最好),然后一个名为
我有两台电脑,都装有 XE2。我以为我在两者上安装了相同的安装,但在其中一个上安装第 3 方软件包时遇到问题,而另一个则正常。 无论如何,我希望两者都一样。最简单的人可能只是通过移入我的 Dropbo
有冲突吗? 最佳答案 所有新版本的 Delphi 始终可以安全地安装到旧版本的下一个版本。 每个新版本都应安装在其自己的目录中。 如果您要安装多个版本,请始终先安装最旧的版本,然后再安装最新版本。 我
快速提问:如果我从代码中删除 // 或 (* *) 中的注释,Delphi 2007 的执行时间会受到影响吗?最终结果是一个可能包含数千行注释的 EXE 文件。 最佳答案 编译器会简单地忽略注释,并且
我必须对照另一个文件检查文件的每一行。 如果第二个文件中存在第一个文件中的一行,则必须删除它。 现在,我正在使用2个列表框,并且“对于listbox1.items.count-1可以开始...” 我的
我正在尝试在访问数据库中添加一些数据。但是我有麻烦,因为这会返回错误: ADOQuery1 missing sql property 实现了对代码的几次修改,到目前为止没有任何效果。 我究竟做错了什么
我用Delphi 5编写了一个程序,在Windows 8 32位PC上可以正常运行。我发现在Windows 7 64位笔记本电脑上运行它最终会导致reallocmem错误,而该错误在32位PC上不会发
看来这是我需要的工具,用于提取XML并与TClientDataset连接。我已经在几篇文章和文档中看到了它,但是我无法在XE2组件列表中找到它-在任何地方!应该在哪里?是否在可能未安装的可选软件包中?
我正在寻找一个非常通用的TDBTree组件,我想听听一些建议。我正在特别寻找一种显示主记录和“ n”个链接表记录的记录。 (我的意思是来自各个表的记录)。例如,TDBTree将钩接到主表,明细表1,附
我需要将按钮制作成旋转三角形的形状(或者说是任何多边形)。谁能提供任何建议? 最佳答案 查看Win32 API CreatePolygonRgn()和SetWindowRgn()函数,以创建一个HRG
你好专家 我的JvPasswordForm1有一个旧的JVC组件。 似乎该组件不再存在:它替换为哪个组件? 重新获得 最佳答案 尝试查找TJvLoginDialog,TjvPassword已合并到其中
几天前,我已经设置了我的开发环境(在装有Win 7的VM和域上的用户的VM上安装了delphi 2009),并安装了我的组件(jedi's,devExpress,ADS等)。 今天,我启动机器,打开d
开始对控件进行子分类的正确位置/时间是什么? 恢复原始窗口proc的正确时间是几点? 现在我在表单创建过程中子类化: procedure TForm1.FormCreate(Sender: TObje
有人可以给我一些有关如何登录访问的网页(使用任何网络浏览器)的指示吗?我应该建立一个全球代理....钩住网络....吗?我需要记录的只是页面地址,而不是其中包含的信息。 我正在使用Delphi。 谢谢
我创建了一个像 TMyClass = class(TObject) private FList1: TObjectList; FList2: TObjectList; public end;
我有一个BPG文件,我已对其进行修改以用作我们公司的自动构建服务器的make文件。为了使其正常工作,我必须进行更改 用途*用途 'unit1.pas'中的unit1 * unit1 'unit2.pa
我将Delphi 7代码迁移到了Delphi XE4。我在Delphi XE4的LoadFromStram方法中遇到错误,但对于Delphi 7来说也可以正常工作。 错误: First chance
我正在尝试学习一些新技巧,以便更好地组织我在 Delphi 中的单元中的一些源代码。 我注意到我访问的一些函数或方法似乎是类中的类,但是我还没有成功地在类中创建一个工作类,虽然它编译得很好,但在执行代
我有一个包含许多类的大单元,现在我想通过将某些类分成新的单元来重构该单元。 我不得不承认我缺乏使用Delphi内置IDE功能的经验。利用内置功能“查找|查找对类型的本地引用”并没有多大帮助,因为类方法
我是一名优秀的程序员,十分优秀!