PDA

View Full Version : سوال: چطوری می شه سورس کد یه شی رو در بین چند شی دیگه تغییر داد؟



Alireza Pro
پنج شنبه 16 شهریور 1391, 23:00 عصر
سلام دوستان

من چند وقت پیش یه همچین سوالی کردم (چطوری می شه سورس کد برنامه رو در حین اجرا عوض کرد)
http://barnamenevis.org/showthread.php?358741-%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D9%85%DB%8C-%D8%B4%D9%87-%D8%B3%D9%88%D8%B1%D8%B3-%DA%A9%D8%AF-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B1%D9%88-%D8%AF%D8%B1-%D8%AD%DB%8C%D9%86-%D8%A7%D8%AC%D8%B1%D8%A7-%D8%B9%D9%88%D8%B6-%DA%A9%D8%B1%D8%AF
که جوابشم معلوم شد ولی مشکل اینجاس اگه توی همون سوال ما توی فرم دوممون چند تا شی داشته باشیم :متعجب:

برنامه ارور می ده و یا کارشو انجام نمی ده یعنی طبق بحثی که اون جا شد که کد دکمه فرم دوم تغییر می کنه اگه دو تا دکمه داشته باشیم دیگه جواب نمی ده

تمامی قابلیت های کامپوننتی که معرفی شد رو نگاه کردم ولی راهی نداشت

اگه می شه کمکم کنید ؟؟؟

Alireza Pro
جمعه 17 شهریور 1391, 11:53 صبح
نمی دونم آیا این کامپوننت این قابلیت رو داره ؟؟

امین مستانی
جمعه 17 شهریور 1391, 12:08 عصر
سلام

ممکنه واضح تر توضیح بدید یا سورس رو قرار بدید....

Alireza Pro
جمعه 17 شهریور 1391, 12:32 عصر
طبق چیزی که اون جا من نوشتم موضوع از این قراره

ما دوتا فرم داریم
تو فرم 1 فقط یه تکست باکس و یه دکمه داریم
تو فرم تو فقط ما یه دکمه داریم

باید توی اون سوال طوری برنامه نویشی می شد که اگه روی دکمه ی فرم 1 کلیک می کردیم و به فرم دو می رفیم بدونه این که اون جا یعنی در دکمه فرم 2 کدی نوشته باشیم و روی اون کلیک می کنیم کدی رو که توی تکست باکس فرم 1 نوشتیم رو اجرا کنه که به کمک دوستان حل شد و راه حلش هم اون جا هست برید ببینید

حالا سوال این جاست که اگه ما توی فرم دوممون دو تا دکمه داشته باشیم دیگه برنامه درست اجرا نمیشه

می خواستم بدونم چطوری می شه کد فقط یه دکمه از فرم دوم رو عوض کرد ؟؟؟

Alireza Pro
جمعه 17 شهریور 1391, 12:49 عصر
اون جا یه کامپوننت معرفی شد که این کارو انجام می داد

Veteran
جمعه 17 شهریور 1391, 13:18 عصر
طبق چیزی که اون جا من نوشتم موضوع از این قراره

ما دوتا فرم داریم
تو فرم 1 فقط یه تکست باکس و یه دکمه داریم
تو فرم تو فقط ما یه دکمه داریم

باید توی اون سوال طوری برنامه نویشی می شد که اگه روی دکمه ی فرم 1 کلیک می کردیم و به فرم دو می رفیم بدونه این که اون جا یعنی در دکمه فرم 2 کدی نوشته باشیم و روی اون کلیک می کنیم کدی رو که توی تکست باکس فرم 1 نوشتیم رو اجرا کنه که به کمک دوستان حل شد و راه حلش هم اون جا هست برید ببینید

حالا سوال این جاست که اگه ما توی فرم دوممون دو تا دکمه داشته باشیم دیگه برنامه درست اجرا نمیشه

می خواستم بدونم چطوری می شه کد فقط یه دکمه از فرم دوم رو عوض کرد ؟؟؟
منظورتون اینه تاپیکه ؟
http://barnamenevis.org/showthread.php?358943-%DA%A9%D8%B3%DB%8C-%D9%85%DB%8C-%D8%AA%D9%88%D9%86%D9%87-%D8%A7%DB%8C%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B1%D9%88-%D8%AA%DA%A9%D9%85%DB%8C%D9%84-%DA%A9%D9%86%D9%87&p=1583157&viewfull=1#post1583157

