کمک در مورد دستور keyDown

hamidahmadi

Active Member
بچه ها لطفا" اگر میتوانید یک مثال در مورد دستور keyDown برای من بزنید چون هیچ نمیدانم منظور از اینکه برای کنترل وضعیت shift می بایست عمل and را با عدد 7 انجام داد چیست.
لطفا" یک مثال زیبا با دستور select case بزنید

مرسی
 

saalek110

Well-Known Member
از:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vb98/html/vbevtkeydown.asp



کد:
Syntax

Private Sub Form_KeyDown(keycode As Integer, shift As Integer)

Private Sub object_KeyDown([index As Integer,]keycode As Integer, shift As Integer)

Private Sub Form_KeyUp(keycode As Integer, shift As Integer)

Private Sub object_KeyUp([index As Integer,]keycode As Integer, shift As Integer)
ايندكس مال زماني است كه كنترلها آرايه مي شوند فكر كنم.
مقدار keycode كه مشخصه چيه..

کد:
shift	
An integer that corresponds to the state of the SHIFT, CTRL, and ALT keys at the time of the event. The shift argument is a bit field with the least-significant bits corresponding to the SHIFT key (bit 0), the CTRL key (bit 1), and the ALT key (bit 2 ). These bits correspond to the values 1, 2, and 4, respectively. Some, all, or none of the bits can be set, indicating that some, all, or none of the keys are pressed. For example, if both CTRL and ALT are pressed, the value of shift is 6.

ايندكس يك عدد صحيح است كه نشان مي دهد كه در زمان فشردن كليد shift & alt & ctrl در چه حالتي بوده اند.
اين بيل گيتس اينجا شاهكار زده و به اين متغير سه بيت اختصاص داده . همه جا صرفه جويي را رها كرده ، اينجا آمده صرفه جويي كنه. بيت 0 براي نشان دادن حالت دكمه shift . بيت 1 براي دكمه ctrl و بيت 2 براي alt .
به ترتيب وقتي اينها فشرده باشند ، ارقام 1 و 2 و 4 به پارامتر ما اضافه ميشه. اگر هر سه فشرده باشند ، اين پارامتر مساوي 7 ميشه.

کد:
You test for a condition by first assigning each result to a temporary integer variable and then comparing shift to a bit mask. Use the And operator with the shift argument to test whether the condition is greater than 0, indicating that the modifier was pressed, as in this example:

[color=red]ShiftDown[/color] = (Shift And vbShiftMask) > 0

وقتي ما بخواهيم ببينيم كه اين پارامتر ما چي داخلشه ، با and مي فهميم.
در اينجا vbshiftmask مي تواند 3 حالت داشته باشد.

کد:
Constant--------Value--------Description	
VbShiftMask--------1--------SHIFT key bit mask.	
VbCtrlMask--------	2--------CTRL key bit mask.	
VbAltMask--------4--------ALT key bit mask.

مي دانيد كه حاصل and دو عبارت زماني درسته كه هر دو درست باشد. حالا ما مثلا مي خواهيم بفهميم كه در زمان رويداد خودمان آيا alt فشرده بوده يا نه. وقتي با 4 بياييم and كنيم و جواب true باشد، يعني اينكه (( بله alt فشرده شده بوده.)) البته اين پاراگراف از ذهن خودم بود و ترجمه نيست. ولي فكر كنم از متن بالا همين ترجمه بشه و بيرون بياد.

اين هم تركيب آنها :

کد:
In a procedure, you can test for any combination of conditions, as in this example:

If [color=red]ShiftDown[/color] And CtrlDown Then

كلمه اي را كه قرمز كردم فكر كنم همان كلمه اي است كه در بالا قرمز شده.

يك نكته جالب هم اينجا گفته كه شايد ربطي به بحث نداشته باشه:

کد:
Note   If the KeyPreview property is set to True, a form receives these events before controls on the form receive the events. Use the KeyPreview property to create global keyboard-handling routines.

فكر كنم ترجمه اش اين ميشه كه وقتي صفت KeyPreview را true كنيم فرم قبل از كنترلهاي روي فرم رويداد را مي گيره.

يك نكته مهم هم اينه كه وقتي با رويداد فشردن دكمه كار مي كنيد ممكنه با دكمه اينتر و esc و tab مشكل پيدا كنيد و اين مشكل زماني پيش ميايد كه يك كامند باتن داشته باشيم بر روي فرم و صفت ....

کد:
KeyDown and KeyUp aren't invoked for: 
The ENTER key if the form has a CommandButton control with the Default property set to True.


The ESC key if the form has a CommandButton control with the Cancel property set to True.


The TAB key.

از :
http://www.stk.com/resources/help/s...le/STKX/STKXLib~AgUiAx2DCntrl~KeyDown_EV.html



کد:
Private Sub AgUiAx2DCntrl1_KeyDown(KeyCode As Short, Shift As Short)

    If (KeyCode = vbKeyA) And ((Shift And eCtrlPressed) > 0) Then
        ' CTRL-a has been key is down!
        ...
    End If

End Sub

.
 
آخرین ویرایش:

saalek110

Well-Known Member
من ابتدا اين برنامه را امتحان كردم:

کد:
Private Sub Command1_Click()

Print vbShiftMask
Print vbCtrlMask
Print vbAltMask

End Sub

1
2
4

نتيجه اجرا را با رنگ قرمز مي بينيد.
پس دريافتم كه اين 3 كلمه كه با vb شروع مي شوند ، در حقيقت constant هستند يعني جزو ثوابت(مقدار ثابت ها) هستند.

