如何让窗体上的控件自动适应窗体的大小变化?(非高手莫入)100(200分)

  • 主题发起人 主题发起人 cxl-18888
  • 开始时间 开始时间
C

cxl-18888

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi在开发程序时很快能建立程序的模型,但是界面似乎不太美观,控件随窗体的大小变化变得面目全飞,向高手请教,多谢指点。
 
我也想知道这个答案!特别关注!希望知道后也告诉我
 
呵呵,你这个只是一种幻想,商业化的东西你去认真看看。就是联众什么的也是会乱。
下面是我解决问题的2种办法:
方法1:固定屏幕分辨率。如果程序运行,不是我们需要的分辨率的话,自动转分辨率,
程序退出(或者被ATL+TAB转移到别的程序时)时返回原来的分辨率。
方法2:固定2种屏幕分辨率。这是我现在最常用的,就只用800*600和1024*768。只根据
这2种进行界面维护。
 
那只好在Form的OnResize里进行计算来改变各控件的大小与位置啦。如果是为了适应屏幕
的分辨率,下面转抄的帖子可以参考一下:

DELPHI中自适应表单的实现
石家庄军械工程学院五系王俊
---- 我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而最终要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势必会走样。这时你一定希望表单能自己适应不同的分辨率,下面就有两种方法可供你参考。
---- 一、根据新的分辨率自动重画表单及控件
---- 先在表单单元的Interface部分定义两个常量,表示设计时的屏幕的宽度和高度(以像素为单位)。在表单的Create 事件中先判断当前分辨率是否与设计分辨率相同,如果不同,调用表单的SCALE过程重新能调整表单中控件的宽度和高度。
Const
Orignwidth=800;
Orignheight=600;

procedure TForm1.FormCreate(Sender: TObject);
begin
scaled:=true;
if (screen.width<>orignwidth) then
begin
height:=longint(height)*longint
(screen.height) div orignheight;
width:=longint(width)*longint
(screen.width) div orignwidth;
scaleby(screen.width , orignwidth);
end;
end;
---- SCALE过程在调整控件宽度和高度的同时,也自动调整控件字体的大小,以适应新的分辨率,但美中不足的是它并不改变控件的顶点坐标位置,也就是说,该过程不改变控件之间的相对位置关系。要想调整控件之间的相对位置,还需要自己编程实现,有兴趣的读者可试一试。
---- 二、将机器分辨率更改为设计时的分辨率
---- 这种方法不改变表单本身,而是将屏幕分辨率更改为与表单设计时用到的分辨率相同。它需要用到WINDOWS API函数EnumDisplaySettings 和ChangeDisplaySettings, 前者取当前显示模式信息,后者则更改显示设置,具体参数的含义请参见DELPHI帮助。设计时宽度常量和高度常量的定义如方法一。
procedure TForm1.FormCreate(Sender: TObject);
var
devmode:tDevicemode;
begin
if screen.width<>orignwidth then
begin
if EnumDisplaySettings(nil,0,devmode) then
begin
devmode.dmfields:=dm_pelswidth OR dm_pelsheight ;
devmode.dmpelswidth:=orignwidth; {宽度}
devmode.dmpelsheight:=orignheight;{高度}
ChangeDisplaySettings(devmode,0); {更改设置}
end;
end;
end;
---- 以上两种方法在WINDOWS 95+DELPHI 3.0环境下均已通过,二者相比,前者是主动适应,后者则是被动适应。

 
合理调整界面上控件的Align,Anchors等属性,能够使控件自适应界面尺寸调整.
 
抄别人的,可能对你有点用特别是在二.3中提到的方法不错我试过!

>全文如下

Delphi程序设计界面的动态调整

施江杰

--------------------------------------------------------------------------------


