Delphi 7形式,不在Vista中工作

时间:2009-08-31 00:01:43

标签: windows delphi forms 64-bit anchor

该软件基于Delphi 7构建。

在我的XP机器上,表单按照我的预期调整大小。但是,在两台Vista机器上,我的组件的锚点设置为[akLeft,akTop,akRight,akBottom],但是当我调整表单大小时,组件不会随表单一起拉伸,在右边缘和底边留下空白。在XP机器上,组件正确地伸展形式。

因此,似乎Vista机器忽略了锚属性。是什么导致了这个以及如何解决这个问题?

重要更新(François):
我们的 D2007 应用程序遇到了同样的问题,所有x64窗口上的也出现了问题
安德烈亚斯的回答确实是解决方案。 所以它不是D7也不是与Vista有关。

6 个答案:

答案 0 :(得分:12)

如果您的控件有很多父级,可能与“Windows内核堆栈溢出”问题有关。如果在64位系统上运行它,内核堆栈溢出的速度会快得多。 (关于这一点的更多信息:http://news.jrsoftware.org/news/toolbar2000/msg07779.html

关于Embarcadero的CodeCentral是这个bug的解决方法(也几乎1:1复制到Delphi 2009 VCL中):http://cc.embarcadero.com/Item/25646

答案 1 :(得分:2)

可能是因为Vista显示的透明框架。 (为了给不同的窗户提供相同的透明外观。

尝试使用“Align”(alClient)代替锚点。由于您使用的是所有锚点,因此更有意义。

答案 2 :(得分:2)

在Delphi 4中引入锚之前,我们动态调整组件大小以达到相同的效果。您可以在表单的onresize事件中轻松移动/调整组件。

通过缓冲doublebuffered方法,将表单的true属性设置为paint可以减少闪烁。我记得我们过去也必须自己实施!

答案 3 :(得分:1)

作为我建议的动态调整大小的替代方法,根据Hemant的建议,我将一些工作代码(下面)放在一起。只需创建一个VCL表单应用程序,放在不接触表单任何边缘的tpanel上(默认为Align = alNone),并将Unit1替换为下面的代码。当你运行它时,你会看到最初添加的4个黄色面板,中央面板将调整表格大小(好像所有锚点都是true)。

unit Unit1;

interface

uses
  Windows, Classes, Controls, Forms, ExtCtrls, Graphics;

type
  TPanelPos = (ppLeft, ppRight, ppTop, ppBottom);
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    Panels : array[TPanelPos] of tpanel;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  PanelPos : TPanelPos;
begin
  for PanelPos := ppLeft to ppBottom do
  begin
    Panels[PanelPos] := tpanel.Create(Form1);
    Panels[PanelPos].Parent := Form1;
    Panels[PanelPos].Color := clYellow;
    case PanelPos of
     ppLeft :
       begin
         Panels[PanelPos].Align := alLeft;
         Panels[PanelPos].Width := Panel1.Left - 1;
       end;
     ppRight :
       begin
         Panels[PanelPos].Align := alRight;
         Panels[PanelPos].Width := Form1.Width - Panel1.Left - Panel1.Width;
       end;
     ppTop :
       begin
         Panels[PanelPos].Align := alTop;
         Panels[PanelPos].Height := Panel1.Top - 1;
       end;
     ppBottom :
       begin
         Panels[PanelPos].Align := alBottom;
         Panels[PanelPos].Height := Form1.Height - Panel1.Top - Panel1.Height;
       end;
    end;
    Panel1.Align := alClient;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  PanelPos : TPanelPos;
begin
  for PanelPos := ppLeft to ppBottom do
    Panels[PanelPos].Free;
end;

end.

答案 4 :(得分:0)

尝试在Vista上以XP兼容模式运行程序。由Delphi 7编译的程序可能不完全支持Vista本机模式(真的没有惊喜)。

答案 5 :(得分:0)

看起来这是一个非常古老的问题,无论如何这里是宇宙中唯一一个解决这个问题的方法:使用旧的Windows编程大小调整方法,使用API​​捕获WM_SIZE和WM_SIZING,这是无法使用的,并且将在每个Windows中运行我会知道的。

当然这意味着你必须主要使用GetClientRect()来确定机智和高度,然后根据这些值调整控件的大小,这听起来像是试图点燃太空船,但它是最好的。

否则你可以在调整大小的过程中做一些更实用,更快速的事情,如:

Control1.Left := Control2.Left + (buttonControl.Width div 2) - (buttonControl3.Width div 2);
//for example widths
Control4.Width    := (Control.Width * 4) + (Control.Left * 8) + 54 ;

我会在所有Windows中进行这种编码和功能,无论它是什么版本。

您只需要屏幕分辨率上的某些值,以便参考,例如:

iCXSCREEN := GetSystemMetrics(SM_CXSCREEN);
iCYSCREEN := GetSystemMetrics(SM_CYSCREEN);

    if ((iCXSCREEN = 1280) and (iCYSCREEN = 720)) or  ((iCXSCREEN = 1280) and (iCYSCREEN = 700)) or ((iCXSCREEN = 1280) and (iCYSCREEN = 600)) then begin

// blah blah

end;
希望帮助别人!

干杯!