PDA

View Full Version : سوال: دستوری غیر از بستن برنامه برای دکمه close



farzadkamali
چهارشنبه 15 آذر 1391, 12:08 عصر
با سلام خدمت دوستان

آیا میشه به دکمه close برنامه(همون دکمه X فرم) ، دستوری غیر از بستن داد. مثلا به جای اینکه با کلیک روی دکمه x برنامه بسته بشه،برنامه minimize بشه.

در رویداد on close فرم هر دستوری که بنویسیم اونارو اجرا میکنه و نهایتاً برنامه رو میببنده در حالی که من نمی خوام برنامه بسته بشه. میخوام برنامه minimize بشه. که با minimize کردن ، برنامه در کنار ساعت سیستم قرار میگیره.

در کل نرم افزار من ، با کلیک روی دکمه - (minimize ) ، نرم افزار در کنار ساعت سیستم قرار می گیره. ولی اگه کاربر روی دکمه x یا همون close کلیک کنه برنامه کلاً بسته میشه. درحالی که من می خوام دکمه x هم همانند minimize عمل کنه.

و عمل close با کلیک راست روی آیکن برنامه که کنار ساعت قرار داره و کلیک روی exit انجام بشه.

با تشکر
من با دلفی xe2 کارمیکنم که کامپوننت tray icon رو داره.

یه سوال دیگه :
نمیشه آیکن نرم افزار کنار ساعت سیستم بمونه. مثل آنتی ویروس نود که وقتی هم نرم افزار رو باز کنی،هنوز هم آیکن آنتی ویروس کنار ساعت سیستم قرارداره. ولی نرم افزار من این جوری نیست. با باز کردن نرم افزار آیکن اون هم از کنار ساعت میره. تا اینکه دوباره minimize رو بزنی.

دستورات شی tray icon:

{ Hide the tray icon and show the window,
setting its state property to wsNormal. }
TrayIcon1.Visible := False;
Show();
WindowState := wsNormal;
Application.BringToFront();

دستورات شی ApplicationEvents:

{ Hide the window and set its state variable to wsMinimized. }
Hide();
WindowState := wsMinimized;

{ Show the animated tray icon and also a hint balloon. }
TrayIcon1.Visible := True;
TrayIcon1.Animate := True;
TrayIcon1.ShowBalloonHint;

بهروز عباسی
چهارشنبه 15 آذر 1391, 12:15 عصر
درود
ساده ترین راه از نظر من اینه که اون دکمه ها رو خودت طراحی کنی و کدهای مورد نظرت رو در اونها قرار بدی.(خودم معمولاً این کارو می کنم)

راه دوم که تا حالا امتحان نکردم اینه که اگه بشه روی پیام های که پنجره برنامه ات ارسال بشه هوک کنی و اونارو تغییر بدی ( مطمئن نیستم بشه)

موفق باشید.

بهروز عباسی
چهارشنبه 15 آذر 1391, 12:39 عصر
با کد زیر میتونی پیغام WM_Close رو که پنجره ارسال میشه حس کنی ، فکر کنم بشه با ShowMessage یک پیغام دیگه به پنجره ارسال کنی و WM_Close رو خنثی کنه و یک پیام رو جایگزین کنی.
الان وقت ندارم بیشتر کمک کنم شرمنده.

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages,
System.SysUtils, System.Variants,System.Classes,
Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
Procedure WndProc(var Message: TMessage); Override;
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_CLOSE then
begin
ShowMessage('WM_CLOSE');
end;
inherited;
end;

end.

موفق باشید.

بهروز عباسی
چهارشنبه 15 آذر 1391, 12:46 عصر
اب در کوزه و ما رفتیم کره ماه

در رویداد OnCloseQuery فرم کد زیر رو وارد کن
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=false;
Form1.WindowState:=wsMinimized;
end;


موفق باشید.

farzadkamali
چهارشنبه 15 آذر 1391, 17:35 عصر
با تشکر.

حالا چه جوری نرم افزارو ببندم. البته با کلیک روی یه دکمه دیگه.

Mask
چهارشنبه 15 آذر 1391, 17:59 عصر
با تشکر.

حالا چه جوری نرم افزارو ببندم. البته با کلیک روی یه دکمه دیگه.

جواب اصلی همون پست 4 هست.
معمولا چنین برنامه هایی رو که برنامه نویس تغییر در حالت بسته شدن به صورت عادی میدند رو اینطوری میکنند:
برنامتون باید دارای یهآیکن توی system try باشه.
به وسیله یه popup و ایجاد منویی به نام خروج ، میتونید برنامتون رو ببندید.

farzadkamali
چهارشنبه 15 آذر 1391, 18:08 عصر
جواب اصلی همون پست 4 هست.
معمولا چنین برنامه هایی رو که برنامه نویس تغییر در حالت بسته شدن به صورت عادی میدند رو اینطوری میکنند:
برنامتون باید دارای یهآیکن توی system try باشه.
به وسیله یه popup و ایجاد منویی به نام خروج ، میتونید برنامتون رو ببندید.

فکر کنم درست متوجه نشدید.
حرف شما درسته و همین کار هم کردم. و منو هم ساختم که شامل چندید گزینه هست که اولیش exit هست. کد درون اون رو این جوری نوشتم. form1.close
ولی با تغییری که (توی پست 4 ذکر شده) ایجاد کردیم. برنامه بسته نمیشه و minimize میشه.

Mask
چهارشنبه 15 آذر 1391, 19:09 عصر
کی گفت بنویسید form1.close ؟
باید بنویسید Application.Terminate
وقتی دارید رویداد close رو از حالت عادی خارج میکنید ، نباید دوباره صداش کنید.

farzadkamali
چهارشنبه 15 آذر 1391, 20:04 عصر
با تشکر فراوان از دوستان.

در مورد سوال دوم نظری ندارید؟

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

عقاب سیاه
چهارشنبه 15 آذر 1391, 22:00 عصر
خب دستورتون این جوری تغییر بیدن:

setting its state property to wsNormal. }
//TrayIcon1.Visible := False;
Show();
WindowState := wsNormal;
Application.BringToFront();


{ Hide the window and set its state variable to wsMinimized. }
Hide();
WindowState := wsMinimized;

{ Show the animated tray icon and also a hint balloon. }
TrayIcon1.Visible := True;
TrayIcon1.Animate := True;
TrayIcon1.ShowBalloonHint;

کافیه هنگام نمایش برنامه TrayIcon1.Visible را False نکنید همین!