2008-08-12 30 views
3

Delphi 2006'da yazılmış bir MDI uygulaması var.Delphi MDI Uygulaması ve MDI Çocuklarının başlık çubuğu

Her pencerede büyük XP stili başlık çubuğundan kaçınmak için MDI Çocuklarının görünümünü denetlemenin bir yolu var mı?

MDIChildren'un BorderStyle ayarını bsSizeToolWin olarak ayarlamayı denedim, ancak yine de normal Formlar olarak işleniyorlar.

cevap

4

Tüm ihtiyaç - Böyle aşırı yük prosedürü 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

Orada olduğunu sanmıyorum; Benim deneyimime göre, Delphi MDI çok sınırlı bir şekilde sınırlandırılmakta ve VCL'de (ve belki de Windows API'sı tarafından) uygulanmasıyla kontrol edilmektedir. Örneğin, bir MDI çocuğunu saklamayı denemeyin (denerseniz bir istisna elde edersiniz ve bu konuda çalışmak için birkaç API çemberinden atlamanız gerekir) veya bir MDI çocuğun ana menüsünü değiştirme ev sahibi formun ile birleştirilir.

Bu sınırlamalar göz önüne alındığında, belki de neden ilk başta özel başlık çubuklarına sahip olmak istediğinizi yeniden düşünmelisiniz? Bu MDI şeyler standardize neden iyi nedenleri de vardır sanırım --- senin kullanıcılarının çok işine olabilir :)

(PS: güzel buralarda Delphi soru görmek için)

0

Teşekkür

onnodb Ne yazık ki müşteri, MDI ve daha küçük başlık çubuğunda ısrar ediyor.

Windows CreateParams pencerelerini geçersiz kılarak başlık çubuğunu gizlemek ve daha sonra kendi başlık çubuğumu (bazı Fare işlemek için basit bir işlemle) oluşturmak için bunu yapmanın bir yolunu çalıştım. Yeterince iyi çalışır, bu yüzden istemci tarafından çalıştırabilirim ve yapıp yapamayacağımı görürsünüz ...

1

MDI'nın çalışma şekli, yapmaya çalıştığınız şeyle jelleşmiyor.

"MDI" biçimine ihtiyacınız varsa, yerleşik veya bir commercial yerleştirme paketini kullanmayı düşünün ve MDI hissini taklit etmek için yerleştirme kurulumunu kullanın.

Delphi uygulamalarında, sıklıkla TFrames'i kullanır ve bunları ana forma üst üste koyar ve bunları en üst düzeye çıkarır, böylece istemci alanını alırlar. Bu, Outlook'un nasıl göründüğüne benzer bir şey verir. Böyle küçük bir şey gider:

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; 

kullanmak için tek yapmanız gereken bunu yapabilirsiniz:

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

Eğer arabirimleri (bir IModule arayüzü veya bir şey yaratmak) kullanmalıdır iyi bir argüman yoktur kullandığın Bunu sık sık yapıyorum ama buradaki konsepti açıklamak için gerekenden daha karmaşık.

HTH