我在win2000+1024X768模式下编的程序在win98+1024X768 或 win98+800X600模式下运行发生界面变形。本以为拿到win98下编译就可以解决了,但我碰上一个怪问题!我的程序是在win2000+1024X768下新建的工程,拿到win98下用delphi打开就会发生不论是800X600或1024X768下界面都会变形:控件巨大!且随后新加的控件都是巨大的,一些控件的Height值不能变小。奇怪的是我在.dfm文件看见的控件高度明明是22,但一打开就变成28了!
所有的.dfm文件与正常的没什么区别,但不知为何一打开就变样??在win2000下就没问题。更加奇怪的是:
我朋友先是在win98+1024X768模式下新建的工程,其后也拿到winXP+1024X768模式下打开修改过,但再拿到win98+800X600模式,也不会发生变形,只是由于分辩率不同而整体变化一点而已。难道工程一定要先在win98下创建?????有两种可能:
1.工程必须先在win98下创建,否则如在win2000下创建则在win98下不正常。
2.delphi在dfm文件中暗藏记录着一些关于分辨率及操作系统的信息。这点可能性最大,因为我把我的工程文件与其他文件相比,没发现不妥之处。有谁可以帮我解决之问题,否则我只能在win98下重新创建窗体啦!如果在程序中使其自适应则有两种方法,一是改变运行机子的分辨率(这种方法可以否决,我前面已说明清楚了,现在问题已不再是单纯的分辨率问题了),二是写代码在程序运行时根据不同的系统和分辨率来确定窗体和控件的位置、大小,但这样太烦了。第三就是不同系统下重新在制作窗体

解决方案 »

  1.   

    在win2000或xp 下编程时,记住将窗体的Font的字符集设为Chinese_GB2312,或直接将Font.Charset设为GB2312_Charset另外,有时还要将窗体的Scaled属性设为false(绝大多数情况下没有必要),自己试一下就知道了。
      

  2.   

    控件的parentFont如果为true(默认),则窗体的字符集变了,它们的也会跟着变,没有必要逐个设置;除非控件的字体特殊,有别于窗体,则需要单独设置。
      

  3.   

    除了改字体外还有form.scaled:=false;
    还有适应分辨率的问题:
    假设你在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
      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;