我想:
    先记录下可见控件的位置,在窗体变化时将这些值一个一个的重新计算后,再刷新。问题是每个窗体的控件个数不一样,名称各异,整个程序下来简单劳动的工作量是否太大。
我又想:
    能不能用一个方法,自动取得打开窗体上的所有可见控件的名称、位置、大小,事先设置几个(如左边距、顶边距的)常量,在窗体大小变化时记录窗体的变化,进行计算。使各控件在窗体变化时显示正常。
    这样我在窗体中加了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)就看着小了。
那位大侠有既方便又好用的方法,请指教。

解决方案 »

  1.   

    进行相应类型对象转换。利用IS、AS操作符
      

  2.   

    这个、、基本上、比较烦。
    你要找那些属性的话,要用到RTTI,用TypInfo单元中的某些方法就行,但是你不想自己实现scaleby相似功能的话很麻烦哦,呵呵!
      

  3.   


    假设你在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;
      

  4.   

    记得JVCL中有个控件(忘了叫啥了)可以完成你相似的功能,你可以参考它的实现!
      

  5.   

    http://community.csdn.net/Expert/topic/3271/3271341.xml?temp=.6676599
      

  6.   

    unit Unit1;interfaceuses
      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.
      

  7.   

    (s as TControl)
    你缺了这部
      

  8.   

    GetPropInfo是那个类的方法?总是说他没有被定义。
      

  9.   

    非常感谢:fsybaby(报峰雪---原来叫宝宝)与comerliang(天地良心) 、luke5678(~类~)
    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是那个类的方法?总是说他没有被定义。十分感谢各位老大!!!
      

  10.   

    其实,这是跟教我电脑那人学的,我也不彻底明白,好像是:
    s:=form1.components[i];
    这时,s为一个TComponents;
    s as TControl 表示把s看成一个TComponent类强行处理,大概是这样
    为什么 是 as TControl,而不是 as T????呢,因为看帮助得知,TControl泛指像Label,TButton这种能调大小的类本人能力有限,只知道这么多