原来一个程序是在分辨率1024*800下写的,但是后来在一个分辨率是800*600的机器上显示的话,就会出现窗体太大,而在屏幕中无法显示的问题,大家碰到这个问题是怎么解决的?有没有什么好办法?
可以用什么api函数得到分辨率的?用什么方法可以遍历窗口中的所有可见控件,我用form.controls的话,它只能得到它的子控件,而如果再有象panel,notebook这种还有子控件的话,就没法直接得到,而control的属性中只有components,没有controls。
另外,还有一个问题就是字体的问题,怎么得到所有控件中显示的字的字体,因为如果控件缩小的话,字体不变字就会看不到了,而在控件中autosize设成true的话,就会使汉字无法全部看到。
谢谢了,我想这个问题应该不是我一个人碰到过,希望有高人指点。

解决方案 »

  1.   

    要得到显示器的分辨率,由下列程序得到:var
     x:longint;
     a:string;
    begin
     x := GetSystemMetrics(SM_CXSCREEN);
     Str(x,a);
     Label1.Caption := '显示器水平分辨率' + a;
     x := GetSystemMetrics(SM_CYSCREEN);
     Str(x,a);
     Label2.Caption := '显示器垂直分辨率' + a;
    end; Windows提供给我们两个API函数,可以动态调整显示器的分辨率,
    他们是EnumDisplaySettings() 和ChangeDisplaySettings(),
    下面这个例子就是了function DynamicResolution(X, Y: word): BOOL;
    var
     lpDevMode: TDeviceMode;
    begin
     Result := EnumDisplaySettings(nil, 0, lpDevMode);
     if Result then
     begin
     lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;
     lpDevMode.dmPelsWidth := X;
     lpDevMode.dmPelsHeight := Y;
     Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;
     end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
     if DynamicResolution(640, 480) then
     ShowMessage('Now is 640*480');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
     if DynamicResolution(800, 600) then
     ShowMessage('Now is 800*600');
    end;
      

  2.   

    for i:=0 to Form1.ComponentCount-1 do
     Form1.Components[i].......
    可以遍历窗体的所有控件
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Showmessage('Label1的字体大小是:'+IntToStr(Label1.Font.Size));
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
     Label1.Font.Size:=12;
     Showmessage('Label1的字体大小已经改变为12');
    end;
      

  4.   

    调整分辨率不好,有闪烁,而且有些机器根本上不去
    而遍历控件好遍历,但遍历可见控件就不方便,因为不可见控件根本没有height等属性,关于字体也是这个问题,我不可能在每个控件去改它字体,首先是要找到哪些控件有字体的属性。
      

  5.   

    uses typinfo;procedure TForm1.Button2Click(Sender: TObject);
    var
     i:integer;
    begin
     for i:=0 to Form1.ComponentCount-1 do
      if IsPublishedProp(Form1.Components[i], 'Font') then
       Memo1.Lines.Add(Form1.Components[i].Name+'有Font属性');
    end;
      

  6.   

    其实窗体中每个有Font属性的控件的ParentFont属性默认为true,除非你单独设置该控件的字体属性(它的ParentFont会自动变成false);也就是说当你设置Form1.Font.Size:=12; 时,窗体中所有ParentFont为true的控件的字体大小都会变成12;没有必要去遍历控件。另:可以用上面同样的方法去判断控件有没有Height属性等
      

  7.   

    ---- 先 在 表 单 单 元 的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;
      

  8.   

    用ChangeScale-----看帮助,
    响应WM_DISPLAYCHANGE消息。