برگزیده های پرشین تولز

مشکل با رویداد KeyDown

hamid_80386

Registered User
تاریخ عضویت
28 فوریه 2007
نوشته‌ها
46
لایک‌ها
0
بازم سلام

کد زیر رو یه نگاه بندازید:
کد:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 2 And KeyCode = vbKeyReturn Then MsgBox "Hamid3"


End Sub


من تو برنامه یه TextBox هم دارم که وقتی رویداد KeyDown فرم اجرا میشه فوکوس روی اون TextBox هست، و نمیخوام هم از اون خارج بشه،

وقتی کلیدCtrl+ Enter زده میشه، رویداد KeyDown فرم اجرا میشه و پیغام Hamid3 چاپ میشه.

تا اینجاش درست، اما مشکل اینه که بعد از چاپ Hamid3 کلید Enter برای TextBox هم عمل میکنه و متن به یک سطر بعد میره، من میخوام این اتفاق نیفته،

البته با برنامه نویسی میشه پروسیجری نوشت تا این اتفاق رو Back کنه، ولی مشکل اینه که من تو فرم TextBox زیاد دارم و باید شروط زیادی برای این کار بذارم،

ولی همش بنظرم یه کار اصولی تر وجود داره.... ؟؟؟؟
 

erroring

Registered User
تاریخ عضویت
4 دسامبر 2006
نوشته‌ها
297
لایک‌ها
2
محل سکونت
PDC (Parvazeh Developing Center)
من اينكارو كردم درست شد ببين بدردت مي خوره (روش مناسبي نيست اما جواب ميده)
کد:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 2 And KeyCode = vbKeyReturn Then
MsgBox "Hamid3"
VBA.SendKeys "{backspace}"
End If
End Sub
 

hamid_80386

Registered User
تاریخ عضویت
28 فوریه 2007
نوشته‌ها
46
لایک‌ها
0
من اينكارو كردم درست شد ببين بدردت مي خوره (روش مناسبي نيست اما جواب ميده)
کد:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 2 And KeyCode = vbKeyReturn Then
MsgBox "Hamid3"
VBA.SendKeys "{backspace}"
End If
End Sub

از توجه تون خیلی ممنون، بله خودم هم یه همچین چیزی تو نظرم بود، منتها شما خیلی ساده تر از اون چیزی که من تو نظرم بود عمل کردی، که کارم راحت تر شد، خیلی ممنون.

ولی میخواستم ببینم یعنی ویژوال بیسیک به این گله گندگی یه راه حل اصولی برای حل این مشکل نداره؟
 

erroring

Registered User
تاریخ عضویت
4 دسامبر 2006
نوشته‌ها
297
لایک‌ها
2
محل سکونت
PDC (Parvazeh Developing Center)
واسه رويداد Keypress هست ولي واسه Keydown خير. واسه Keypress مقدار keyascii رو كه صفر كني خودش كليد رو كنسل ميك نه.
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
خب این منطقیه چون فکوس روی textboxه اینتر میخوره. مگر اینکه قبلش disableش کنی یا فکوس رو از روش ورداری.
 

erroring

Registered User
تاریخ عضویت
4 دسامبر 2006
نوشته‌ها
297
لایک‌ها
2
محل سکونت
PDC (Parvazeh Developing Center)
يه كار ديگه بكن ببين اونطوري هم كار مي كنه؟ تو رويداد keypress چك كن اگه كليد enter (كد 13) فشرده شد بعد keyascii رو صفر كن. شايد اينم جواب بده.
 

hamid_80386

Registered User
تاریخ عضویت
28 فوریه 2007
نوشته‌ها
46
لایک‌ها
0
خب این منطقیه چون فکوس روی textboxه اینتر میخوره. مگر اینکه قبلش disableش کنی یا فکوس رو از روش ورداری.

خاصیت KeyPreview فرم روشنه، یعنی موقعی که یه کلید زده میشه اول رویداد KeyPress فرم انجام میشه، دیگه بعد از اون هم که Disable کردن TextBox بدرد نمیخوره.

