【Delphi】滑鼠在 StatusBar 的座標

放一個 Memo(在 Standard 頁), 一個 StatusBar(在 Win32 頁), 並將 StatusBar 的 Panel 分成三部份

procedure TForm1.StatusBar1Click(Sender: TObject);
var
    mpoint: TPoint;
    x, i, panel: integer;
begin
    // StatusPanels 未分區 或 StatusBar 的 SimplePanel 設為 true
    if (StatusBar1.SimplePanel) or (StatusBar1.Panels.Count=0) then
    begin
        Memo1.Lines.Add('StatusBar 未分區') ;
        exit;
    end;

    // 取得滑鼠在整個螢幕的座標
    mpoint := Mouse.CursorPos;

    // 將滑鼠位置由整個螢幕座標轉換為 StatusBar 內座標
    mpoint := StatusBar1.ScreenToClient(mpoint) ;

    panel := -1;
    x := 0;
    for i := 0 to StatusBar1.Panels.Count - 1 do
    begin
        x := x + StatusBar1.Panels[i].Width;
        if mpoint.X < x then
        begin
            panel := i;
            break;
        end;
    end;

    // 若滑鼠點在最後一區之外
    // 則當做點在最後一區處理
    if panel = -1 then
        panel := -1 + StatusBar1.Panels.Count;

    Memo1.Lines.Add(Format('滑鼠點在第 %d 區',[panel])) ;
end;