Delphi 7的forms,主持人不在Vista中工作

该软件build立在Delphi 7上。

在我的XP机器上,窗体的大小如我所料。 但是,在两台Vista机器上,我有一些组件,其锚点设置为[akLeft,akTop,akRight,akBottom],但是当调整表单的大小时,组件不会随着表单拉伸,在右侧和底部边缘留下空白。 在XP机器上,组件正确地拉伸forms

所以,Vista机器似乎忽略了锚定属性。 任何想法是什么造成这一点,以及如何解决它?

重要更新(弗朗索瓦):
我们在D2007应用程序和所有x64窗口遇到了同样的问题。
安德烈亚斯的答案确实是解决的办法。 所以这不是D7也不是Vista相关的。

Solutions Collecting From Web of "Delphi 7的forms,主持人不在Vista中工作"

也许这与如果你的控件有许多父母的情况下发生的“Windows内核堆栈溢出”问题有关。 如果你在64位系统上运行它,内核堆栈溢出的发生要快得多。 (更多关于这里: http : //news.jrsoftware.org/news/toolbar2000/msg07779.html )

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

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

尝试使用“对齐”(alClient)而不是锚点。 既然你正在使用所有的锚点,那就更有意义了。

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

将窗体的doublebuffered属性设置为true可以通过缓冲paint方法来减少闪烁。 我记得我们以前也必须自己去实现它!

作为我提出的动态调整大小的替代方法,基于Hemant的建议,我将一些工作代码打包在一起(见下文)。 只需创建一个VCL表单应用程序,放在一个不接触任何窗体边界(默认为Align = alNone )的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. 

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

看起来这是一个相当古老的问题,无论如何,这是宇宙中这个问题的唯一解决方案:使用旧式Windows编程调整大小的方法,使用API​​陷阱WM_SIZE和WM_SIZING,这是一个可靠的,将在每一个你会知道的Windows 。

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

否则,你可以做一些更实际的事情,并迅速在一个调整大小的程序,如:

 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; 

希望可以帮助别人!

干杯!