现在在做一个工程,里面有80多个窗体,每个窗体上的控件也很多,现在老板要求这些窗体都不许使用弹出式的,所以我在主界面放了个panel组件,把所有调用的窗体显示在panel里。本人菜鸟一个,不知道有没有更好的方法实现这种功能?而且这种方法有个问题一直没办法解决,我现在的用的屏幕分辨率是1440*900的,当我调整屏幕为1024*768时窗体上的控件就显示不完全了,更别说是800*600的分辨率了。有什么办法可以解决这么多窗体的分辨率问题?

解决方案 »

  1.   

    你可以动态调整客户显示器分辨率,或者是使用TScrollBox来代替你现在使用的Panel。
    PS:通常我们所做的开发应该是在一个普遍的环境中进行的,如现在大部分用户的显示器分辨率设定为1024*768,你却要在更大的分辨率上进行UI的设计。你不能强迫用户使用和你相同的分辨率,但是你可以把你的分辨率设定成和客户一样的呀!
      

  2.   

    谢谢楼上的,我试一下TScrollBox看看。
    分辨率的问题你说得很对,我不能强迫用户使用和我一样的分辨率,所以我想找一个什么方法让我的系统适应用户的分辨率。如果我设成1024*768的,那还有其他用户可能是800*600的,又或者是1440*900的,现在显示器很便宜的,随时换都可以。总不能把显示器一换就跟着把系统给换了吧。
    继续顶~~~现在还发现个问题,当我在设计界面时,会出现内存溢出报错,不知道是不是panel装太多窗体了,但每次调用窗体我都会用close关闭所有的窗体再将调用的显示出来。谁能顺便把这个问题给解决了再加30分。
      

  3.   

    TScrollBox可以滚动来显示窗体内容,但还是达不到我想要的效果。谢谢你chris_mao。
      

  4.   

    一般是出现死循环现象会导致内存溢出,当然也不可必免是其他原因所致。你完全没有必要在程序一开始就创建所有窗体,调用时再关闭所有,打开调窗体。你只要自动创建主窗体,其余窗体全部设为手工创建,这样你就可以调用哪个就创建哪个,用完就释放。不会消耗太多的内存。关于分辨率的问题,你可以将窗体上的所有控件的锚点都设上(Anchor属性),当创建窗体时让窗体大小匹配Panel的尺寸。
      

  5.   

    谢谢~
    我现在还没开始编写程序,应该不存在死循环吧?我启动程序只创建主窗体,那些都是手工调用的,不用的时候我是以close的方式关闭的,不知道这样能不能释放内存空间?
    你给我的说的TScrollBox是可以用滚动方式来显示,但还是解决不了分辨率的问题。
    Anchor属性我有设过了,不行。窗体的Align属性全部都设成alClient,是匹配Panel组件尺寸的。
      

  6.   

    根据分辨率设置窗体和控件,设置的时候可以把长宽设为实际长度厘米,而不是多少象素,具体这样进行
    一英寸=2.54厘米
    宽:
    一英寸里面有
    GetDeviceCaps(GetDC(Form1.Handle),LOGPIXELSX)个像素
    高:
    一英寸里面有
    GetDeviceCaps(GetDC(Form1.Handle),LOGPIXELSY)个像素
    那么
    一厘米内的像素数为
    一英寸内的像素数除以2.54
    那我们的窗口宽5厘米,高4厘米
    那实际像素数即可求出
      

  7.   

    锚点不是设置子窗体的锚点,而是每个子窗体内的每个控件的锚点,这样每个控件就会随着子窗体的改变而自动改变控件大小的,不过一般可不是四个锚点全部设置,根据需要设置,一般都是设置左右或上下的,这个要根据具体情况具体使用了;
    还有窗体太多,一定要手动创建,用完就close。但是每个窗体的Close事件,要把Action设置成Cafree,他才真正释放的。
      

  8.   

    TO:
    谢谢~~ Action怎么设置成Cafree啊?设计时窗体的这个属性值是空的。运行时怎么赋给它啊?
    难道分辨率的问题真的要一个个设置这些属性?而且这些属性都未必能解决啊,我设过groupbox和装在它里面的组件,但一调窗体大小的时候就变样了,没有达到我想要的结果。这个问题可能刻薄了点,但不是没有根据的,因为我们这边有一套系统做的就是这样,可惜没有源码,不知道怎么做的。当窗体小到没办法显示完控件时它还可以换行显示,To  猴子007、chris_mao :
    你们俩的锚点设置也可以有些作用,谢谢你们!结帖时给分。To All:大家帮帮忙继续讨论一下有没有更好的方法实现.......
      

  9.   

    “当窗体小到没办法显示完控件时它还可以换行显示,”
    这个方法就要在程序中手动调整了,比如在Resize事件中判断如果不够显示,则将控件依次向下瞬移等,这个不能靠属性自动完成,只能自己编写控制代码了
      

  10.   

    还有我说的那个Active属性是Form的Close事件中的一个参数,不是设计时使用的,而是在这个事件中直接将参数Action:=CaFree就可,他表示在使用Close方法时Free窗体释放资源。如果不设置的话,调用Close仅仅是关闭但没有时放资源,类似于仅仅设置Visible属性为false,窗体资源并没有释放,明白了吗?
      

  11.   

    恩,明白了,早就听说close事件不释放资源了,只是没有什么体会感觉不到而已,呵呵~
    我刚刚试了一下:
    我在窗体的OnClose事件中加上这个Action:=CaFree它可以运行一次,再调用任何一个窗体就出错,说是违反内存地址错误。
    我把它放在我的关闭按钮button_click事件中就会报错:[DCC Error] Unit2.pas(75): E2010 Incompatible types: 'TBasicAction' and 'TCloseAction'
    然后我又把Action改成TCloseAction,结果它又报错:[DCC Error] Unit2.pas(75): E2029 '(' expected but ':=' found我是新手,低层没打好,有些东西不能完全理解。希望大家能耐心的指导一下。谢谢~
      

  12.   

    这个属性当然不能放在关闭按钮的事件中了!按钮事件中只要调用Form.close方法即可。
    这个事件是对应于动态创建窗体的。如果你是自动加载的窗体,在调用Close之后,以后再要显示这个窗体,在Show之前,要重新创建这个窗体,如:
    Form1:=TForm.Create(Application);
    Form1.ShowModal;
      

  13.   

    还是会出错,不知道是不是delphi的问题。
      

  14.   

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
      

  15.   

    我来给你解决,这问题~~~80分到手喽~~~
     
      var
      i,j:integer;
    begin
      i:=screen.Width;  //显示器宽度   如:1024
      j:=screen.Height; //显示器高度。      768
    {-------------------------------------------------------------------------------
    如果一个Button你总是向要他显示在距离屏幕右侧,30的位置:
    -------------------------------------------------------------------------------}
      self.Button1.Left:= i-30;
      Self.Button1.Top: = j-20; OK这一步是得到显示器的宽和高,如果你的界面分辨率发生变化的话,并且组件的Align属性设置为None,位置是肯定会发生变化的,这个时候就需要你根据显示器的长宽,来再确定组件的位置(就是设置Top,Left,Width High等属性)。
      因为有的组件是没有Align属性的,所以分辨率发生变化的时候,他们的位置肯定是会变化的,这个时候就一定要先取得分辨率的高宽(如:1024*768)再根据宽高来确定位置。
      
     推荐使用Align属性,来设置位置,Align的7个值Top:居上显示 Left:居左显示 Right:居右显示 Botton:最下面显示
      

  16.   

    还是不行。我的源码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ADODB, DB, Grids, DBGrids, ExtCtrls, DBCtrls, Buttons,
      ImgList, ComCtrls, ToolWin, XPMan, ActnList, Menus;type
      TForm1 = class(TForm)procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
        { Private declarations }
      public
        { Public declarations }
       procedure Toolbutton_click(Sender: Tobject);
        end;var
      Form1: TForm1;implementationuses 
    {$R *.dfm}procedure TForm1.ToolButton_Click(Sender: TObject);
    begin
    FrmGueIn.close;
    FrmGueRn.close;
    FrmGueBk.close;
    FrmGueEx.close;
    FrmTemIn.close;
    FrmTemBk.close;
    FrmTemEx.close;
    FrmCarTe.close;
    FrmGueMg.close;
    FrmSyslQ.close;
    .
    .
    .end;procedure TForm1.ToolButton4Click(Sender: TObject);
    begin
     Toolbutton_click(sender);
     FrmGueRn.Dock(Form1.scrollbox1,Boundsrect);
     FrmGueRn.Show;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action := caFree;
    end;
    .
    .
    .不知道出了什么问题,总是报出内存溢出或是地址出错的错误。
      

  17.   

    设置控件的Anchors
    设计时用较小分辨率如800*600
      

  18.   

    TO wpf517 :
    谢谢` 但还是解决不了。其实我想要的效果在本页上也有效果图看,把这个网页慢慢缩小,你就发现它的内容也会跟着窗体的缩小而改变,不能完全显示的就换行显示,注意到“举报”和“TOP”这两个按钮也是一样的。我就是想实现这样的效果。今天我才发现在这里有这样的效果。耽误大家解决问题了,不好意思。
      

  19.   

    设Anchor属性可以实现控件跟随窗体的改变而移动,但不知道怎么换行。
      

  20.   

    1 主窗口内的所有控件都设置anchoes属性
    2 读取当前屏幕的尺寸
    3 根据屏幕尺寸设置主窗口尺寸,之后里面的内容自动调整窗口的布局可以参考office2007 outlook
      

  21.   

    看了这么多人说的,呵呵,好像不大懂。
    好像在POWERBUILDER里才需要处理设计时跟客户使用时分辨率不一样的问题。
    DELPHI这么优秀应该不用吧?
      

  22.   

    TO liuyangsl:
    主窗体设置一下倒也没什么,可80多个窗体几百个控件,而且在父窗体显示还可以,但把它调到了主窗体来就不行了。