سؤال

لدي تطبيق MDI مكتوب بلغة Delphi 2006 والذي يعمل بنظام XP مع السمة الافتراضية.

هل هناك طريقة للتحكم في مظهر MDI Children لتجنب شريط العنوان الكبير بنمط XP الموجود في كل نافذة؟

لقد حاولت إعداد BorderStyle التابع MDIChildren ل bsSizeToolWin ولكن لا يزال يتم تقديمها كنماذج عادية.

هل كانت مفيدة؟

المحلول

كل ما تحتاجه - إجراء التحميل الزائد 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.

نصائح أخرى

الطريقة التي يعمل بها MDI لا تتوافق مع ما تحاول القيام به.

إذا كنت بحاجة إلى تنسيق "MDI"، فيجب أن تفكر في استخدام إما التنسيق المدمج أو تجاري حزمة الإرساء، واستخدم إعداد الإرساء لتقليد إحساس MDI.

في تطبيقات دلفي الخاصة بي، كثيرًا ما أستخدم إطارات 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 أو شيء من هذا القبيل) التي تستخدمها.غالبًا ما أفعل ذلك، لكن الأمر أكثر تعقيدًا من اللازم لشرح المفهوم هنا.

هث

لا أعتقد أن هناك؛في تجربتي، MDI في دلفي محدود للغاية ويتم التحكم فيه من خلال تنفيذه في VCL (وربما أيضًا بواسطة Windows API؟).على سبيل المثال، لا تحاول إخفاء أحد عناصر MDI الفرعية (ستحصل على استثناء إذا حاولت، وسيتعين عليك الانتقال عبر بعض حلقات API للتغلب على ذلك)، أو تغيير طريقة القائمة الرئيسية لعناصر MDI الفرعية تم دمجه مع النموذج المضيف.

بالنظر إلى هذه القيود، ربما يتعين عليك إعادة النظر في سبب رغبتك في الحصول على أشرطة عناوين خاصة في المقام الأول؟أعتقد أن هناك أيضًا أسبابًا وجيهة وراء توحيد عناصر MDI هذه --- قد يقدرها المستخدمون لديك :)

(ملاحظة:من الجميل أن أرى سؤال دلفي هنا!)

شكرا أونودب

لسوء الحظ، يصر العميل على MDI وشريط العنوان الأصغر.

لقد توصلت إلى إحدى الطرق للقيام بذلك وهي إخفاء شريط العنوان عن طريق تجاوز Windows CreateParams ثم إنشاء شريط العنوان الخاص بي (لوحة بسيطة مع بعض التحكم بالماوس للتحريك).يعمل بشكل جيد بما فيه الكفاية لذلك أعتقد أنني قد أقوم بتشغيله من قبل العميل ومعرفة ما إذا كان سيفعل ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top