PDA

View Full Version : مشکل با Minimized



solook
جمعه 18 مرداد 1387, 20:30 عصر
با سلام
من یه مشکلی با Minimized دارم
وقتی کاربر می خواد این کارو بکنه اون صفحه بصورت کامل مخفی نمیشه و نمیره زیر taskbar بلکه یه پنجره کوچکی از فرم در کنار کلید strat حالت نشسته قرار میگیره

چطوری میشه اونو مثل دیگر برنامه های ویندوز در حالت مینیوم مخفی کرد؟

البته اگه main فرم رو خوب مخفی میکنه اما صفحات بعدی رو نه.

Hsimple11
جمعه 18 مرداد 1387, 22:23 عصر
در دلفی با دو نوع برنامه عمومی سر و کار داریم : SDI و MDI.

SDI یا Single Document Interface برنامه هایی است که اغلب اوقات اونا رو ایجاد کردیم. در واقع در این برنامه ها FormStyle تمامی فرمهای برنامه ما خاصیت fsNormal دارند. بنابراین IDE دلفی این برنامه را SDI قلمداد خواهد کرد.

در برنامه های SDI میتونیم چندین فرم داشته باشیم اما تنها یک فرم فرم اصلی برنامه ما خواهد بود.

این فرم اصلی اولین فرمی است که در برنامه ما ساخته (Create) میشود. در یونیت Project خود بعد از Initialize برنامتان اگر نگاه کنید متوجه خواهید شد که فرم اصلی برنامه شما کدام فرم است؛ مثلا :


program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.

فرم1 در این مثال Main Form ما خواهد بود.

بنابراین رفتار ما با این فرم اصلی سرنوشت کل برنامه را تعیین خواهد کرد. با بستن آن کل برنامه بسته شده و با Minimize کردن آن، تمامی فرمهای دیگر نیز مخفی می شوند.
و تنها فرم اصلی دکمه اش در TaskBar میماند و سایر فرمها را نخواهیم دید. در صورتی که یک فرم فرزند از فرم اصلی Minimize شود بر روی دسکتاپ Minimize خواهد شد.

بر خلاف SDI در مقابل در برنامه های MDI میتوان بیش از یک فرم Child را در یک والد ایجاد کرد. که با آنها هم کار کرده ایم. FormStyle فرم اصلی ما در این برنامه ها fsMDIForm و در مورد فرمهای فرزند، fsMDIChind خواهد بود.

اما در مورد سوال شما :

اگر بخواهیم فرمهای فرزند ما در زمان Minimize شدن فرم اصلی مخفی نشوند یا بتوانیم آن ها را بر روی Taskbar کمینه کنیم بایستی از طریق متد CreateParams، ExStyle خاصیت Params مربوط به فرم فرزند خود را Override کنیم. بعلاوه بایستی والد فرم فرزند را به دسکتاپ ویندوز تغییر دهیم. برای این منظور در یونیت فرم فرزند خود می نویسیم :



interface

type
TForm2 = class(TForm)
...
protected
procedure CreateParams(var Params: TCreateParams) ; override;
...

implementation

procedure TForm2.CreateParams(var Params: TCreateParams) ;
begin
inherited;

Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;

Params.WndParent := GetDesktopWindow;
end;

میتونید یک کلاس پایه برای فرمهای فرزند خود تعریف کنید و این پروسیجر را در آن تعریف کنید و تمام فرمهای فرزند خود را از آن کلاس پایه مشتق کنید.

موفق باشید...

solook
جمعه 18 مرداد 1387, 22:38 عصر
تشکر..

بسیار عالی بود
ببنید برنامه من جوری هست که اول یک صفحه میاد(همون صفحه اصلی)بعد توی اون صفحه صفحاتی دیگه که حقیقتا هدف برنامه اون صفحات هست انتخاب می شوند
حال وقتی اون صفحات انتخاب شد دیگه کاری به صفحه اولی نداریم
با متدی که شما گفتید وقتی صفحه فرزند بالا اومد دوتا دکمه در taskbar نمایش داده میشه
حالا چیطوری میشه کاری کرد فقط دکمه صفحه ای انتخاب شده در taskbar بمونه..

Hsimple11
شنبه 19 مرداد 1387, 11:23 صبح
اگر فرمی را نیاز ندارید آن را Free کنید.

اما در مورد اینکه میخواهید دکمه اصلی پروژه شما در Taskbar مخفی شود میتوانید دکمه های نوار وظیفه را مدیریت کنید. این کد از جناب احدی است :

یک پروسیجر تعریف کنید :


procedure TForm1.InTaskbar(_AppHandle:THandle;_Be:Boolean);
begin
ShowWindow(_AppHandle, SW_HIDE);
if _Be then
SetWindowLong(_AppHandle, GWL_EXSTYLE,WS_EX_WINDOWEDGE)
else
SetWindowLong(_AppHandle, GWL_EXSTYLE,WS_EX_APPWINDOW-WS_EX_TOOLWINDOW);
ShowWindow(_AppHandle, SW_SHOW);
end;

و بعد آن را در بخش Public یونیت خود تعریف کنید تا بتوانید از آن در همه جا استفاده کنید :



public
{ Public declarations }
procedure InTaskbar(_AppHandle:THandle;_Be:Boolean);


حالا هر زمانی که خواستید میتوانید دکمه هر فرمی را با دادن Handle آن مخفی کنید یا نشان دهید مثلا :


procedure TForm1.FormCreate(Sender: TObject);
begin
InTaskbar(Application.Handle, False);
end;


موفق باشید...