اگه تو خود رویداد KeyPress فرم هم TextBox رو Disable کنیم که باز باید تو همون رویداد هم Enableش کنیم.
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
مشکل شما بیشتر منطقیه تا کد نویسی :D خودتون رو بذارید جای ویبی. اگر فکوس روی تکست باکس باشه مسلما هر کاراکتری فشرده بشه چه حالا KeyPreview روشن باشه یا نه، به تکست باکس فرستاده میشه. فکر میکنم تنها راه Hook کردن کیبرده، و در اون حالتم باز ویبی کار خودش رو میکنه مگر اینکه توی هوک تمام کنترل کیبورد رو در دست بگیرید!
/
اصلا این برنامه برای چی هست؟ نمیشه label استفاده کرد؟
 

hamid_80386

Registered User
تاریخ عضویت
28 فوریه 2007
نوشته‌ها
46
لایک‌ها
0
مشکل شما بیشتر منطقیه تا کد نویسی :D خودتون رو بذارید جای ویبی. اگر فکوس روی تکست باکس باشه مسلما هر کاراکتری فشرده بشه چه حالا KeyPreview روشن باشه یا نه، به تکست باکس فرستاده میشه. فکر میکنم تنها راه Hook کردن کیبرده، و در اون حالتم باز ویبی کار خودش رو میکنه مگر اینکه توی هوک تمام کنترل کیبورد رو در دست بگیرید!
/
اصلا این برنامه برای چی هست؟ نمیشه label استفاده کرد؟

یه پروژه ساده ست، ولی نه نمیشه از Label استفاده کرد،

آخه درسته منطقی هست، ولی خب این یه معضل هم هست، وی بی میتونست این مساله رو هم در نظر بگیره، مثلا مثل خاصیت KeyPreview که واسه فرم گذاشته، یه خاصیت اینطوری هم واسه کنترل هیی مثل TextBox میذاشت با یه مقدار True , False که مثلا اگه کلید فشرده شده، در رویداد KeyPress فرم و یا حتی خود اون کنترل وجود داشت، دیگه اون کاراکتر روی کنترل عمل نکنه.

بعدم من الان فقط روی Ctrl + Enter , Ctrl+ Space مشکل دارم، ولی مثلا وقتی Ctrl + S رو میزنم مشکلی پیش نمیآد:(
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
خوب تکست باکسو برای همین ساختن دیگه :D برای ورود اطلاعات... حالا اگر بخواین همچین قابلیتی رو بسازی باید خودت یه ActiveX بسازی که کار textbox رو انجام بده و قبلش eventی بسازی که کنترل کنه و امکان رد کاراکتر رو بده. بازم پیشنهاد میکنم یا از لیبل استفاده کنی یا روش برنامه رو تغییر بدی. راحتترین کار همینه. وگرنه باید کیبرد رو هوک کنی... http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp
 

erroring

Registered User
تاریخ عضویت
4 دسامبر 2006
نوشته‌ها
297
لایک‌ها
2
محل سکونت
PDC (Parvazeh Developing Center)
اينم برنامه كامل كه هردو رو برات درست ميكنه يعني وقتي اون دوتا دكمه زده شد چيزي نوشته نميشه.
يه فرم بساز و اين كد رو تو بخش كدش كپي كن.
کد:
Dim IsCTSpace As Boolean
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 10 Or IsCTSpace = True Then
KeyAscii = 0
End If
IsCTSpace = False
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 2 And KeyCode = vbKeyReturn Then
Me.Caption = "Ctrl + Enter"
End If
If Shift = 2 And KeyCode = vbKeySpace Then
IsCTSpace = True
Me.Caption = "Ctrl + Space"
End If
End Sub
 

hamid_80386

Registered User
تاریخ عضویت
28 فوریه 2007
نوشته‌ها
46
لایک‌ها
0
دستت درد نکنه ، خیلی ممنون

شیوه باحالیه
 

erroring

Registered User
تاریخ عضویت
4 دسامبر 2006
نوشته‌ها
297
لایک‌ها
2
محل سکونت
PDC (Parvazeh Developing Center)
فقط يه مشكل داره تو بخشي كه كد رو چك مي كنه نبايد از msgbox و يا هرچي كه focus رو از textbox ميگيره استفاده كني.
 
بالا