PDA

View Full Version : حذف Tray Icon



مجتبی جوادی
سه شنبه 21 مهر 1388, 13:28 عصر
دوستان سلام
چگونه می شود آیکون را از Tray حذف کرد(البته با کد نویسی در دلفی)
با تشکر

young_man1365
سه شنبه 21 مهر 1388, 13:42 عصر
اگه منظورتون نشون ندادنه:


trayicon1.visible:=false;

hadisalahi2
چهارشنبه 22 مهر 1388, 09:51 صبح
خوب اون TryIcon1 چی هست؟

young_man1365
چهارشنبه 22 مهر 1388, 10:31 صبح
trayicon یه کامپوننت دلفی 2009 که یه آیکون مربوط به برنامتون رو به system tray ویندوز اضافه میکنه. با trayicon میتونی برنامت رو به حالت monitoring ببری مثل (آنتی ویروس) و ... در کل با تعریف یه PopupMenu برای این کامپوننت میتونی برنامه رو کنترل کنی. این کامپوننت قابلیت های دیگه ای هم داره که با امتحان این کامپوننت بهش میرسی.

مجتبی جوادی
چهارشنبه 22 مهر 1388, 10:50 صبح
دوستان سلام و ممنون
من یک برنامه نوشته ام که بعد از نصب در رجیستری ویندوز قرار میگره . هنگامیکه ویندوز بالا میاد برنامه اجرا شده و برنامه در tray قرار میگیره . حالا میخوام برنامه ای بنویسم که برای یک لحظه برنامه قبلی از tray حذف شده و دوباره در tray قرار گیرد . این دو برنامه مجزا از هم هستند.
ممنون

AbiriAmir
چهارشنبه 22 مهر 1388, 16:21 عصر
شما باید بهش Message ارسال کنی...
تو برنام اصلیتون هم Message رو بگیرین و اگه مشخصاتش درست بود کاری که میخواین رو انجام بده...
Post Message رو سرچ کنین...

AbiriAmir
چهارشنبه 22 مهر 1388, 16:35 عصر
فایل ضمیمه مشکلتون رو حل میکنه
تو فولدر Main برنامه ای هست که میره تو سینی سیستم
New Folder هم برنامه ای هست که دستور ارسال میکنه

مجتبی جوادی
پنج شنبه 23 مهر 1388, 09:44 صبح
آقا امیر ممنون از لطف شما ولی مشکلم حل نشد .چون من نمی خوام فقط آیکون آن مخفی بشه بلکه میخوام خود برنامه هم که فعاله ، کلاً بسته بشه . من دوتا برنامه دارم که هر دو به یک بانک متصلند . یکی همیشه فعاله(همان برنامه که در Tray میشینه) و دومی هر موقع که نیاز داشته باشم برنامه را اجرا و از آن استفاده می کنم . برنامه اولی دائما بانک را کنترل میکنه و در تاریخ های مشخصی پیغامهایی را می ده . حالا میخوام وقتی برنامه دوم را اجرا می کنم و تا زمانی که برنامه دوم فعال است ، برنامه اول کلا بسته شود و هنگام خروج از برنامه دوم ، برنامه اول مجدداً فعال شود .
با تشکر از لطف شما

Mahmood_M
پنج شنبه 23 مهر 1388, 11:31 صبح
می تونید به برنامتون پیغام بفرستید و اون رو ببندید ...
باید هندل برنامه رو پیدا کنید ، چون برنامه به SysTray رفته ، پس نمی تونید با عنوانش اون رو پیدا کنید ، ولی با نام کلاس فرم می تونید ، به صورت زیر عمل کنید :
مثلا اگه اسم فرم برنامه ای که به SysTray رفته " MainFrm " باشه :
procedure TForm1.BitBtn1Click(Sender: TObject);
var
H : THandle;
begin
H := FindWindow('TMainFrm', nil);
SendMessage(H, WM_CLOSE, 0, 0);
end;
با کد بالا پیغام بستن برنامه رو به برنامه ی در SysTray می فرستید و اون بسته میشه ...

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

مجتبی جوادی
پنج شنبه 23 مهر 1388, 13:25 عصر
آقا محمود ممنون ولی عمل نمی کنه

Mahmood_M
پنج شنبه 23 مهر 1388, 13:44 عصر
آقا محمود ممنون ولی عمل نمی کنه
چرا عمل نمیکنه ؟ هیچ اتفاقی نمی افته ؟
احتمالا نام کلاس فرم رو درست ننوشتید ، دقت کنید که در برنامه ای که به Tray میره ، نام فرم اصلی چی هست ، مثلا اگه هست Form1 ، برای نام کلاس بنویسید : TForm1
من دوباره تست کردم ، مشکلی نداره ... !
یک نکته : برای بردن برنامه به Tray از کامپوننت استفاده میکنید ؟ چه کامپوننتی ؟

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

مجتبی جوادی
پنج شنبه 23 مهر 1388, 17:30 عصر
بله از کامپوننت bsTrayIcon BusinessSkinFormاستفاده می کنم

AbiriAmir
پنج شنبه 23 مهر 1388, 18:42 عصر
من منظورتون رو درست متوجه نمیشم...

AbiriAmir
پنج شنبه 23 مهر 1388, 18:43 عصر
خب شما میتونید کدهای من رو تغییر بدین و به جای مخفی کردن آیکون برنامه رو ببندید و یا به قول آقا محمود مستقیم به اون دستور Close بفرستید

