【问题标题】:Move form to bottom right corner将表格移动到右下角
【发布时间】:2015-02-27 10:30:11
【问题描述】:

我一直在努力将运行时创建的表单移动到主表单的右下角。

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 表单定位在主表单的底角。我不知道该怎么做。

类似

【问题讨论】:

  • @SertacAkyuz poDesigned 对 OP 有什么用处,尤其是因为主窗体可能与设计时不在同一位置?事实上,我强烈建议不要在任何时候使用 poDesigned。为什么?因为如果您的应用程序是在分辨率较小的显示器上启动的,则表单实际上可能位于可视区域之外,因此用户无法访问。
  • @Silver - 我不明白你的问题。如果您希望表单使用您分配的左侧和顶部,您必须设置位置'poDesigned'。
  • 是的,但 OP 试图在使用绝对屏幕位置的 poDesigned 位置表单时相对于其主表单位置定位第二个表单。如果您一直在 1900x1080 等屏幕尺寸上开发应用程序,并且在设计时放置了表单,让我们说在 1200:1000 在屏幕尺寸为 1024x768 的显示器上运行此类应用程序会导致表单位于可见区域之外因为它的左侧和顶部位置将大于屏幕宽度和高度。
  • 除了在使用内置表单设计器的较新的 Delphi 版本中如何确定设计时表单的位置,而不是像在旧的 Delphi 版本中常见的那样独立的 winow。
  • @SilverWarior Sertac 是对的,Position 必须设置为 poDesigned,否则表单不会根据 Left 和 Top 自行定位。我只是在查看对我的关于非父位置 inside 其他表单边框的答案的更正,但 BorderWidth 是 zero

标签: forms delphi delphi-xe7


【解决方案1】:

在以下所有情况下,使用

F1.Position := poDesigned;

F1 parent = 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;

感谢 Sertac 提醒我有关 ClientOrigin 的信息

【讨论】:

  • @SertacAkyuz 我一直忙于另一个项目。当我有时间测试它时,我会回复答案,因为我无法在家中进行测试。我明天试试。
  • @TomBrunberg ,我已经尝试过您的解决方案,它适用于我的要求。但我刚刚发现我的表单不是从其他表单调用的,它是从一个 DBGrid 组件调用的,该组件将所有客户端对齐到一个表单 => 左/上将始终为 0。
  • 我用一个分配给 dbgrid 父级的 TWinControler 更改了 self,它可以工作。 TY
猜你喜欢
  • 2018-08-27
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多