子窗体弹出位置错误

原创 2007年02月07日 20:33:00

在设计窗体时通常会把子窗体的 Position 设置成 poMainFormCenter。也就是说,子窗体弹出的位置是主窗体的正中。但是如果把主窗体拖动到屏幕左下角,而且主窗体的50%部分已经超出了屏幕范围,这个时候主窗体的正中其实已经不在屏幕范围之内了。这个时候弹出的子窗体可能部分或者完全处在屏幕之外了。

具体解决方法:修改 Forms.pas,修改 procedure TcustomForm.CMShowingChanged(var Message: Tmessage);

procedure TCustomForm.CMShowingChanged(var Message: TMessage);
const
  ShowCommands: 
array[TWindowState] of Integer =
    (SW_SHOWNORMAL, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED);
var
  X, Y: Integer;
  NewActiveWindow: HWnd;
  CenterForm: TCustomForm;
begin
  
if not (csDesigning in ComponentState) and (fsShowing in FFormState) then
    
raise EInvalidOperation.Create(SVisibleChanged);
  Application.UpdateVisible;
  Include(FFormState, fsShowing);
  
try
    
if not (csDesigning in ComponentState) then
    
begin
      
if Showing then
      
begin
        
try
          DoShow;
        
except
          Application.HandleException(Self);
        
end;
        
if (FPosition = poScreenCenter) or
           ((FPosition = poMainFormCenter) 
and (FormStyle = fsMDIChild)) then
        
begin
          
if FormStyle = fsMDIChild then
          
begin
            X := (Application.MainForm.ClientWidth - Width) 
div 2;
            Y := (Application.MainForm.ClientHeight - Height) 
div 2;
          
end else
          
begin
            X := (Screen.Width - Width) 
div 2;
            Y := (Screen.Height - Height) 
div 2;
          
end;
          
if X < Screen.DesktopLeft then
            X := Screen.DesktopLeft;
          
if Y < Screen.DesktopTop then
            Y := Screen.DesktopTop;
          
if Y > Screen.WorkAreaHeight - Height then  //PATCH
            Y := Screen.WorkAreaHeight - Height;      
//PATCH
          SetBounds(X, Y, Width, Height);
          
if Visible then SetWindowToMonitor;
        
end
        
else if FPosition in [poMainFormCenter, poOwnerFormCenter] then
        
begin
          CenterForm := Application.MainForm;
          
if (FPosition = poOwnerFormCenter) and (Owner is TCustomForm) then
            CenterForm := TCustomForm(Owner);
          
if Assigned(CenterForm) then
          
begin
            X := ((CenterForm.Width - Width) 
div 2) + CenterForm.Left;
            Y := ((CenterForm.Height - Height) 
div 2) + CenterForm.Top;
          
end else
          
begin
            X := (Screen.Width - Width) 
div 2;
            Y := (Screen.Height - Height) 
div 2;
          
end;
          
if X < Screen.DesktopLeft then
            X := Screen.DesktopLeft;
          
if Y < Screen.DesktopTop then
            Y := Screen.DesktopTop;
          
if Y > Screen.WorkAreaHeight - Height then  //PATCH
            Y := Screen.WorkAreaHeight - Height;      
//PATCH
          SetBounds(X, Y, Width, Height);
          
if Visible then SetWindowToMonitor;
        
end
        
else if FPosition = poDesktopCenter then
        
begin
          
if FormStyle = fsMDIChild then
          
begin
            X := (Application.MainForm.ClientWidth - Width) 
div 2;
            Y := (Application.MainForm.ClientHeight - Height) 
div 2;
          
end else
          
begin
            X := (Screen.DesktopWidth - Width) 
div 2;
            Y := (Screen.DesktopHeight - Height) 
div 2;
          
end;
          
if X < Screen.DesktopLeft then              //PATCH
            X := Screen.DesktopLeft;                  
//
          
if Y < Screen.DesktopTop then               //
            Y := Screen.DesktopTop;                   
