Переместить форму в правый нижний угол

Некоторое время я пытался переместить созданную во время выполнения форму в правый нижний угол основной формы.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
//    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
//    procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  F1 : TForm;
begin
   F1 := TForm.Create(nil);
   F1.Height := 300;
   F1.Width :=300;
   F1.Position := poDesktopCenter;
   F1.Name := 'asdf';
   F1.Left:=ClientOrigin.X;//+ ActiveControl.Left+ ClientOrigin.X;
   F1.Top:=ClientOrigin.Y;//+ClientOrigin.Y;
   F1.Show;
end;

//procedure TForm1.FormClick(Sender: TObject);
//var
//  pt : TPoint;
//begin
//   pt := mOUse.CursorPos;
//   lABEL3.Caption := IntToStr(pt.X);
//   label4.Caption := IntToStr(pt.Y);
//end;
//
//procedure TForm1.WindowPosChanging(var Msg: TMessage);
//begin
//    Label1.Caption :=  IntToStr(ClientOrigin.X);
//    Label2.Caption :=  IntToStr(ClientOrigin.Y);
//end;

end.

Итак, у нас есть этот пример.

F1.Position := poDesktopCenter;

Эта команда отлично работает, если вы хотите отцентрировать форму на рабочем столе, но я хочу поместить форму F1 в нижний угол основной формы. Я не могу понять, как это сделать.

Что-то вроде этого введите здесь описание изображения


person CiucaS    schedule 27.02.2015    source источник
comment
@SertacAkyuz Чем poDesigned будет полезен для ОП, тем более что основная форма может находиться не в том же положении, что и во время разработки? На самом деле, я настоятельно рекомендую никогда не использовать poDesigned. Почему? Потому что, если ваше приложение запущено на мониторе с меньшим разрешением, форма может фактически находиться за пределами визуальной области и, следовательно, недоступна для пользователя.   -  person SilverWarior    schedule 27.02.2015
comment
@Silver - я не понимаю твоего вопроса. Если вы хотите, чтобы форма использовала назначенные вами левое и верхнее положение, вы должны установить положение «poDesigned».   -  person Sertac Akyuz    schedule 27.02.2015
comment
Да, но OP пытается позиционировать вторую форму относительно ее основной позиции формы при использовании формы позиций poDesigned с использованием абсолютной позиции экрана. И если вы разрабатывали свое приложение на экране размером 1900x1080, и во время разработки форма была расположена, скажем, в 1200:1000, запуск такого приложения на мониторе с размером экрана 1024x768 привел бы к тому, что форма будет расположена за пределами видимой области. так как его левое и верхнее положение будет больше, чем ширина и высота экрана.   -  person SilverWarior    schedule 27.02.2015
comment
Кроме того, как положение формы во время разработки определяется даже в более новой версии Delphi, в которой используется встроенный конструктор форм, а не отдельное окно, как это было распространено в более старых версиях Delphi.   -  person SilverWarior    schedule 27.02.2015
comment
@SilverWarior Sertac прав, для параметра Position должно быть установлено значение poDesigned, иначе форма не будет позиционировать себя в соответствии с положением Left и Top. Я просто смотрю на исправление к моему ответу относительно неродительской позиции внутри границ других форм, но BorderWidth ноль!   -  person Tom Brunberg    schedule 27.02.2015
comment
@Tom - используйте ClientOrigin.X+ClientWidth-F1.Width; и ClientOrigin.Y+ClientHeight-F1.Height; для учета границ нижней формы.   -  person Sertac Akyuz    schedule 27.02.2015
comment
@Sertac Спасибо за напоминание, я знал, что что-то было ...;)   -  person Tom Brunberg    schedule 27.02.2015
comment
@Silver Ваш аргумент против использования фиксированной позиции для формы очень действенен, но необходим в данном случае со свободно плавающей формой. Напоминает мне, однажды меня попросили внести изменения, чтобы сохранить положение формы при завершении работы. Хорошо, простое сохранение в реестре. Вскоре меня попросили добавить новую функцию, чтобы сделать форму видимой. Кто-то работал с ноутбуком в офисе на дополнительном дисплее и имел некоторые проблемы в дороге (без него).   -  person Tom Brunberg    schedule 27.02.2015


Ответы (1)


Во всех приведенных ниже случаях используйте

F1.Position := poDesigned;

Родитель F1 = Form1, справа внизу внутри границ Form1

F1.Parent := self;
F1.Left := self.ClientWidth - F1.Width;
F1.Top  := self.ClientHeight - F1.Height;

Self является необязательным, но дает понять, что вы ссылаетесь на свойства Form1, в контексте которой вы выполняете код.

Родитель F1 не назначен, справа внизу с перекрывающимися границами

F1.Left := Left + Width - F1.Width;
F1.Top  := Top + Height - F1.Height;

Родитель F1 не назначен, справа внизу внутри границ Form1

F1.Left := ClientOrigin.X + ClientWidth - F1.Width;
F1.Top  := ClientOrigin.Y + ClientHeight - F1.Height;

Спасибо Сертаку за то, что он напомнил мне о ClientOrigin

person Tom Brunberg    schedule 27.02.2015
comment
@SertacAkyuz я был занят другим проектом. Я вернусь с ответом, когда у меня будет время проверить его, так как я не могу сделать это из дома. попробую завтра сделать. - person CiucaS; 02.03.2015
comment
@TomBrunberg, я попробовал ваше решение, оно работает для того, о чем я просил. Но я только что обнаружил, что моя форма не вызывается из другой формы, она вызывается из компонента DBGrid, который выравнивает всех клиентов в форме => слева/сверху всегда будет 0. - person CiucaS; 03.03.2015
comment
я изменил себя с помощью TWinControler, которому назначен родитель dbgrid, и он работает. ТЮ - person CiucaS; 03.03.2015