该软件基于Delphi 7构建。
在我的XP机器上,表单按照我的预期调整大小。但是,在两台Vista机器上,我的组件的锚点设置为[akLeft,akTop,akRight,akBottom],但是当我调整表单大小时,组件不会随表单一起拉伸,在右边缘和底边留下空白。在XP机器上,组件正确地伸展形式。
因此,似乎Vista机器忽略了锚属性。是什么导致了这个以及如何解决这个问题?
重要更新(François):
我们的 D2007 应用程序遇到了同样的问题,所有x64窗口上的也出现了问题。
安德烈亚斯的回答确实是解决方案。
所以它不是D7也不是与Vista有关。
答案 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;
希望帮助别人!
干杯!