//
          
if Y > Screen.WorkAreaHeight - Height then  //
            Y := Screen.WorkAreaHeight - Height;      
//PATCH
          SetBounds(X, Y, Width, Height);
        
end;


好了!大功告成。将修改后的 Forms.pas 复制到您的工程目录下,再次编译您的程序。这个问题消失了。

此外,对于修改 Delphi 的源文件,我建议把所有修改过的源文件都放在一个新的目录 (例如 PatchedVCLs),然后在 Delphi 里面定义一个环境变量,这样以后你只要给其它工程的路径里面添加这个环境变量,这些工程都可以使用你修改过的代码了。至于修改源码的一些方法和技巧,请参考 如何访问私有成员变量和函数 

解决laydate时间日期插件定位溢出

laydate是一款比较好用的网页时间日期插件,不过用起来有一些细节问题需要我们手动去解决!例如:laydate兼容bootstrap laydate弹出层默认对齐input左边框   ...
  • layman1024
  • layman1024
  • 2017年05月12日 16:22
  • 888

Android PopupWindow怎么合理控制弹出位置(showAtLocation)

说到PopupWindow,应该都会有种熟悉的感觉,使用起来也很简单 // 一个自定义的布局,作为显示的内容 Context context = null;  // 真实环境中要赋值 int lay...
  • yangwei__123
  • yangwei__123
  • 2017年07月14日 09:49
  • 307

PopupWindow之在指定位置弹出小结

``创建 PopupWindow LayoutInflater mLayoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_...
  • Silence_Leo
  • Silence_Leo
  • 2016年11月23日 21:06
  • 4660

Winform窗口弹出位置控制

Winform窗口弹出位置控制 窗体的弹出位置可以由属性StartPosition来指定,默认值有: Manural  自定义,由属性Location指定; CenterScreen...
  • weini_xiong
  • weini_xiong
  • 2014年08月15日 15:43
  • 1959

JQuery中弹出层位置设置

在JQuery中,经常会用到弹出层tooltip进行信息的显示,经常会在某个标签,例如或者上,当鼠标放上去时,将弹出层显示在此标签的下方或者当前鼠标指针的右下方。     这两种都首先需要将弹出框设...
  • CHINADENG
  • CHINADENG
  • 2014年08月08日 08:46
  • 6335

Android 自定义PopupWindow指定位置或给定View坐标弹出

PopupWindowHelper是一个根据View的位置显示PopupWindow的一个工具类、弹出PopupWindow的位置会根据指定的View出现的位置而动态改变、本Demo是用Android...
  • qq_35114086
  • qq_35114086
  • 2016年09月24日 09:55
  • 898

安卓中实现自定义对话框以及自定义显示位置

项目中有用到如下的对话框效果,本来是想用popwindow来实现的结果发现不能覆盖原来的布局,不知道是我了解的不够还是本身就不行,发现弹出的对话框会与原来的布局重叠 后面就用对话框来实现了,接下...
  • laohu715
  • laohu715
  • 2017年03月18日 16:17
  • 1074

bootstrap弹出框居中

bootstrap弹出框居中
  • qq_33637142
  • qq_33637142
  • 2016年01月06日 14:20
  • 920

Android通过PopupMenu定义弹出菜单的位置

效果如图: 具体实现代码如下: package com.example.mytest; import android.app.Activity; import android.o...
  • Ke1vin
  • Ke1vin
  • 2015年12月26日 16:59
  • 4942

Android 自定义PopupWindow指定位置或给定View坐标弹出

PopupWindowHelper是一个根据View的位置显示PopupWindow的一个工具类、弹出PopupWindow的位置会根据指定的View出现的位置而动态改变、本Demo是用Android...
  • jdsjlzx
  • jdsjlzx
  • 2016年07月26日 11:12
  • 5435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:子窗体弹出位置错误
举报原因:
原因补充:

(最多只允许输入30个字)