AbiriAmir
پنج شنبه 23 مهر 1388, 18:47 عصر
آهان
الان یه چیزی به ذهنم رسید
شما میتونید با باز شدن برنامه دوم یه پیغام به برنامه اول بفرستید و برنامه اول به گرفتن اون پیغام قفل بشه یا Enabled ش False بشه
هنگام خروج برنامه دوم هم یه پیغام بفرستید که دوباره برنامه اول به حالت اولیه برگرده...

مجتبی جوادی
پنج شنبه 23 مهر 1388, 20:07 عصر
دوستان سلام مجدد
من تمام کارهایی که شما کفتید و بفکر خودم هم رسیده انجام دادم ولی بازهم نمیشه . فایل اولی من هنگام اجرا شدن مخفی شده و آیکون آن در Tray قرار می گیرد . تا زمانیکه ویندوز روش است برنامه فعال است و دائماً بانک اطلاعات را چک می کند و در ساعتهای تعیین شده یکسری پیغام میده . برنامه دوم ، برنامه اصلی من است که هر موقع میخوام اطلاعات به آن اضافه کنم ، آنرا اجرا می کنم . مشکل من اینه که وقتی با برنامه دوم(برنامه اصلی) میخوام از بانکم بک آپ بگیرم چون برنامه اولی دائماً به بانک متصله پیغام خطا میده . حالا میخوام وقتی برنامه دومی اجرا میشه ، برنامه اولی کلا بسته بشه تا ارتباط آن با بانک قطع بشه .
این کل برنامه منه با تشکر از لطف شما

Mahmood_M
جمعه 24 مهر 1388, 02:12 صبح
دوست عزیز ، با اون روشی که گفتم مشکلتون حل میشه ...
باید به برنامه ی اول ، توسط برنامه ی دوم یک پیغام بفرستید و در برنامه اول پیغام رو چک کنید ، اگر پیغام مورد نظر بود ، اون وقت در برنامه ی اول ارتباط با بانک رو قطع کنید و وقتی کار برنامه ی دوم تمام شد و بسته شد ، باز پیغامی به برنامه ی اول بفرستید و دوباره ارتباط رو برقرار کنید ...
توی این صفحه (http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm) یک نمونه برای ارسال اطلاعات بین دو برنامه همراه با توضیح قرار داده شده ، یکی از اطلاعاتی که ارسال میشه داده ی String هست ، می تونید از این داده برای ارسال یک مقدار رشته ای بین برنامه هاتون استفاده کنید.
مثلا وقتی برنامه ی دوم اجرا میشه ، یک مقدار String مثلا با مقدار " Disconnect DB " به برنامه ی اول بفرستید و در برنامه ی اول چک کنید که اگر این پیغام گرفته شد ، ارتباط با بانک قطع بشه ، و بعد از پایان بک آپ برنامه ی دوم پیغامی با عنوان مثلا " Connect DB " به برنامه اول بفرستید و برنامه ی اول هم با گرفتن این پیغام دوباره به بانک وصل بشه ...
برای گرفتن Handle برنامه ای که به SysTray رفته هم ، همونطور که قبلا گفتم ، میتونید از نام کلاس فرم استفاده شده مثلا " TForm1 " استفاده کنید ...
نکته ی مهم : در تابع ی FindWindow برای پیدا کردن Handle برنامه قسمت دوم رو nil قرار بدید و به صورت (( ' ' )) قرار ندید چون در این صورت برنامه دنبال پنجره ای با عنوان خالی میگرده که مطمئنا به نتیجه نمی رسید ولی وقتی در این پارامتر مقدار nil قرار می دید برنامه برای این قسمت هیچ شرطی نمی زاره برای پیدا کردن Handle ...
مثال از FindWindow :

Handle := FindWindow('TForm1', nil);

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

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

merced
جمعه 24 مهر 1388, 07:38 صبح
حالا میخوام وقتی برنامه دومی اجرا میشه ، برنامه اولی کلا بسته بشه تا ارتباط آن با بانک قطع بشه .


اين كه اين همه كش و فش نمي خواد . با KillTask كه در همين سايت ميتوني پيدا كني اون برنامه رو ببند و بعد از پشتيبان گيري با ShellExec اجراش كن .
هر دو برنامه مال خودته ديگه . هم مسيرش رو مي دوني هم اسم Process او رو

اينم TaskKill



WinExec('Taskkill /F /IM yourprocessname.exe',SW_NORMAL);

مجتبی جوادی
شنبه 09 آبان 1388, 12:40 عصر
دوستان ممنون از لطفتان ولی هر کاری انجام میدم نمیشه!!!!

Mahmood_M
شنبه 09 آبان 1388, 12:59 عصر
توصیه میکنم ، در یک پست به طور کامل هدف و روش کارتون رو توضیح بدید ، مطمئنا جوابتون رو می گیرید ، راه حلهایی که تا الآن ارایه شد باید مشکلتون رو حل میکرد ، ولی اگه باز مشکل وجود داره ، باید موضوع رو در مقیاس کوچکتری بررسی کرد !!
لطفا در یک پست هدف و روش کارتون رو به طور کامل توضیح بدید ...

...

مجتبی جوادی
شنبه 09 آبان 1388, 18:40 عصر
آقا محمود جالب اینجاست که روی دوتا پروژه جدید تست میکنم جواب میده

مجتبی جوادی
یک شنبه 10 آبان 1388, 11:39 صبح
دوستان سلام مجدد
از همه شما هم ممنونم هم عذرخواهی میکنم چون مشکل برنامه ام این بود که من Close فرمی که در Tany قرار میگره را بسته بودم! ببخشید مشکلم حل شد
خصوصاً شما آقا محمود