我想:
先记录下可见控件的位置,在窗体变化时将这些值一个一个的重新计算后,再刷新。问题是每个窗体的控件个数不一样,名称各异,整个程序下来简单劳动的工作量是否太大。
我又想:
能不能用一个方法,自动取得打开窗体上的所有可见控件的名称、位置、大小,事先设置几个(如左边距、顶边距的)常量,在窗体大小变化时记录窗体的变化,进行计算。使各控件在窗体变化时显示正常。
这样我在窗体中加了3个控件button1,button2,memo1。
用Application.mainform.componentcount;取到有3个控件。
想作一个循环用Application.mainform.components[i]逐个取这三个控件,并对他们的位置及大小进行调整,但当我用Application.mainform.components[1],想得到他的top,left,width,height等值时,却没有这些属性。请问高手我错在哪了?是不是有方法可以得到可见控件这样才有这些属性? 原先有个帖子是用"form.scaleby"很方便,但它是直接地放大或缩小,如果(800,600)看着大小合适,(1024,768)就看着小了。
那位大侠有既方便又好用的方法,请指教。
先记录下可见控件的位置,在窗体变化时将这些值一个一个的重新计算后,再刷新。问题是每个窗体的控件个数不一样,名称各异,整个程序下来简单劳动的工作量是否太大。
我又想:
能不能用一个方法,自动取得打开窗体上的所有可见控件的名称、位置、大小,事先设置几个(如左边距、顶边距的)常量,在窗体大小变化时记录窗体的变化,进行计算。使各控件在窗体变化时显示正常。
这样我在窗体中加了3个控件button1,button2,memo1。
用Application.mainform.componentcount;取到有3个控件。
想作一个循环用Application.mainform.components[i]逐个取这三个控件,并对他们的位置及大小进行调整,但当我用Application.mainform.components[1],想得到他的top,left,width,height等值时,却没有这些属性。请问高手我错在哪了?是不是有方法可以得到可见控件这样才有这些属性? 原先有个帖子是用"form.scaleby"很方便,但它是直接地放大或缩小,如果(800,600)看着大小合适,(1024,768)就看着小了。
那位大侠有既方便又好用的方法,请指教。
你要找那些属性的话,要用到RTTI,用TypInfo单元中的某些方法就行,但是你不想自己实现scaleby相似功能的话很麻烦哦,呵呵!
假设你在800*600的分辨率下设计的form,第一步:
inplementation
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;下一步,要让每个子控制的字体改变到合适的大小:
type
TFooClass = class(TControl); { needed to get at protected }
{ font property }var
i: integer;
begin
for i := ControlCount - 1 downto 0 do
TFooClass(Controls[i]).Font.Size :=
(NewFormWidth div OldFormWidth) *
TFooClass(Controls[i]).Font.Size;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
lastsizex,lastsizey:integer; ---------------此处是关键,你必须加implementation{$R *.dfm}procedure TForm1.FormResize(Sender: TObject); -------下面这些是关键
var i:integer;
s:TComponent;
begin
for i:=0 to form1.ComponentCount-1 do
begin
if form1.Components[i] is TControl then
begin
s:=form1.Components[i];
(s as TControl).Height:=round((s as TControl).Height*form1.Height/lastsizey);
(s as TControl).Width :=round((s as TControl).Height*form1.Width /lastsizex);
end;
end;
lastsizex:=form1.width;
lastsizey:=form1.height;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
lastsizex:=form1.width;
lastsizey:=form1.Height;
end;end.
你缺了这部
fsybaby(报峰雪---原来叫宝宝):
你能再解释一下
if form1.Components[i] is TControl then
begin
s:=form1.Components[i];
(s as TControl).
中的TControl和s as TControl的含义吗?
comerliang(天地良心)也定义了一个TFooClass = class(TControl)类; 应该意思是差不多的?luke5678(~类~):GetPropInfo是那个类的方法?总是说他没有被定义。十分感谢各位老大!!!
s:=form1.components[i];
这时,s为一个TComponents;
s as TControl 表示把s看成一个TComponent类强行处理,大概是这样
为什么 是 as TControl,而不是 as T????呢,因为看帮助得知,TControl泛指像Label,TButton这种能调大小的类本人能力有限,只知道这么多