14

ソフトウェアは Delphi 7 で構築されています。

私の XP マシンでは、期待どおりにフォームのサイズが変更されます。ただし、2 台の Vista マシンでは、アンカーが [akLeft、akTop、akRight、akBottom] に設定されたコンポーネントがありますが、フォームのサイズを変更すると、コンポーネントがフォームに合わせて伸びず、右端と下端に空白が残ります。 . XP マシンでは、コンポーネントはフォームに合わせて正しく伸縮します。

そのため、Vista マシンはアンカー プロパティを無視しているようです。これを引き起こしている原因とそれを修正する方法はありますか?

重要な更新 (François): D2007アプリケーションとすべての x64 ウィンドウで
同じ問題が発生しました。 アンドレアスの答えは確かに修正でした。したがって、D7 や Vista 関連ではありません。

4

6 に答える 6

12

コントロールに多くの親がある場合に発生する「Windows カーネル スタック オーバーフロー」の問題に関連している可能性があります。また、64 ビット システムで実行すると、カーネル スタック オーバーフローがはるかに速く発生します。(詳細はこちら: http://news.jrsoftware.org/news/toolbar2000/msg07779.html )

Embarcadero の CodeCentral には、このバグの回避策があります (Delphi 2009 VCL にもほぼ 1 対 1 でコピーされています): http://cc.embarcadero.com/Item/25646

于 2009-08-31T10:41:32.290 に答える
2

Vistaで表示される透明なフレームのせいかもしれません。(異なるウィンドウに同じ透明な外観を与えるため。

アンカーの代わりに "Align" (alClient) を使用してみてください。すべてのアンカーを使用しているため、より理にかなっています。

于 2009-08-31T03:14:01.227 に答える
2

Delphi 4 でアンカーが導入される前は、コンポーネントのサイズを動的に変更して同じ効果を実現していました。フォームのonresizeイベントでコンポーネントを簡単に移動/調整できます。

フォームのdoublebufferedプロパティを に設定すると、メソッドtrueをバッファリングしてちらつきを減らすことができます。paint私たち自身もそれを実装しなければならなかったことを思い出します!

于 2009-08-31T09:49:09.870 に答える
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.
于 2009-08-31T22:14:28.333 に答える
0

VistaでXP互換モードでプログラムを実行してみてください。Delphi 7によってコンパイルされたプログラムは、Vistaネイティブモードを完全にはサポートしていない可能性があります(実際、驚くことではありません)。

于 2009-08-31T02:55:51.490 に答える
0

これはかなり古い質問のようですが、宇宙でこの問題を解決する唯一の方法は次のとおりです。WM_SIZEとWM_SIZINGをトラップするAPIを使用して、古いスタイルのWindowsプログラミングのサイジング方法を使用してください。これは絶対確実なものであり、あなたが知っているすべての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;

他の誰かを助けることを願っています!

乾杯!

于 2010-05-21T20:09:55.467 に答える