Alireza Pro
جمعه 17 شهریور 1391, 13:22 عصر
منظورتون اینه تاپیکه ؟
http://barnamenevis.org/showthread.php?358943-%DA%A9%D8%B3%DB%8C-%D9%85%DB%8C-%D8%AA%D9%88%D9%86%D9%87-%D8%A7%DB%8C%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B1%D9%88-%D8%AA%DA%A9%D9%85%DB%8C%D9%84-%DA%A9%D9%86%D9%87&p=1583157&viewfull=1#post1583157

هر دوتا شون یکی هستن و دنباله یه موضوع نوشته شدند

Veteran
جمعه 17 شهریور 1391, 13:35 عصر
هر دوتا شون یکی هستن و دنباله یه موضوع نوشته شدند
این کد جدید.
شما هرچقدر کامند باتن بزارید مشکلی نیست.کد اجرا میشه.
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Mus As POINTAPI
Private Sub Command1_Click()
Form2.Show 1
Form2.ScriptControl1.AddCode (Text1)
End Sub
Private Sub Timer1_Timer()
GetCursorPos Mus
Dim Cmd As Control
For Each Cmd In Form2.Controls
If TypeOf Cmd Is CommandButton Then
If Cmd.hWnd = WindowFromPoint(Mus.X, Mus.Y) Then
If GetAsyncKeyState(1) = -32767 Then
Form2.ScriptControl1.AddCode (Text1)
End If
End If
End If
Next
End Sub

Alireza Pro
جمعه 17 شهریور 1391, 13:55 عصر
این کد جدید.
شما هرچقدر کامند باتن بزارید مشکلی نیست.کد اجرا میشه.
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Mus As POINTAPI
Private Sub Command1_Click()
Form2.Show 1
Form2.ScriptControl1.AddCode (Text1)
End Sub
Private Sub Timer1_Timer()
GetCursorPos Mus
Dim Cmd As Control
For Each Cmd In Form2.Controls
If TypeOf Cmd Is CommandButton Then
If Cmd.hWnd = WindowFromPoint(Mus.X, Mus.Y) Then
If GetAsyncKeyState(1) = -32767 Then
Form2.ScriptControl1.AddCode (Text1)
End If
End If
End If
Next
End Sub


یه سوال درباره کد بالا
الان شما تو کدوم قسمتش به برنامه می فهمونید که دکمه ی 1 رو ول کنه دکمه ی 2 رو تغییر بده ؟

Veteran
جمعه 17 شهریور 1391, 14:18 عصر
ببینین تئوری بنده برای حل این مسئه به این شکل هست.
که هر شی در در فرم 2.دارای یک عدد اختصاصی هست.که به اون هندل میگن.البته تنها فرم 2 نیست.همه اشیا در سیستم عامل ویندوز این خصوصیت رو دارند.
قطعا هرکجا موس قرار داره اون قسمت یک هندل مخصوصی داره.
با استفاده از api
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long

مختصات رو میگیریم مثلا موس در مختصات 560 و 780 هست.این تابع مختصات رو بر میگردونه.
بعد مختصات موس رو به api زیر میدیم تا هندل اون قسمتی که موس قرار داره رو برگردونه.
Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

حالا چون فرم ما دارای چندتا شی هست با مشخص کنیم که شی جاری که موس روی اون قرار داره کامند باتن هست ؟؟؟
For Each Cmd In Form2.Controls
If TypeOf Cmd Is CommandButton Then

حالا اگه کامند باتن بود
بعدش اون کامند باتن یک متد داره که هندل خودشو بر میگردونه.
ControlName.Hwnd
خب حالا ما چک میکنیم موس کجا قرار داره.هرکجا قرار داشت اگر هندل اون قسمت با هندل کامند باتن مساوی بود یعنی موس روی کامند باتنن قرار داره.
حالا باید چک کنیم که کاربر کلیک میکنه یا نه
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long


اگر کلیک کنه این
اجرا میشه
GetAsyncKeyState(1) = -32767
بهد کار ما تموم میشه.
کاربر روی کامند باتن موس رو قرار داده و کلیک کرده در نتیجه کد اجرا میشه.
اگر سوالی بود من دیگه نمیتونم جواب بدم چون 1 ساعت دیگه دارم میرم تهران اینترنت در دسترس نیست نمیتونم جواب بدم.
موفق باشید.