以下代码在 Delphi 10.4.1 中运行完美:
procedure TForm1.ListView1ItemClickEx(
const Sender : TObject;
ItemIndex : Integer;
const LocalClickPos : TPointF;
const ItemObject : TListItemDrawable);
var
PtScreen : TPointF;
PtForm : TPointF;
PtListView : TPointF;
begin
PtScreen := Screen.MousePos;
PtForm := ScreenToClient(PtScreen);
PtListView := ListView1.AbsoluteToLocal(PtForm);
Memo1.Lines.Add('ListView1ItemClickEx ' +
PtListView.X.ToString + ', ' + PtListView.Y.ToString);
Memo1.GoToTextEnd;
end;
procedure TForm1.ListView1MouseMove(
Sender : TObject;
Shift : TShiftState;
X, Y : Single);
begin
Memo1.Lines.Add('ListViewMouseMove ' +
X.ToString + ', ' + Y.ToString);
Memo1.GoToTextEnd;
end;
这段代码将在一个备忘录中显示鼠标在TListView内移动时的坐标,并显示来自OnItemClickEx事件的计算坐标。无论是在主监视器还是次监视器上,两者都相同。
也许您正在使用旧版Delphi,其中存在错误。我不知道。或者错误在您的代码中的其他地方。
如果您从ListView OnMouseMove事件处理程序中捕获鼠标位置并将其保存在表单变量中,则可以轻松从OnItemClickEx事件处理程序中读取该变量,从而解决您的问题。
private
FMouseX : Single;
FMouseY : Single;
procedure TForm1.ListView1MouseMove(
Sender : TObject;
Shift : TShiftState;
X, Y : Single);
begin
FMouseX := X;
FMouseY := Y;
end;
procedure TForm1.ListView1ItemClickEx(
const Sender : TObject;
ItemIndex : Integer;
const LocalClickPos : TPointF;
const ItemObject : TListItemDrawable);
begin
Memo1.Lines.Add('ListView1ItemClickEx ' +
FMouseX.ToString + ', ' + FMouseY.Y.ToString);
Memo1.GoToTextEnd;
end;