۲۸-دى-۱۳۹۰, ۲۰:۴۱:۴۹
صفحهها: 1 2
۲۹-دى-۱۳۹۰, ۱۵:۲۹:۴۱
(۲۸-دى-۱۳۹۰, ۲۰:۴۱:۴۹)atige نوشته است: [ -> ]نمیشه شما به جای اینکه فرم 1 رو ببندی اونو هاید کنی؟نه لازمش دارم، گاهی لازم میشه از این ویژگی استفاده کرد
۰۲-بهمن-۱۳۹۰, ۰۰:۳۶:۴۱
payman62 ی عزیز جواب داد
واقعا ممنون از راهنمایی های خوبت، معلوم بود سوالمو خوب خوندی و متوجه منظورم شدی،
اما من نمیدونستم تولید یه کپشن خاص به صورت GUID که یونیک باشه یعنی چی،
به خاطر همین توی فرم2 یه text box گذاشتم
و توی رویداد changeش نوشتم:
و هنگام خروج نوشتم:
وتوی frm_load بررسی کردم
اگر برنامه run بود ولی form1 ، ران نبود، پیغام RunMe رو به تکست فرم2 ارسال کنه
که رویداد change تکست فرم2 ،که برنامش بالا هست، اگر عبارت RunMe رو دریافت کنه فرم 1 رو اجرا میکنه درغیر اینصورت کاری نمیکنه.
جواب دادنش توی همه ی حالات جواب میده اما میخوام ببینم روشم مشکل نداره؟ روش مطمئنی هست؟
واقعا ممنون از راهنمایی های خوبت، معلوم بود سوالمو خوب خوندی و متوجه منظورم شدی،
اما من نمیدونستم تولید یه کپشن خاص به صورت GUID که یونیک باشه یعنی چی،
به خاطر همین توی فرم2 یه text box گذاشتم
و توی رویداد changeش نوشتم:
کد:
If Form2.txtMessage = "RunMe" Then
Form1.Show
Else
Exit Sub
End If
و هنگام خروج نوشتم:
کد:
Form2.txtMessage.Text = "I Go"
Dim CloseIt As Long
CloseIt = FindWindow(vbNullString, "Form1")
PostMessage CloseIt, WM_CLOSE, CLng(0), CLng(0)
وتوی frm_load بررسی کردم
اگر برنامه run بود ولی form1 ، ران نبود، پیغام RunMe رو به تکست فرم2 ارسال کنه
کد:
Dim ProgramIsRun As Long
ProgramIsRun = FindWindow(vbNullString, "Form1")
If (App.PrevInstance = True) Then
If ProgramIsRun = 0 Then
.
.
.
ThWnd = FindWindow(vbNullString, "Form2")
a$ = "RunMe"
CopyMemory buf(1), ByVal a$, Len(a$)
cds.dwData = 3
cds.cbData = Len(a$) + 1
cds.lpData = VarPtr(buf(1))
i = SendMessage(ThWnd, WM_COPYDATA, Me.hWnd, cds)
End
Exit Sub
Else
End
Exit Sub
End If
ElseIf (App.PrevInstance = False) Then
Form1.Show
Form2.Show
Frm_Load.Hide
End If
که رویداد change تکست فرم2 ،که برنامش بالا هست، اگر عبارت RunMe رو دریافت کنه فرم 1 رو اجرا میکنه درغیر اینصورت کاری نمیکنه.
جواب دادنش توی همه ی حالات جواب میده اما میخوام ببینم روشم مشکل نداره؟ روش مطمئنی هست؟
۰۲-بهمن-۱۳۹۰, ۱۱:۴۶:۵۱
(۲۸-دى-۱۳۹۰, ۱۲:۲۰:۴۱)Di Di نوشته است: [ -> ]http://www.iranled.com/forum/thread-1902...9%81%D8%A7
di di جان به این لینک رفتم و چیزی پیدا نکردم، خود کامپوننت ورژن13 نبود فقط کرک ش بود
۰۲-بهمن-۱۳۹۰, ۱۳:۰۶:۵۲
سلام.
GUID یه استرینگ هست که به صورت یونیک تولید میشه.
به مسیر C:\Program Files\Microsoft Visual Studio\Common\Tools برو و برنامه GUIDGEN.EXE رو اجرا کن. رو NewGUID کلیک کن و در Result نتیجه رو ببین.
یه رشته مثل {6F428B38-7592-40a0-BF03-384FE96372E7} تولید میکنه که مطمن هستی یونیک هست و به هیچ عنوان تکراری نخواهد بود.
من عرض کردم کپشن فرمت رو برابر یه GUID قرار بدی تا مطمن بشی هندل فرم برنامه خودتو به دست میگیری.
عنوان Form1 برای کپشن فرمی که داخل پروژه از Findwindow برای پیدا کردن فرم استفاده میکنه خیلی ناشیانه هست و احتمال خطا رو بالا میبره. ممکنه برنامه دیگه ای با این کپشن موجود باشه و هندل اون برنامه رو به دست بگیری.
این از GUID.
اما در مورد تکس باکسی هم که گذاشتی اصلا نفهمیدم برای چی این کار رو کردی.
هنگامی که برنامه اجرا میشه چک میکنه اولین باره اجرا شده یا نه. اگه اولین بار بود که برنامه به صورت عادی اجرا میشه.
اما اگه اولین بار نبود هندل فرم2 که یه GUID هست رو سرچ میکنه. وقتی هندل رو پیدا کرد چون مربوط به یه پروسه دیگست یه پیغام خاص براش میفرسته. در اون سمت هم در اون پروسه وقتی فرم2 اون پیغام رو دریافت کرد فرم1 رو نمایش میده.
تابع مربوطه هنگام دریافت پیغام به صورت یه event کار میکنه و فراخوانی میشه. دیگه نیازی به ایونت textchange تکس باکس نیست.
ضمنا از این کدت هم اصلا سر در نیوردم.
شما 2 بار اومدی بعد end دستور exit sub رو گذاشتی که هیچ وقت اجرا نمیشه.
بعد end if قرار دادی و بعدش elseif گذاشتی. این elseif به کدوم if مربوط میشه ؟
از کد زیر استفاده کن.
اینم تغییرات تابع MySub
GUID یه استرینگ هست که به صورت یونیک تولید میشه.
به مسیر C:\Program Files\Microsoft Visual Studio\Common\Tools برو و برنامه GUIDGEN.EXE رو اجرا کن. رو NewGUID کلیک کن و در Result نتیجه رو ببین.
یه رشته مثل {6F428B38-7592-40a0-BF03-384FE96372E7} تولید میکنه که مطمن هستی یونیک هست و به هیچ عنوان تکراری نخواهد بود.
من عرض کردم کپشن فرمت رو برابر یه GUID قرار بدی تا مطمن بشی هندل فرم برنامه خودتو به دست میگیری.
عنوان Form1 برای کپشن فرمی که داخل پروژه از Findwindow برای پیدا کردن فرم استفاده میکنه خیلی ناشیانه هست و احتمال خطا رو بالا میبره. ممکنه برنامه دیگه ای با این کپشن موجود باشه و هندل اون برنامه رو به دست بگیری.
این از GUID.
اما در مورد تکس باکسی هم که گذاشتی اصلا نفهمیدم برای چی این کار رو کردی.
هنگامی که برنامه اجرا میشه چک میکنه اولین باره اجرا شده یا نه. اگه اولین بار بود که برنامه به صورت عادی اجرا میشه.
اما اگه اولین بار نبود هندل فرم2 که یه GUID هست رو سرچ میکنه. وقتی هندل رو پیدا کرد چون مربوط به یه پروسه دیگست یه پیغام خاص براش میفرسته. در اون سمت هم در اون پروسه وقتی فرم2 اون پیغام رو دریافت کرد فرم1 رو نمایش میده.
تابع مربوطه هنگام دریافت پیغام به صورت یه event کار میکنه و فراخوانی میشه. دیگه نیازی به ایونت textchange تکس باکس نیست.
ضمنا از این کدت هم اصلا سر در نیوردم.
کد:
Dim ProgramIsRun As Long
ProgramIsRun = FindWindow(vbNullString, "Form1")
If (App.PrevInstance = True) Then
If ProgramIsRun = 0 Then
.
.
.
ThWnd = FindWindow(vbNullString, "Form2")
a$ = "RunMe"
CopyMemory buf(1), ByVal a$, Len(a$)
cds.dwData = 3
cds.cbData = Len(a$) + 1
cds.lpData = VarPtr(buf(1))
i = SendMessage(ThWnd, WM_COPYDATA, Me.hWnd, cds)
End
Exit Sub
Else
End
Exit Sub
End If
ElseIf (App.PrevInstance = False) Then
Form1.Show
Form2.Show
Frm_Load.Hide
End If
شما 2 بار اومدی بعد end دستور exit sub رو گذاشتی که هیچ وقت اجرا نمیشه.
بعد end if قرار دادی و بعدش elseif گذاشتی. این elseif به کدوم if مربوط میشه ؟
از کد زیر استفاده کن.
کد:
Private Sub Form_Load()
Dim blnForm1IsOpen As Boolean
If (App.PrevInstance) Then
blnForm1IsOpen = CBool(FindWindow(vbNullString, "Form1:{8522A1F2-2F0B-4a29-BB25-E52F2E096C08}"))
If blnForm1IsOpen = False Then
ThWnd = FindWindow(vbNullString, "Form2:{0226AEB4-8B3A-4a5a-A252-2037EB39AE08}")
MySendMessage "Open Form1", ThWnd
End If
Else
Form1.Show
Form2.Show
Frm_Load.Hide
End If
End Sub
Private Sub MySendMessage(Message As String, Handle As Long)
Dim cds As COPYDATASTRUCT
Dim buf(1 To 255) As Byte
CopyMemory buf(1), ByVal Message, Len(Message)
cds.dwData = 3
cds.cbData = Len(Message) + 1
cds.lpData = VarPtr(buf(1))
i = SendMessage(Handle, WM_COPYDATA, Me.hWnd, cds)
End Sub
اینم تغییرات تابع MySub
کد:
Private Sub MySub(lParam As Long)
Dim cds As COPYDATASTRUCT
Dim buf(1 To 255) As Byte
Call CopyMemory(cds, ByVal lParam, Len(cds))
If cds.dwData = 3 Then
CopyMemory buf(1), ByVal cds.lpData, cds.cbData
a$ = StrConv(buf, vbUnicode)
a$ = Left$(a$, InStr(1, a$, Chr$(0)) - 1)
If a$ = "Open Form1" Then Form1.Show
End If
End Sub
۰۲-بهمن-۱۳۹۰, ۱۳:۲۰:۱۲
دوتا if تو در تو گذاشتم
اون elseif ی که شما میگید مربوط به if اول میشه
exit sub هم محض احتیاط گذاشتم، با اینکه میدونستم بعد از دستور end دیگه کدی خونده نمیشه،
payman62 جان من با گذاشتن Textbox و بررسی $a توی رویداد changeش برای show کردن form1 ،مثه این بود که لقمه رو دور دهنم میچرخوندم، اما حالا متوجه اشتباهم شدم
***هرکاری کردم نتونستم if هارو و کدهارو چیدمانش رو درست کنم، لطفا رسیدگی کنید، متن انگلیسی رو خیلی قاتی پاتی مینویسه***
این کد هم واسه اینه که بالا گفتی سر در نیوردی، کاملترش کردم، تا متوجه ش بشی( اگرچه این کد مشکل داره و الان دیگه از این کد استفاده نمیکنم)
اون elseif ی که شما میگید مربوط به if اول میشه
exit sub هم محض احتیاط گذاشتم، با اینکه میدونستم بعد از دستور end دیگه کدی خونده نمیشه،
payman62 جان من با گذاشتن Textbox و بررسی $a توی رویداد changeش برای show کردن form1 ،مثه این بود که لقمه رو دور دهنم میچرخوندم، اما حالا متوجه اشتباهم شدم
***هرکاری کردم نتونستم if هارو و کدهارو چیدمانش رو درست کنم، لطفا رسیدگی کنید، متن انگلیسی رو خیلی قاتی پاتی مینویسه***
این کد هم واسه اینه که بالا گفتی سر در نیوردی، کاملترش کردم، تا متوجه ش بشی( اگرچه این کد مشکل داره و الان دیگه از این کد استفاده نمیکنم)
کد:
Private Sub Form_Load()
Dim ProgramIsRun As Long
ProgramIsRun = FindWindow(vbNullString, "Form1")
If (App.PrevInstance = True) Then 'agar barname Run bud
If ProgramIsRun = 0 Then 'agar Form1 Run Nabud
'ersale message baraye run kardane form >>
Dim cds As COPYDATASTRUCT
Dim ThWnd As Long
Dim buf(1 To 255) As Byte
ThWnd = FindWindow(vbNullString, "Form2")
a$ = "RunMe"
CopyMemory buf(1), ByVal a$, Len(a$)
cds.dwData = 3
cds.cbData = Len(a$) + 1
cds.lpData = VarPtr(buf(1))
i = SendMessage(ThWnd, WM_COPYDATA, Me.hwnd, cds)
'ersale message baraye run kardane form <<
End
Else 'agar Form1 Run bud
End
End If
ElseIf (App.PrevInstance = False) Then 'agar barname run nabud
Form1.Show
Form2.Show
Frm_Load.Hide
End If
۰۲-بهمن-۱۳۹۰, ۱۳:۴۷:۰۷
سلام.
پست قبلی کد اصلاح شده رو براتون قرار داده بودم. ظاهرا پست من رو کامل نخوندید.
پست قبلی کد اصلاح شده رو براتون قرار داده بودم. ظاهرا پست من رو کامل نخوندید.
۰۲-بهمن-۱۳۹۰, ۱۳:۴۹:۰۸
(۲۸-دى-۱۳۹۰, ۲۰:۴۱:۴۹)atige نوشته است: [ -> ]نمیشه شما به جای اینکه فرم 1 رو ببندی اونو هاید کنی؟اگه مایل بودی میتونم بیشتر توضیح بدم
***چون توضیحش یکم مفصله.
اگه برنامه رو دانلود کنی شاید بفهمی منظورم چیه
فقط وقتی دانلودش کردی توی فرم frm_load توی رویداد form_Load خط اول قبل از ...=Form1.Label5.Caption یه Rem بنویس یا یه ' بزار تا جواب بده.
(۰۲-بهمن-۱۳۹۰, ۱۳:۴۷:۰۷)Payman62 نوشته است: [ -> ]سلام.
پست قبلی کد اصلاح شده رو براتون قرار داده بودم. ظاهرا پست من رو کامل نخوندید.
payman 62 جان چرا خوب خوندم، و از کد شما استفاده کردم ، و کاملا متوجه اشتباهم شدم ، وازتون هم خیلی خیلی مچکرم ، این کد رو هم گذاشتم تا کدی که قبلا گذاشته بودم و شما متوجه ش نشده بودین رو کامل ترش کنم تا متوجه منظورم بشین.
ممنون
۰۲-بهمن-۱۳۹۰, ۱۵:۴۳:۲۵
payman62 سلام، با این مطلب قصدم رفع اشکال و کمک به کسایی هست که دارن موضوع رو میخونن، و من قصد بدی ندارم. کد شما کاملا درست میباشد اما چند تا نکته باید بهش اضافه کنم:
در کدی که شما دادی
1- Dim ThWnd As Long کم داره و باید اضافه بشه
2- بعد از دستور MySendMessage "Open Form1", ThWnd در رویداد load فرم frm_load باید دستور End رو اضافه کنیم چون وقتی پیغام رو میفرسته دیگه دوباره نباید خودش اجرا بشه، بنابراین پیغام رو میفرسته و End میشه
3- در همان رویداد Load در فرم frm_load بعد از دستورات مربوط به if دوم باید عبارات زیر اضافه شوند:
Else
End
این else زمانی اتفاق می افتد که فرم 1 درحال اجرا باشد، بنابراین نیازی به ارسال message و اجرای دوباره ی برنامه نیست.
تابع MySendMessage مشکلی نداره،
تابع mySub هم مشکلی نداره و به همون شکلی که شما گفتید میباشد
در کل کد رویداد Load در frm_load به شکل زیر است:
در کدی که شما دادی
1- Dim ThWnd As Long کم داره و باید اضافه بشه
2- بعد از دستور MySendMessage "Open Form1", ThWnd در رویداد load فرم frm_load باید دستور End رو اضافه کنیم چون وقتی پیغام رو میفرسته دیگه دوباره نباید خودش اجرا بشه، بنابراین پیغام رو میفرسته و End میشه
3- در همان رویداد Load در فرم frm_load بعد از دستورات مربوط به if دوم باید عبارات زیر اضافه شوند:
Else
End
این else زمانی اتفاق می افتد که فرم 1 درحال اجرا باشد، بنابراین نیازی به ارسال message و اجرای دوباره ی برنامه نیست.
تابع MySendMessage مشکلی نداره،
تابع mySub هم مشکلی نداره و به همون شکلی که شما گفتید میباشد
در کل کد رویداد Load در frm_load به شکل زیر است:
کد:
Private Sub Form_Load()
'For Hide program from windows task manager >>
Set Reg = CreateObject("wscript.shell")
'Reg.RegWrite HKEY_LOCAL_MACHINE \ SOFTWARE \ MICROSOFT \ WINDOWS \ CURRENTVERSION \ RUN \ "&" \ App.EXEName, App.Path & "\" & App.EXEName & ".exe"
App.TaskVisible = False
'For Hide program from windows task manager <<
Dim ThWnd As Long
Dim blnForm1IsOpen As Boolean
If (App.PrevInstance) Then
blnForm1IsOpen = CBool(FindWindow(vbNullString, "Form1:{8522A1F2-2F0B-4a29-BB25-E52F2E096C08}"))
If blnForm1IsOpen = False Then 'agar form1 run nabud
ThWnd = FindWindow(vbNullString, "Form2:{0226AEB4-8B3A-4a5a-A252-2037EB39AE08}")
MySendMessage "Open Form1", ThWnd
End
Else 'agar form1 run bud
End
End If
Else
Form1.Show
Form2.Show
Frm_Load.Hide
End If
End Sub
۰۲-بهمن-۱۳۹۰, ۱۸:۵۵:۲۲
سلام.
چرا
وقتی دستوری هم در if هست و هم در else بهتره یه بار بیرون if نوشته بشه.
به این صورت:
در آخر هم بهتره پروژت با تابع Main بیاد بالا. در اون صورت به اون end یا مخفی کردن اون فرم یا اصلا به اون فرم اضافی نیازی نیست.
منم طبق عادتی که نسبت به تابع main دارم end رو قرار ندادم.
چرا
کد:
If Condition1 Then
'Code
If Condition2 Then
'Code
End
Else
End
End If
Else
'Code
End If
وقتی دستوری هم در if هست و هم در else بهتره یه بار بیرون if نوشته بشه.
به این صورت:
کد:
If Condition1 Then
'Code
If Condition2 Then
'Code
End If
End
Else
'Code
End If
در آخر هم بهتره پروژت با تابع Main بیاد بالا. در اون صورت به اون end یا مخفی کردن اون فرم یا اصلا به اون فرم اضافی نیازی نیست.
منم طبق عادتی که نسبت به تابع main دارم end رو قرار ندادم.
۰۲-بهمن-۱۳۹۰, ۱۹:۴۷:۱۵
Ok حرف شما درسته،
باز هم ممنون به خاطر تمام راهنمایی ها ی خوبت، خیلی خوب بود ممنون ;-)
باز هم ممنون به خاطر تمام راهنمایی ها ی خوبت، خیلی خوب بود ممنون ;-)
صفحهها: 1 2