Hello again,

I've found a solution, but I'm maybe too stupid to create a patch, so here is the manual patch:

To have a ShowModal more similar to Delphi, simply change the HandleCursor procedure in 'win32callback.inc' to this:

  procedure HandleSetCursor;
  var
    lControl: TControl;
    BoundsOffset: TRect;
  begin
    if (lWinControl <> nil) and not (csDesigning in lWinControl.ComponentState) then
      case Lo(LParam) of
        HTCLIENT:
          begin
            Windows.GetCursorPos(Windows.POINT(P));
            Windows.ScreenToClient(Window, Windows.POINT(P));
            if GetLCLClientBoundsOffset(lWinControl.Parent, BoundsOffset) then
            begin
              Dec(P.X, BoundsOffset.Left);
              Dec(P.Y, BoundsOffset.Top);
            end;
            // statictext controls do not get WM_SETCURSOR messages...
            lControl := lWinControl.ControlAtPos(P, false, true);
            if lControl = nil then
              lControl := lWinControl;
            if lControl.Cursor <> crDefault then
            begin
              Windows.SetCursor(Windows.LoadCursor(0, LclCursorToWin32CursorMap[lControl.Cursor]));
              LMessage.Result := 1;
            end;
          end;
        HTERROR:
          begin
            if (Hi(LParam) = WM_LBUTTONDOWN) and (TWin32WidgetSet(WidgetSet).AppHandle <> 0) and
              (GetForegroundWindow <> GetLastActivePopup(TWin32WidgetSet(WidgetSet).AppHandle)) then
            begin
              Application.BringToFront;
              Exit;
            end;
          end;
      end;
    if LMessage.Result = 0 then
    begin
      LMessage.Msg := LM_SETCURSOR;
      LMessage.WParam := WParam;
      LMessage.LParam := LParam;
    end;
    WinProcess := false;
  end;


and in 'win32object.inc' change 'AppBringToFront' to

procedure TWin32WidgetSet.AppBringToFront;
var
  TopWindow: HWnd;
begin
  if FAppHandle <> 0 then
  begin
    TopWindow := GetLastActivePopup(FAppHandle);
    if (TopWindow <> 0) and (TopWindow <> FAppHandle) and
      IsWindowVisible(TopWindow) and IsWindowEnabled(TopWindow) then
      Windows.SetForegroundWindow(TopWindow);
  end;
end;


Reply via email to