Миграция Delphi-кода Win32 в Win64 с Delphi-кодом, особенно при использовании обработчиков событий или функции, принимающей параметр TPoint: в Win32 это показывало правильные значения для точкикоординаты x и y, но при чтении в Win64 значения x и y давали «ненужные» значения или некоторое время, совпадающее с передачей значения.
В моем случае TDM_Point (Msg.lParam) Msg.lParam действительно имеет значение {3997726} и после приведения к переменной TPoint P содержат {x = 30, y = 61} в бите win32 и в win64 Msg.lParam имеют значение {3997726}, как и в win32, но после приведения к переменной TPoint P содержат {x = 3997723,y = 0})
Условно определяется следующим образом:
{$IFDEF WIN32}
TDM_Point = TSmallPoint;
{$ELSE}
TDM_Point = TPoint;
{$ENDIF}
Пример кода выглядит следующим образом:
Function process
begin
If Form.Handle = Msg.hWnd Then
begin
Control := SearchControl ( Form, TDM_Point(Msg.lParam) );
//Msg is type of tagMSG
end
end
Function Form.SearchControl ( Parent : tWinControl; P : TDM_Point ) : tControl;
Var
Index : Integer;
Control : tControl;
Rect : tRect;
tmpPoint : TPoint;
Begin
//code
end
Значение Msg устанавливается значением, возвращаемым посредством сообщения процесса
[UIPermission(SecurityAction.LinkDemand, Window=UIPermissionWindow.AllWindows)]
procedure TApplication.HandleMessage;
var
Msg: TMsg;
begin
if not ProcessMessage(Msg) then Idle(Msg);
end;
Значение устанавливается следующим образом:
If Drawing Then
Begin
{$IFNDEF WIN32}
{ Map coordinates to parent of chosen control,
or to form in no control is chosen }
If EditControls.Count > 0 Then
MapWindowPoints ( Msg.hWnd,
tControl(EditControls.Objects[0]).Parent.Handle,
Msg.lParam, 1 )
Else
MapWindowPoints ( Msg.hWnd, fEditForm.Handle,
Msg.lParam, 1 );
{$ELSE}
x:=GetSystemMetrics(SM_CXFRAME);
if abs((Msg.Pt.X-fEditForm.left-x) - TDM_Point(Msg.lParam).X) > 0 then
TDM_Point(Msg.lParam).X:=Msg.Pt.X-fEditForm.left-x;
x:=GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYFRAME);
if abs((Msg.Pt.Y-fEditForm.top-x) - TDM_Point(Msg.lParam).Y) > 0 then
TDM_Point(Msg.lParam).Y:=Msg.Pt.Y-fEditForm.top-x;
{$ENDIF}
Start.X := TDM_Point(Msg.lParam).X;
Start.Y := TDM_Point(Msg.lParam).Y;
Last := Start;
SetSelection;
SetClipRect;
End;
, пожалуйста, найдите стек вызовов ниже.мы не подготовили ни одного сообщения.это готовится системой, когда мы нажимаем на элемент управления меткой формы.две верхние функции стека вызовов являются нашими функциями, в которых мы получаем значение msg из processmessage vcl.forms