在 Delphi 11 Alexandria 的 Windows 10 中的 32 位 VCL 应用程序中,我有一个TListView
,我在 FormCreate 处理程序中将 ListView 的标题字体样式设置为 BOLD:
private
FhHeaderFont: THandle;
procedure TformMain.FormCreate(Sender: TObject);
begin
...
SetColumnHeaderFontBold;
end;
procedure TformMain.SetColumnHeaderFontBold;
const
LVM_GETHEADER = Winapi.CommCtrl.LVM_FIRST + 31;
var
LF: Winapi.Windows.TLogFont;
hHeader, hCurrFont, hOldFont: THandle;
begin
hHeader := Winapi.Windows.SendMessage(lvMRUProjects.Handle, LVM_GETHEADER, 0, 0);
hCurrFont := Winapi.Windows.SendMessage(hHeader, WM_GETFONT, 0, 0); // ERangeError
if GetObject(hCurrFont, SizeOf(LF), Addr(LF)) > 0 then
begin
LF.lfWeight := Winapi.Windows.FW_BOLD;
FhHeaderFont := Winapi.Windows.CreateFontIndirect(LF);
hOldFont := Winapi.Windows.SelectObject(hHeader, FhHeaderFont);
Winapi.Windows.SendMessage(hHeader, winapi.Messages.WM_SETFONT, FhHeaderFont, 1);
end;
end;
ERangeError
现在,我在启动程序时随机得到一个:
hCurrFont := Winapi.Windows.SendMessage(hHeader, WM_GETFONT, 0, 0); // ERangeError
这是 Eurekalog 调用堆栈:
这是错误消息:
Range check error at (004EDAED){MyApp.exe} [008EDAED] MainForm.TformMain.SetColumnHeaderFontBold (Line 616, "MainForm.pas") + $13.
是什么导致了这个错误,我该如何避免它?