2009-08-31 9 views
14

でソフトウェアを動作していないアンカーは、私のXPマシンでのDelphi 7デルファイ7は、Vistaの

上に構築され、フォームは、私が期待してサイズを変更します。しかし、2台のVistaマシンでは、[akLeft、akTop、akRight、akBottom]に設定されたアンカー付きのコンポーネントがありますが、フォームのサイズを変更すると、コンポーネントはフォームと共に伸びず、 。 XPマシンでは、コンポーネントがフォームで正しくストレッチされます。

Vistaマシンがアンカープロパティを無視しているようです。どのようなアイデアがこれを引き起こし、どのようにそれを修正するのですか?

重要な更新(フランソワ):
私たちは、D2007アプリケーションとすべてのx64窓上と同じ問題を抱えていました。
Andreasの答えは確かに修正されました。 それはD7でもVista関連でもありません。

+0

プログラムがコンパイルされたWindowsのバージョンは? – Argalatyr

+0

コンパイル済みXP/Delphi 7 – Robo

+1

Argalatyrの答えを参照してください。それは理にかなっていますか? – Hemant

答えて

12

多分あなたのコントロールが多くの親を持っている場合に発生する "Windowsカーネルスタックオーバーフロー"問題に関連しているかもしれません。 64ビットシステムで実行すると、カーネルスタックのオーバーフローがずっと速くなります。 (ここではこれについての詳細:http://news.jrsoftware.org/news/toolbar2000/msg07779.html

エンバカデロのCodeCentralには、(また、ほぼ1コピーされます:Delphi 2009では、VCLに1):このバグの回避策であるに動的なサイズ変更Iの代替としてhttp://cc.embarcadero.com/Item/25646

+0

約20レベルのネストされたコントロールを持っている場合にのみ、これが当てはまるという印象を持っていますか? – Argalatyr

+0

システム全体にインストールされているWH_CALLWNDPROCウィンドウフックの数によって異なります。 (たとえば、LogitechはWH_CALLWNDPROCフックを使用し、TActionManagerも使用します)。 –

+0

私は職場でこれに遭遇し、あなたの投稿のおかげで、この問題を追跡することができました。情報と修正プログラム、Andreasをありがとう。もう一つの羽は、あなたのかなりの帽子です。 –

0

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

+0

クライアントは互換モードではなくネイティブVistaで実行したいと考えています。 – Robo

+0

。申し訳ありませんが、これ以上提供する必要はありません。私はもはやD7を使用しません。私の回答は、状況の理解を要約しています。私はあなたが解決策を見つけることを望む! – Argalatyr

+2

Vistaの完全サポートが必要な場合は、アップグレードする必要があります。 Delphi 2007以降の機能でした。実際には、常に最新の状態にしたい場合は、先週出てきたDelphi 2010を入手する必要があります。 Windows 7とVistaを完全にサポートしています。 –

2

Vistaで表示されている透明なフレームの可能性があります。 (あなたがより理にかなっているすべてのアンカーを使用しているので、別のウィンドウに同じ透明な外観を与えるために。

する。代わりに、アンカーの「合わせ」(alClient)を使用してみてください。

+0

コントロールが画面全体を占有し、他のコントロールをカバーするため、これは機能しません。 – Robo

+1

たとえば、ほとんどの画面をカバーするメモがあり、フォームの下部にいくつかのボタンがあります。あなたはパネルを配置し、そのAlignプロパティをalBottomに設定します。そのパネルにコントロールを配置します。次に、メモコントロールを配置し、そのalignプロパティをalClientに設定します(これはフォームを埋めるが、下のパネルを残します)。 – Hemant

+0

+1これは動作します(Hemantの追加コメント付き)。例として私の答えの作業コードを参照してください(私はヘマントの答えを編集していましたが、それは失礼かもしれないと心配しています)。 – Argalatyr

2

アンカーはデルファイ4で導入された前に、 、我々は同じ効果を達成するためにコンポーネントを動的にリサイズ。あなたは簡単に移動/フォームのonresizeイベント内のコンポーネントを調整することができます。

paint方法をバッファリングすることによって、ちらつきを減らすことができるtrueに、フォームのdoublebufferedプロパティを設定します。私たちは使用リコールそれを自分でも実装する必要があります!

1

提案したように、私はHemantの提案に基づいて、いくつかの作業コード(下記)を打ち明けました。 VCLフォームアプリケーションを作成し、のフォームの端には触れず(デフォルトでは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. 
+1

ニース(徹底的に)スニペット! – Hemant

0

が、これはとにかくここで、かなり古い質問ですが、宇宙でのこの問題の唯一の解決策だなりますWM_SIZEとWM_SIZINGをトラップするAPIを使用して、古いスタイルのWindowsプログラミングのサイジング方法を使用して、それがinfalible一つだと機能しますすべてのWindowsで知っているでしょう。

もちろん、GetClientRect()を使用してwitdhsとheightを決定し、その値に基づいてコントロールのサイズを変更する必要があります。宇宙船を点火しようとするように聞こえるかもしれませんが、最高です。私はすべてのWindowsでのコーディングや機能のようなものを行うどんなにウィッヒバージョン、それはなりを

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

そうしないようなサイズ変更の手順で、より実用的かつ迅速に何かをすることができます。希望は他の誰かを助け

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; 

にのみ、このような何かをやって参照用の画面解像度にいくつかの値を必要とします!

乾杯!

関連する問題