سپس برنامه زير را آزمودم:

کد:
Private Sub Command1_Click()

Print (vbShiftMask And 1)
Print (vbShiftMask And 2)
Print (vbShiftMask And 4)
Print

Print (vbCtrlMask And 1)
Print (vbCtrlMask And 2)
Print (vbCtrlMask And 4)
Print

Print (vbAltMask And 1)
Print (vbAltMask And 2)
Print (vbAltMask And 4)

End Sub

1
0
0

0
2
0

0
0
4

نتيجه and كردن (اعداد قرمز) را ببينيد. چه قانوني بر visual basic براي and برقرار است.
اگر بخواهيم نگاهي بيتي داشته باشيم و فرض كنيم 3 خانه داريم ،
وقتي and مي كنيم هر يك از خانه ها وقتي مقدار true بيرون مي دهد كه هر دو عبارتي كه and شده اند true باشند. در اسمبلي در اين حالت 1 خواهد بود اين بيت true شده. ولي اينجا در vb نتايج 3 خانه عبارت است از : 1 و 2 و 4 .
البته مشكلي نيست . مهم اينه كه از اين اعداد درست استفاده شود.

== = == = == = ==
سپس من برنامه زير را نوشتم:

کد:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 
 Print Shift;
End Sub

بعد اجراي اين برنامه ديدم كه با زدن دكمه هاي معمولي ، 0 چاپ ميشه و با 3 دكمه مورد بحث يعني شيفت و كنترل و آلت ، به ترتيب اعداد 1 و 2و 4 چاپ ميشه.

سپس برنامه زير را نوشتم:

کد:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 
Select Case Shift
Case 0
    Print " no special key"
Case 1
      Print " shift"
Case 2
      Print " ctrl"
Case 4
      Print " alt"
Case Else
    Print "Error..."
End Select
End Sub

اين برنامه با زدن 3 كليد مورد بحث اعداد 1 و 2و 4 را چاپ مي كنه و با بقيه كليدها عدد 0 را چاپ مي كنه.

== = == = == == == = == = == == == =
ولي من همه اين تمرينها را انجام دادم تا خودم بفهمم قضيه از چه قراره و جواب شما نبود اينها.
به نظر كدي كه در انتهاي پست قبلي وجود دارد ، يعني اين:

کد:
Private Sub AgUiAx2DCntrl1_KeyDown(KeyCode As Short, Shift As Short)

    If (KeyCode = vbKeyA) And ((Shift And eCtrlPressed) > 0) Then
        ' CTRL-a has been key is down!
        ...
    End If

End Sub

مي تواند به شما راهكاري ارائه دهد تا آنچه هدف برنامه شماست به آن برسيد.
يعني با تركيب if و and كد بسازيد. شايد هم اصلا and نياز نباشه. ديگه خودتان مي دانيد بايد چكار بكنيد تا كدتان هدف شما را برآورده كند.
.
 
آخرین ویرایش:

saalek110

Well-Known Member
در ضمن پسورد خود در سايت مجيدآنلاين را براي شما با پيام خصوصي مي فرستم ، تا آموزش ويژوال بيسيك را اگر وقت كرديد كمي اصلاح و تكميل كنيد.
.
 

hamidahmadi

Active Member
آقا سالک از نظر من شما یک فرد خیلی باحال هستید چون راهکارهای شما همیشه من را در فراگیری بهتر ویژوال بیسیک به جلو می برد.
دست شما درد نکند اگر چند نفر دیگر هم مثل شما در اینجا داشتیم که میتوانستیم باهم ویژوال بیسیک را پیش ببریم واقعا" باعث افتخارمان بود.
لذت نوشته های شما همیشه باعث میشود که من در این سایت به دنبال نوشته های شما بگردم
چشم اگر توانستم قسمت آموزش ویژوال بیسیک را به جلو می برم
حیف که فقط کسی نیست که با گفتن نظریه اش من را در پیش برد این اهداف کمک کند.
 

saalek110

Well-Known Member
با سلام.
من فعلا در حال يادگيري سي و ويژوال سي هستم. از يكماه پيش.
ولي هستم در سايت و هر جا بتونم همراهي مي كنم.
وقتي ويژوال سي رسيد به جايي كه ويژوال بيسيك را رسونديم ، آنوقت مي تونم بيشتر وقت بگذارم. فعلا شما ادامه بدهيد . اگر هم پستي نمي زنيد تمرين كنيد. چون به نظر من تمرين مهمترين چيزه. من هم الان دارم برنامه هاي ساده سي را تمرين مي كنم ولي ويژوال بيسيك هم تمرين مي كنم و گاهي دنبال سورسي براش ميرم.
.
 

saalek110

Well-Known Member
من امروز يا بهتر بگم امشب يه سايتي را داشتم مي خوندم فهميدم اون and با 7 براي چيه.
همان طور كه مي دانيد and مثل فيلتر عمل مي كنه. 7 يعني اجازه عبور به كانال 1 و 2و 4 داده بشه. و علت and كردن با 7 در برنامه شما شايد اين بوده كه مثلا كانال 8 و 16 و ... اجازه عبور داده نشه.
من اين را در :
http://www.geocities.com/rk_page/
خواندم كه البته مربوط به سي است ولي فكر كنم مشابه باشه با قضيه ما.
موفق و مويد باشيد.
.
 

جدیدترین ارسال ها

بالا