在 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.
是什么導致了這個錯誤,我該如何避免它?
uj5u.com熱心網友回復:
這里有兩個問題:
- 您宣告了型別錯誤的各種變數。
- 在處理 Windows 訊息時,有時需要使用型別轉換。
對于第一個問題,您宣告為的每個變數都THandle被錯誤地宣告。THandle用于內核句柄,是HANDLEWindows C頭檔案中對應的Delphi型別。代碼中的句柄都不是內核句柄,它們都是用戶模式物件。
FhHeaderFont,hCurrFont并且hOldFont都應該被宣告為HFONT. hHeader應宣告為HWND.
導致您的范圍檢查錯誤的問題是我串列中的第二個問題。如果您考慮SendMessage必須做什么,它會用于任何 Windows 訊息。這些訊息適用于大量不同的資料型別。這意味著在SendMessage接受和回傳的泛型整數型別與用于引數和回傳值的變數型別之間有時會出現不匹配。這些不匹配應該通過型別轉換來處理。
范圍檢查錯誤的原因是SendMessage回傳LRESULT一個有符號整數,指標大小。但是THandle是一個無符號整數,指標大小。即使您使用 更正此問題HFONT,也會出現相同的錯誤,因為HFONT它也是一個無符號整數,指標大小。
通過型別轉換回傳值來處理這個問題:
hCurrFont := HFONT(Winapi.Windows.SendMessage(hHeader, WM_GETFONT, 0, 0));
同樣,您應該對其他回傳值分配執行相同的操作:
hHeader := HWND(...);
嚴格來說,最好在傳遞時FhHeaderFont與wParam在最終呼叫時一樣做SendMessage. 我想我會這樣寫:
Winapi.Windows.SendMessage(hHeader, winapi.Messages.WM_SETFONT, WPARAM(FhHeaderFont), 1);
最后一個注意事項是LVM_GETHEADER在Winapi.CommCtrl此處定義且不應在此處重新定義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/406367.html
標籤:
