现在在做一个工程,里面有80多个窗体,每个窗体上的控件也很多,现在老板要求这些窗体都不许使用弹出式的,所以我在主界面放了个panel组件,把所有调用的窗体显示在panel里。本人菜鸟一个,不知道有没有更好的方法实现这种功能?而且这种方法有个问题一直没办法解决,我现在的用的屏幕分辨率是1440*900的,当我调整屏幕为1024*768时窗体上的控件就显示不完全了,更别说是800*600的分辨率了。有什么办法可以解决这么多窗体的分辨率问题?
调试欢乐多
PS:通常我们所做的开发应该是在一个普遍的环境中进行的,如现在大部分用户的显示器分辨率设定为1024*768,你却要在更大的分辨率上进行UI的设计。你不能强迫用户使用和你相同的分辨率,但是你可以把你的分辨率设定成和客户一样的呀!
分辨率的问题你说得很对,我不能强迫用户使用和我一样的分辨率,所以我想找一个什么方法让我的系统适应用户的分辨率。如果我设成1024*768的,那还有其他用户可能是800*600的,又或者是1440*900的,现在显示器很便宜的,随时换都可以。总不能把显示器一换就跟着把系统给换了吧。
继续顶~~~现在还发现个问题,当我在设计界面时,会出现内存溢出报错,不知道是不是panel装太多窗体了,但每次调用窗体我都会用close关闭所有的窗体再将调用的显示出来。谁能顺便把这个问题给解决了再加30分。
我现在还没开始编写程序,应该不存在死循环吧?我启动程序只创建主窗体,那些都是手工调用的,不用的时候我是以close的方式关闭的,不知道这样能不能释放内存空间?
你给我的说的TScrollBox是可以用滚动方式来显示,但还是解决不了分辨率的问题。
Anchor属性我有设过了,不行。窗体的Align属性全部都设成alClient,是匹配Panel组件尺寸的。
一英寸=2.54厘米
宽:
一英寸里面有
GetDeviceCaps(GetDC(Form1.Handle),LOGPIXELSX)个像素
高:
一英寸里面有
GetDeviceCaps(GetDC(Form1.Handle),LOGPIXELSY)个像素
那么
一厘米内的像素数为
一英寸内的像素数除以2.54
那我们的窗口宽5厘米,高4厘米
那实际像素数即可求出
还有窗体太多,一定要手动创建,用完就close。但是每个窗体的Close事件,要把Action设置成Cafree,他才真正释放的。
谢谢~~ Action怎么设置成Cafree啊?设计时窗体的这个属性值是空的。运行时怎么赋给它啊?
难道分辨率的问题真的要一个个设置这些属性?而且这些属性都未必能解决啊,我设过groupbox和装在它里面的组件,但一调窗体大小的时候就变样了,没有达到我想要的结果。这个问题可能刻薄了点,但不是没有根据的,因为我们这边有一套系统做的就是这样,可惜没有源码,不知道怎么做的。当窗体小到没办法显示完控件时它还可以换行显示,To 猴子007、chris_mao :
你们俩的锚点设置也可以有些作用,谢谢你们!结帖时给分。To All:大家帮帮忙继续讨论一下有没有更好的方法实现.......
这个方法就要在程序中手动调整了,比如在Resize事件中判断如果不够显示,则将控件依次向下瞬移等,这个不能靠属性自动完成,只能自己编写控制代码了
我刚刚试了一下:
我在窗体的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我是新手,低层没打好,有些东西不能完全理解。希望大家能耐心的指导一下。谢谢~
这个事件是对应于动态创建窗体的。如果你是自动加载的窗体,在调用Close之后,以后再要显示这个窗体,在Show之前,要重新创建这个窗体,如:
Form1:=TForm.Create(Application);
Form1.ShowModal;
begin
Action := caFree;
end;
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:最下面显示
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;
.
.
.不知道出了什么问题,总是报出内存溢出或是地址出错的错误。
设计时用较小分辨率如800*600
谢谢` 但还是解决不了。其实我想要的效果在本页上也有效果图看,把这个网页慢慢缩小,你就发现它的内容也会跟着窗体的缩小而改变,不能完全显示的就换行显示,注意到“举报”和“TOP”这两个按钮也是一样的。我就是想实现这样的效果。今天我才发现在这里有这样的效果。耽误大家解决问题了,不好意思。
2 读取当前屏幕的尺寸
3 根据屏幕尺寸设置主窗口尺寸,之后里面的内容自动调整窗口的布局可以参考office2007 outlook
好像在POWERBUILDER里才需要处理设计时跟客户使用时分辨率不一样的问题。
DELPHI这么优秀应该不用吧?
主窗体设置一下倒也没什么,可80多个窗体几百个控件,而且在父窗体显示还可以,但把它调到了主窗体来就不行了。