Я использую 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)
Мой исходный код:
ТестtFormPos_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
Если кто-то может мне помочь, все будет хорошо.Я хочу снова открыть форму на месте, где я закрыл форму.
Спасибо!Roland