۲۶-دى-۱۳۹۰, ۱۴:۵۱:۳۲
فرض کنید که برنامه ی ما خودش رو به این شکل از حافظه خارج میکنه(البته برنامه اظهار میکنه که بسته شده، چون هنوز یک فرم (مثلا Form2 ) به طور مخفیانه در حال اجراست):
یعنی Form1 از حافظه خارج شده اما Form2 بدون ایکه کاربر ببینتش وجود داره:
**البته اینو بگم که واقعا نمیدونم که توسط این دستور فرم از حافظه خارج میشه یا نه، اما فرض میکنیم که از حافظه خارج میشه، چون درسته که برنامه رو End نمیکنه اما اگر فقط یک فرم داشته باشید و توسط دستور بالا ببندیدش عینا مثل دستور End عمل میکنه.
حالا
فرض کنید وقتی روی آیکن برنامه دوبار کلیک کردیم، برنامه میخواد بدون اینکه کاربر به چیزی شک کنه،
دوباره همون Form1 رو که توسط دستور بالا از حافظه خارج شد رو Load کنه.
من از دستورات زیر استفاده کردم(البته خیلی پیچیده تر از اینه، خیلی جاهاشو حذف کردم که مفهوم رو برسونم):
مشکل در خط 6 میباشد، چرا که از همان فرم (Form1)، یک فرم جدید در حافظه لود میکند
(یعنی برنامه دوبار لود شده) برای این منظور میتونید Alt+Ctrl+Delete رو بزنید و در زبانه ی
Processes این جریان رو ببینید.(البته فرض بر این است که برنامه در زبانه ی Applications مخفی است)
ممکنه شما بگید:
خوب، Form1 رو با دستورات
اما جواب من این است که: برنامه ی من میخواهد تظاهر کند که Exit شده (اما درواقع اینطور نیست)
همچنین آیکن برنامه ی من در system tray وجود دارد، و Hide کردن Form، یا Flase کردن visible، نمیتوانند کمکی به من بکنند.
بعد از این همه داستان سرایی،
میخواهم بدانم چکار کنم که همان فرم قبلی، که از حافظه خارج شده، دوباره به برنامه بازگردد، یعنی با دوبار کلیلک روی آیکن برنامه،برنامه ی جدیدی باز نشود و همان برنامه ای که از قبل باز هست را (Form2) مدیریت کرده و Form1 را (که قرار است در دید کاربر باشد) را لود کند.
اگه متوجه نشدید چی میگم برنامه ی زیر رو دانلود کنید:
اگه اینجا نوشته ها بهم ریخته ست، فایل متنی Tozihat رو دانلود کنید:
یعنی Form1 از حافظه خارج شده اما Form2 بدون ایکه کاربر ببینتش وجود داره:
CloseIt = FindWindow(vbNullString, "Form1")
PostMessage CloseIt, WM_CLOSE, CLng(0), CLng(0)
'Forme1 baste mishe(az hafeze kharej mishe), ama form2 ke visible-sh False-e vujud dare
PostMessage CloseIt, WM_CLOSE, CLng(0), CLng(0)
'Forme1 baste mishe(az hafeze kharej mishe), ama form2 ke visible-sh False-e vujud dare
**البته اینو بگم که واقعا نمیدونم که توسط این دستور فرم از حافظه خارج میشه یا نه، اما فرض میکنیم که از حافظه خارج میشه، چون درسته که برنامه رو End نمیکنه اما اگر فقط یک فرم داشته باشید و توسط دستور بالا ببندیدش عینا مثل دستور End عمل میکنه.
حالا
فرض کنید وقتی روی آیکن برنامه دوبار کلیک کردیم، برنامه میخواد بدون اینکه کاربر به چیزی شک کنه،
دوباره همون Form1 رو که توسط دستور بالا از حافظه خارج شد رو Load کنه.
من از دستورات زیر استفاده کردم(البته خیلی پیچیده تر از اینه، خیلی جاهاشو حذف کردم که مفهوم رو برسونم):
1. Dim ProgramIsRun As Long
2. ProgramIsRun = FindWindow(vbNullString, "Form1")
3. If (App.PrevInstance = True) Then 'agar barname Run bud (yani Form2 dar hale ejrast)
4. If ProgramIsRun = 0 Then 'agar Form1 Run Nabud
5. Call LoadSettings_Of_Registery
6. Form1.Show 'Form1 ro Run mikone
7. Else 'agar Form1 Run bud
8. End
9. Exit Sub
10. End If
2. ProgramIsRun = FindWindow(vbNullString, "Form1")
3. If (App.PrevInstance = True) Then 'agar barname Run bud (yani Form2 dar hale ejrast)
4. If ProgramIsRun = 0 Then 'agar Form1 Run Nabud
5. Call LoadSettings_Of_Registery
6. Form1.Show 'Form1 ro Run mikone
7. Else 'agar Form1 Run bud
8. End
9. Exit Sub
10. End If
مشکل در خط 6 میباشد، چرا که از همان فرم (Form1)، یک فرم جدید در حافظه لود میکند
(یعنی برنامه دوبار لود شده) برای این منظور میتونید Alt+Ctrl+Delete رو بزنید و در زبانه ی
Processes این جریان رو ببینید.(البته فرض بر این است که برنامه در زبانه ی Applications مخفی است)
ممکنه شما بگید:
خوب، Form1 رو با دستورات
CloseIt = FindWindow(vbNullString, "Form1")
PostMessage CloseIt, WM_CLOSE, CLng(0), CLng(0)
از حافظه خارج نکن و فقط ویزیبل رو فالس کن،PostMessage CloseIt, WM_CLOSE, CLng(0), CLng(0)
اما جواب من این است که: برنامه ی من میخواهد تظاهر کند که Exit شده (اما درواقع اینطور نیست)
همچنین آیکن برنامه ی من در system tray وجود دارد، و Hide کردن Form، یا Flase کردن visible، نمیتوانند کمکی به من بکنند.
بعد از این همه داستان سرایی،
میخواهم بدانم چکار کنم که همان فرم قبلی، که از حافظه خارج شده، دوباره به برنامه بازگردد، یعنی با دوبار کلیلک روی آیکن برنامه،برنامه ی جدیدی باز نشود و همان برنامه ای که از قبل باز هست را (Form2) مدیریت کرده و Form1 را (که قرار است در دید کاربر باشد) را لود کند.
اگه متوجه نشدید چی میگم برنامه ی زیر رو دانلود کنید:
اگه اینجا نوشته ها بهم ریخته ست، فایل متنی Tozihat رو دانلود کنید: