Delphi 透過發送視窗訊息控制元件捲軸 (如 `TDBGrid`),常用三種 API:`Perform`、`SendMessage`、`PostMessage`。本文詳細對比三者語法、同步/非同步特性、回傳值差異與適用場景。
// 向下翻頁
DBGrid1.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);
// 向上翻頁
DBGrid1.Perform(WM_VSCROLL, SB_PAGEUP, 0);
SendMessage(DBGrid1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);
SendMessage(DBGrid1.Handle, WM_VSCROLL, SB_PAGEUP, 0);
PostMessage(DBGrid1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);
PostMessage(DBGrid1.Handle, WM_VSCROLL, SB_PAGEUP, 0);
| 維度 | Perform | SendMessage | PostMessage |
|---|---|---|---|
| 同步性 | 同步 | 同步 (阻塞) | 非同步 (非阻塞) |
| 回傳值 | LRESULT (處理結果) | LRESULT (處理結果) | BOOL (入佇列成功與否) |
| 視窗控制代碼 | 自動取得 Self.Handle | 需手動傳 Handle | 需手動傳 Handle |
| 執行緒安全 | 僅主執行緒 | 跨執行緒可用 | 跨執行緒可用 |
| 常見用途 | VCL 內部控制、同步捲軸 | 需結果確認、跨進程 | 通知類、非阻塞觸發 |
WM_VSCROLL = $0115; // 垂直捲軸
WM_HSCROLL = $0114; // 水平捲軸
WPARAM 低字節命令碼:
SB_LINEUP = 0; // 向上一行
SB_LINEDOWN = 1; // 向下一行
SB_PAGEUP = 2; // 向上一頁
SB_PAGEDOWN = 3; // 向下一頁
SB_THUMBTRACK = 5; // 拖曳捲軸桿 (LOWORD(wParam) 為位置)
SB_TOP = 6; // 到頂端
SB_BOTTOM = 7; // 到底端
SB_THUMBPOSITION= 4; // 定位 (舊版)
// 計算目標位置並發送 SB_THUMBPOSITION
var
ScrollInfo: TScrollInfo;
begin
ScrollInfo.cbSize := SizeOf(TScrollInfo);
ScrollInfo.fMask := SIF_RANGE or SIF_PAGE or SIF_POS;
GetScrollInfo(DBGrid1.Handle, SB_VERT, ScrollInfo);
// 目標行在可見範圍內
ScrollInfo.nPos := TargetRow * RowHeight;
ScrollInfo.fMask := SIF_POS;
SetScrollInfo(DBGrid1.Handle, SB_VERT, ScrollInfo, True);
// 觸發重繪
PostMessage(DBGrid1.Handle, WM_VSCROLL, SB_THUMBPOSITION, ScrollInfo.nPos);
end;
Perform:VCL 元件內部控制、同步需求、程式碼可讀性最高。SendMessage。PostMessage。三大 API 各有分工:`Perform` 是 VCL 開發者的瑞士刀,`SendMessage` 是同步控制的基石,`PostMessage` 是非同步架構的基石。理解同步 vs 非同步、回傳值語意、執行緒語境三大核心差異,即能在捲軸控制、自訂訊息、跨進程通訊等場景精準選型。