Delphi MDI Aansoek en die titelbar van die MDI Kinders
Vra
Ek het 'n MDI toepassing geskryf in Delphi 2006 wat XP loop met die standaard tema het.
Is daar 'n manier om die beheer van die voorkoms van die MDI Kinders aan die groot XP-styl titelbalk op elke venster te vermy?
Ek het probeer om die opstel van die BorderStyle
van die MDIChildren
om bsSizeToolWin
maar hulle is nog steeds gelewer as normale Vorms.
Oplossing
Al jou behoefte - oorlading prosedure CreateWindowHandle, soos volg:
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.
Ander wenke
Die manier MDI werk nie gel met wat jy probeer om te doen.
As jy die "MDI" formaat nodig, moet jy oorweeg om óf die ingeboude of 'n kommersiële docking pakket, en gebruik die docking opstel om die MDI gevoel na te boots.
In my Delphi programme, Ek gebruik dikwels TFrames en ouer hulle na die hoof vorm, en 'n maksimum van hulle, sodat hulle opneem die kliënt gebied. Dit gee jou iets soortgelyk aan hoe Outlook lyk. Dit gaan 'n bietjie iets soos hierdie:
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;
Om dit te gebruik, kan jy eenvoudig dit te doen:
MyForm.CurrentModule := TSomeFrame.Create(nil);
Daar is 'n goeie argument dat jy koppelvlakke (die skep van 'n IModule koppelvlak of iets) wat jy gebruik moet gebruik. Ek doen dikwels dat, maar dit is meer kompleks as wat nodig is om die konsep te verduidelik.
HTH
Ek dink nie daar is; in my ervaring, is MDI in Delphi baie streng beperk en beheer word deur die implementering daarvan in die VCL (en miskien ook deur die Windows API?). Byvoorbeeld, moenie probeer wegkruip 'n MDI kind (jy sal 'n uitsondering te kry as jy probeer, en jy sal hê om te spring deur 'n paar van API hoepels te werk om daardie), of die verandering van die manier waarop die hoof menu 'n MDI kind se is saamgesmelt met die gasheer vorm nie.
Gegewe hierdie beperkinge, miskien jy moet heroorweeg waarom jy wil spesiale titel bars in die eerste plek te hê? Ek dink daar is ook 'n goeie redes waarom hierdie MDI dinge is gestandaardiseer --- jou gebruikers kan dit waardeer:)
(PS: lekker om 'n Delphi vraag sien hier rond)
Dankie onnodb
Ongelukkig is die kliënt dring aan op MDI en die kleiner titelbalk.
Ek het uitgewerk een manier om dit te doen wat by die titel bar te verberg deur oorheersende die vensters CreateParams en dan skep my eie titelbalk (eenvoudige paneel met 'n paar muis hantering vir die verskuiwing). Werk goed genoeg so ek dink ek kan dit uit te voer deur die kliënt en kyk of dit sal doen ...