warrior_hamed
چهارشنبه 13 شهریور 1392, 10:17 صبح
سلام من میخوام 99 تا دکمه با کد موقع اجرا شدن فرم بسازم
کدشو بلدم
dim btn(99) as commandbutton
اما اگه بخوام برای هرکدوم روال رویداد click رو قرار بدم باید withevents استفاده کنم اما گیر میده
dim withevents btn(99) as commandbutton
ولی اگه 99 رو ننویسی ایرادی پیش نمیاد چرا نمیشه از آرگومان در این مورد استفاده کرد؟؟؟
جوابمو تو صفحات خارجی پیدا کردم اما آی کی یو ام نمیرسه http://www.iran-forum.ir/images/icons/vb-icone/a%20%2858%29.gif
http://www.vbforums.com/showthread.php?372811-Classic-VB-Why-can-t-I-use-WithEvents-on-arrays-of-objects
Mr'Jamshidy
چهارشنبه 13 شهریور 1392, 10:59 صبح
2 راه داری
1. یک دکمه از نوع آرایه روی فرم بزاری و آرایه های اون رو لود کنی
2. بدون WithEvent بسازی و با API ، ایونت هاش رو هوک کنی
vbhamed
چهارشنبه 13 شهریور 1392, 19:09 عصر
سلام
راه اصوليش اينه كه البته دوستمون آقاي جمشيدي عزيز هم اشاره كردن
اول يك كنترل كامند Index دار روي فرم بزار بعدش كد زير :
Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0
Case 1
'.
'.
'.
End Select
End Sub
Private Sub Form_Load()
Dim i%
For i = 1 To 99
Load Command1(i)
Next
End Sub
mehran901
پنج شنبه 14 شهریور 1392, 16:31 عصر
قبلا در همین بخش ، در روز های اول راه اندازی بخش ویبی 6 در این مورد بحث شده بوده :
دوستان به احتمال زیاد می دونن که چطور در حالت اجرا می توان به یک فرم کنترل اضافه کرد. با استفاده از این حالت و برای نوشتن برنامه های خاص می توان کارهای جالبی انجام داد ولی مشکل در کنترل کردن Event های این کنترل هاست که در حالت اجرا تولید میشن. من قصد دارم در کد زیر به شما نشون بدم که چطور می تونید کنترل ها رو در زمان اجرا تولید کنید و به Event های اونا بدون محدودیت تعدادشون جواب بدین.
میدونید که با استفاده از Withevents در دستور Dim میشه Event های یک Object رو هم کنترل کرد
Private WithEvents objectTemp As TextBox
ولی مسلمآ برای تعداد مشخص کنترل ها میشه اینکارو کرد و نه برای کنترلهایی که تعداد اونا نامشخص هست. برای حل این مشکل من از Subclassing استفاده کردم تا تمام پیغامهایی رو که ویندوز به کنترل می فرسته رو کنترل کنم و بعد اونا رو به پیغامهای قابل فهم برای VB تبدیل کردم. ابتدا فرض کنید کدی شبیه کد زیر دارم:
Option Explicit
Public WithEvents textboxTemp As TextBox
Dim aHwnd() As Long
Private Sub Form_Load()
'
Dim controlTemp As Control
ReDim aHwnd(1) As Long
Set controlTemp = Me.Controls.Add("VB.TextBox", "Test")
controlTemp.Visible = True
aHwnd(0) = controlTemp.hwnd
Call Hook(controlTemp.hwnd)
Call SetProp(controlTemp.hwnd, "objectPointer", ObjPtr(controlTemp))
Set controlTemp = Me.Controls.Add("VB.TextBox", "Test1")
controlTemp.Visible = True
controlTemp.Move 1000, 1000
aHwnd(0) = controlTemp.hwnd
Call Hook(controlTemp.hwnd)
Call SetProp(controlTemp.hwnd, "objectPointer", ObjPtr(controlTemp))
'
End Sub
Private Sub Form_Unload(Cancel As Integer)
'
Dim i As Byte
For i = 0 To UBound(aHwnd)
If aHwnd(i) Then
Call UnHook(aHwnd(i))
End If
Next
'
End Sub
Private Sub textboxTemp_Change()
Label1.Caption = textboxTemp.Text
End Sub
در Form_Load Event, دو تا Textbox به صورت Dynamic به VB اضافه شدن. بعد شروع به Subclassing میشن و بعد آدرس هر کنترل رو در حافظه همراه خود کنترل نگه داشته میشه. حالا فقط کافیه پیغامها رو بگیریم بعد به کنترل از طریق آدرسی که ازش نگه داشته بودیم دسترسی پیدا کنیم و پیغام ها رو به VB بسپریم.
Option Explicit
'in a module
Public Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
Public Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
'
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length) As Long
Private Const GWL_WNDPROC = -4
Private lpPrevWndProc As Long
Public Function Hook(ByVal hwnd) As Long
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, _
AddressOf WindowProc)
End Function
Public Sub UnHook(hwnd)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hw As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
WindowProc = CallWindowProc(lpPrevWndProc, hw, _
uMsg, wParam, lParam)
Dim objectTemp As Object
Call CopyMemory(objectTemp, GetProp(hw, "objectPointer"), 4)
If Not objectTemp Is Nothing Then
Set Form1.textboxTemp = objectTemp
Call CopyMemory(objectTemp, 0, 0)
End If
End Function
با استفاده از این تکنیک میتونید پروژه ها یا ActiveX ها قدرتمندی که قادر هستند در زمان اجرا کنترل به خودشون اضافه کنند و به پیفامهای اونا جواب بدن رو تولید کنید.
110204
دانلود
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.