Delphi 2007 Положение модальной формы для системы с двумя мониторами

Я использую Delphi 2007 с IdeFixPack2007REg44Win10. У меня два монитора (27 дюймов, 2560 x 1440).

Я создаю тестовую программу с помощью одной кнопки. Щелчок по кнопке открывает новую модальную форму. Я могу переместить форму на рабочий стол и закрыть форму. При втором нажатии кнопки я ожидаю, что форма будет в том месте, где я закрыл форму. Для основного монитора все выглядит нормально.

Если я переместил форму на второй монитор, я всегда получаю повторно открытую форму на основном мониторе.

Если я переместил форму в область обоих мониторов (с центром на левом мониторе), я получаю повторно открытую форму с отрицательным левым значением (левый монитор; левая часть формы снаружи).

Я нашел причину в Forms.pas. В TCustomForm.SetVisible я нашел процедуру SetWindowToMonitor.

В этой процедуре левая позиция формы будет вычисляться:

ALeft := Screen.Monitors[i].Left + Left - Screen.Monitors[j].Left

в этом случае первый монитор является монитором по умолчанию (основная форма), а второй - монитором формы. В моем примере я получаю ALeft: = 0 + 2385 - 2560 (-175)

Мой исходный код:

TestFormPos_Main.pas:

    unit TestFormPos_Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, LowForm, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    x,y,h,b : Integer;
  end;

var Form1   : TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Lines.Add('Form - Left  : ' + chr(9) + IntToStr(Form2.Left));
 Memo1.Lines.Add('Form - Top   : ' + chr(9) + IntToStr(Form2.Top));
 Memo1.Lines.Add('Form - Width : ' + chr(9) + IntToStr(Form2.Width));
 Memo1.Lines.Add('Form - Height: ' + chr(9) + IntToStr(Form2.Height));
 Memo1.Lines.Add('');
 Form2.ShowModal;
 Memo1.Lines.Add(' *** Form- Left   : ' + chr(9) + IntToStr(Form2.Left));
 Memo1.Lines.Add(' *** Form- Top    : ' + chr(9) + IntToStr(Form2.Top));
 Memo1.Lines.Add(' *** Form- Width  : ' + chr(9) + IntToStr(Form2.Width));
 Memo1.Lines.Add(' *** Form- Height : ' + chr(9) + IntToStr(Form2.Height));
 Memo1.Lines.Add('');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 x := 100;
 y := 80;
 b := 850;
 h := 660;
end;

end.

TestFormPos_Main.dfm:

   object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Testform'
      ClientHeight = 422
      ClientWidth = 852
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -12
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 106
      TextHeight = 14
      object Button1: TButton
        Left = 322
        Top = 367
        Width = 157
        Height = 47
        Caption = 'Open Form (modal)'
        TabOrder = 0
        OnClick = Button1Click
      end
      object Memo1: TMemo
        Left = 8
        Top = 6
        Width = 839
        Height = 347
        TabOrder = 1
      end
    end

Unit2.pas:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, Grids;

    type
  TForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.

unit2.dfm:

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'FS-Tabellen'
  ClientHeight = 325
  ClientWidth = 666
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 106
  TextHeight = 14
end

Если кто-то может мне помочь, все будет хорошо. Я хочу повторно открыть форму в том месте, где я закрыл форму.

Спасибо! Роланд


person Geosucher    schedule 28.09.2018    source источник


Ответы (1)


Я нашел решение своей проблемы. Объект TForm2 является дочерним по отношению к TForm. Значением по умолчанию для DefaultMonitor является dmActiveForm (означает, что форма будет открыта на том же мониторе, что и родительский). Установка свойства DefaultMonitor на dmDesktop не меняет положение формы.

person Geosucher    schedule 08.10.2018