2008-08-12 60 views
3

私はDelphi 2006で書かれたMDIアプリケーションを持っています。このアプリケーションは、デフォルトのテーマでXPを実行します。Delphi MDIアプリケーションとMDI Childrenのタイトルバー

各ウィンドウの大きなXPスタイルのタイトルバーを避けるために、MDI Childrenの外観を制御する方法はありますか?

MDIChildrenBorderStylebsSizeToolWinに設定しようとしましたが、まだ通常のフォームとしてレンダリングされています。

答えて

4

すべてのあなたの必要性 - このような過負荷手順CreateWindowHandle、:

unit CHILDWIN; 
interface 
uses Windows, Classes, Graphics, Forms, Controls, StdCtrls; 

type 
    TMDIChild = class(TForm) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    procedure CreateWindowHandle(const Params: TCreateParams); override; 
    end; 

implementation 

{$R *.dfm} 
procedure TMDIChild.CreateWindowHandle(const Params: TCreateParams); 
begin 
    inherited CreateWindowHandle(Params); 
    SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); 
end; 
end. 
0

私はそこにいるとは思わない。私の経験では、DelphiのMDIは非常に厳密に制限されており、VCL(そしておそらくWindows API)の実装によって制御されています。たとえば、MDIの子を隠さないでください(試してみると例外が発生しますが、回避するにはいくつかのAPIを使う必要があります)、またはMDIの子のメインメニューの方法を変更する必要がありますホストフォームにマージされます。

これらの制限がある場合、最初に特別なタイトルバーを使用する理由を再検討する必要があります。私は、ユーザーがそれを感謝かもしれない---このMDIのものが標準化された理由を正当な理由もあると思います:)

(PS:!素敵なこの辺りDelphiの質問を参照するため)

onnodb

0

感謝残念ながら、クライアントはMDIと小さなタイトルバーを主張します。

WindowsのCreateParamsをオーバーライドしてタイトルバーを非表示にしてから、自分のタイトルバーを作成する方法がありました。うまく働くので、私はクライアントによってそれを実行し、それが実行されるかどうかを確認することができると思います...

1

MDIの動作方法は、

"MDI"形式が必要な場合は、組み込みのパッケージまたはcommercialドッキングパッケージの使用を検討し、ドッキング設定を使用してMDIのフィーリングを模倣する必要があります。

私のDelphiアプリケーションでは、私は頻繁にTFramesを使用し、それらをメインフォームに親し、それらを最大化してクライアント領域を占有します。これは、Outlookの見た目に似た何かを提供します。それは、このような小さな何かを行く:これを使用するには

TMyForm = class(TForm) 
private 
    FCurrentModule : TFrame; 
public 
    property CurrentModule : TFrame read FModule write SetCurrentModule; 
end; 

procedure TMyForm.SetCurrentModule(ACurrentModule : TFrame); 
begin 
    if assigned(FCurrentModule) then 
    FreeAndNil(FCurrentModule); // You could cache this if you wanted 
    FCurrentModule := ACurrentModule; 
    if assigned(FCurrentModule) then 
    begin 
    FCurrentModule.Parent := Self; 
    FCurrentModule.Align := alClient; 
    end; 
end; 

を、あなたは、単にこれを行うことができます。

MyForm.CurrentModule := TSomeFrame.Create(nil); 

を使用すると、インタフェース(はIModuleインタフェースまたは何かを作成する)を使用する必要があります良いの引数がありますあなたが使っている私はしばしばそれをしますが、ここでその概念を説明するのに必要以上に複雑です。

HTH

関連する問題