如何设计美观的程序一直是程序员的一大难题,很多程序员可以写出很好的程序,但往往困于拙劣的外观。其中如何使美观的程序能在不同的环境下一样美观也同样困扰着我们,我在一些程序的制作中掌握了一些使程序在不同环境同样美观的方法,希望给大家一点启示。
不同环境一般有不同的色彩数和不同的分辨率等等,我只对这两种环境进行说明。
一. 不同的色彩数
对于不同的色彩数我们可以用启动时加以判断并选择相应的配色/图片方案。可在窗口建立时加入程序如下:
procedure TForm1.FormCreate(Sender: TObject);
var
colorbits:Integer;
begin
colorbits :=GetDeviceCaps( h, BITSPIXEL );
case colorbits of
1: //黑白配色方案;
....
4: //16色配色方案;
....
8: //256色配色方案;
....
16: //16位色配色方案;
....
24: //24位色配色方案;
....
32: //32位色配色方案;
....
end;
end;
这样就可以在不同的颜色环境下使用不同的配色方案,不同的图标/图片/色彩均在设计者的控制下,可制作出比较好的图片/彩色环境,而不至于在真彩时很不错,而在16色时一塌糊涂。
二. 不同的分辨率
不同的分辨率下原来的窗口界面可能变得面目全非,对于这种问题,我一般采取以下方式:
先取得分辨率方法有如下:
procedure TForm1.FormCreate(Sender: TObject);
var
sx,sy:Integer;
begin
sx := GetSystemMetrics(SM_CXSCREEN); //分辨率宽
sy := GetSystemMetrics(SM_CYSCREEN); //分辨率高
end;
也可以用Screen.width/Screen.Height来取得
也可以用Var DevMode:TDeviceMode;
Begin
EnumDisplaySettings(nil,0,DevMode)
sx := DevMode.dmPelsWidth
sy := DevMode.dmPelsHeight 来取得
end
也可以用sx := GetDeviceCaps(GetDC(Form1.Handle), HORZRES)
sx :=GetDeviceCaps(GetDC(Form1.Handle), VERTRES) 来取得而后有以下几种方法:
1. 判断分辨率并选择相应的分辨率方案;
(对每种分辨率设计一套控件/字体的大小方案用于在不同分辨率下选择)
2. 固定窗口大小;
procedure TForm1.FormResize(Sender: TObject);
begin
width:=640; height:=480;
left:=0; top:=0;
end;
3. 使用procedure ScaleBy(M, D: Integer)这个过程来对可视控件进行大小调节(此过程不调节窗口大小,也不变动控件的left和top,对控件的大小按M/D比例来调节),具体如下:
procedure TForm1.FormCreate(Sender: TObject);
//假设原来的设计环境为800x600
var
FWidth:integer;
begin
if(Screen.width<> 800)then
begin
FWidth:=Width;
Scaled:=TRUE;
Font.Size:=(Width DIV FWidth)*Font.Size;//字体大小调整
ScaleBy(Screen.Width,800); //控件大小调整
Height:=longint(Height)*longint(Screen.Height)DIV 600;
Width:=longint(Width)*longint(Screen.Width)DIV 800;//窗口大小调整
end;
end;
用此种方法比较实用,而且使用比较简单,基本能适应大多数环境。
4. 调节分辨率到所需的分辨率(即设计时的分辨率,此法对要求封闭的系统比较有用,如工控、触摸屏等等)
procedure TForm1.FormCreate(Sender: TObject);
var
FWidth:integer;
DevMode:TDeviceMode;
begin
if(Screen.width<> 800)then
begin
  Result:=EnumDisplaySettings(nil,0,DevMode); //取得旧的显示参数
  if Result then
  begin
  DevMode.dmFields:=DM_PELSWIDTH Or DM_PELSHEIGHT;
 DevMode.dmPelsWidth:=800;
  DevMode.dmPelsHeight:=600;
ChangeDisplaySettings(DevMode,0); //设置新的显示参数
end;
end;
当然,我们还可以使用Delphi的法宝第三方控件,我找的有ResScale 控件,此控件能够适应多种不同屏幕分辨率,自动改变TForm上控件位置及尺寸的控件,控件位置会储存于.INI文件或注册表中。你还可以找到更好的控件或者方法,找到的话告诉我一下mail me: sjj@netease.com
 
用第三方控件吧,fromresizer
 
试试这个控件:resscale
下载地址:
http://www.delphibox.com/article.asp?articleid=332
 
我认为合理的运用anchors属性和Align属性就可以达到很好的效果了。
 
呵呵,我自己也做过程序拉伸,不过效果都不好。例如有图片,很多一拉就变形的。而且还有很多是根本不能拉的。感觉这么做花拳秀腿的成分居多。
 
设置窗口上控件的Anchors属性可以实现组件适应窗口大小变化。
如放个按钮
Anchors.left:= true;
Anchors.right:=true;
Anchors.top:= false;
Anchors.bottom:= false;
这样这个按钮可以和窗口横向拉大时候跟着自动变大,如果希望
纵向拉时也变化那么四个都设置为 true就可以了。
简单场合可以这样做。
其实这个问题并没这么简单楼上说的一样,还涉及到OnResize、屏幕分辨率等问题。以前也做过自动适应分辨率的程序,不过我觉得这些都次要,关键在软件的功能如何,功能好了啥都好说啊。
 
anchors属性呀。
还有就是根据分辨率来设定一个比例。也就是所有可视化组件的大小,
程序建立时候初始化。
 
我一般運行時強行設定分辨率,form.boroderstyle 設為bsdialog ,就是不給用戶改...
 
FORM内的控件不受屏幕分辨率的影响

窗体在不同分辨率下的大小和控件位置、变形问题:在800*600下做了一个FORM,但到640*480下一看却变了形,控件的相对位置都变了,不知道如何解决,请教诸位高手。

Another_eYes (1998-11-22 22:39:29)

implementation

const

ScreenWidth: LongInt = 800; {I designed my form in 800x600 mode.}

ScreenHeight: LongInt = 600;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

scaled := true;

if (screen.width <> ScreenWidth) then

begin

height := longint(height) * longint(screen.height) DIV ScreenHeight;

width := longint(width) * longint(screen.width) DIV ScreenWidth;

scaleBy(screen.width, ScreenWidth);

end;

end;

下面是解决字体大小的代码:

USES typinfo; {Add this to your USES statement.}

var

i: integer;

begin

for i := componentCount - 1 downto 0 do

with components do

begin

if GetPropInfo(ClassInfo, 'font') <> nil then

font.size := (NewFormWidth DIV OldFormWidth) * font.size;

end;

end;

下面的函数可以解决问题:

Form:需要调整的Form,OrgWidth:开发时屏幕的宽度,OrgHeight:开发时屏幕的高度。

注意:需要把Form的Scaled设置为True。

procedure AdjustForm(Form: TForm; const OrgWidth, OrgHeight: integer);

begin

with Form do

begin

Width := Width * Screen.Width div OrgWidth;

Height := Height * Screen.Height div OrgHeight;

ScaleBy(Screen.Width, OrgWidth);

end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

AdjustForm(Self,1280,1024);

end;


 
合理的运用好align属性和下面的属性就可很好的达到目的了
Anchors.left:= true;
Anchors.right:=true;
Anchors.top:= false;
Anchors.bottom:= false
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部