PDA

View Full Version : سوال: رویداد برای فشردن دکمه



joooje
چهارشنبه 04 اسفند 1389, 22:34 عصر
سلام
چطور میتونم هر وقت کاربر تو برنامه دکمه های
Tab
Alt+S
num9
رو زد من متوجه بشم ( هر کدوم رو حدا میخوام نه همزمان)
ممنون

AliReza Vafakhah
چهارشنبه 04 اسفند 1389, 22:58 عصر
از ActionList استفاده کنید و در قسمت ShortCut کلیدهای مربوطه را مقداردهی کنید.

joooje
جمعه 06 اسفند 1389, 14:52 عصر
ممنون
این راه رو امتحان کردم. یعنی تو فروم جستجو کرده بودم و همین راه رو پیدا کرده بودم
ولی نمیتونم از این روش استفاده کنم.
آیا روش دیگری وجود داره
مثلا بشه یه تایمر ساخت یا...
ممنون میشم اگر کسی راه دیگه ای داره کمک کنه

vcldeveloper
جمعه 06 اسفند 1389, 20:22 عصر
چطور میتونم هر وقت کاربر تو برنامه دکمه های ...
می تونید...
1- خصوصیت KeyPreview فرم (های) مورد نظرتان را True کنید، و برای رویدادهای OnKeyDown یا OnKeyPress آن کد بنویسید.
2- یک تابع Hook به صورت Local برای برنامه خودتان بنویسید که تمامی کارکترهای ارسالی از کیبورد برای برنامه شما را دریافت کنه.

joooje
شنبه 07 اسفند 1389, 18:35 عصر
سلام
ممنون مشکلم حل شد ولی یه مشکل دیگه بوجود اومد
الان وقتی tab رو میزنم هم اون کاری که بهش دادم رو انجام میده هم select رو از یه ادیت به دکمه ی بعدی و ... تا آخر میپرونه
در حقیقت همون کار اصلی tab رو هم داره همزمان انجام میده
چطور میتونم این کار رو از tab بگیرم ولی به طور کلی حذفش نکم، مثلا بدمش به یه دکمه توی صفحه که با کلیک روی اون کار tab شبیه سازی بشه
یعنی select رو به ترتیب شماره های tab توی پنجره تغییر بده
ممنون از راهنماییتون

loo30fer
شنبه 07 اسفند 1389, 19:12 عصر
شما اگه میخواین مثلا وقتی روی دکمه کلیک میکنید Edit سومی رو فوکوس کنید با شبیه سازی TAB میتونید اون دستور رو داخل حلقه بندازین که سه بار دستور فشردن TAB رو اجرا کنه البته این رو هم بگم که Edit رو که اول میسازین با یکبار فشرده شدن و Edit رو که سومین بار ساختین با سه بار فشرده شدن Focus میگیره ضمنا اگه این دستور رو داخل Timer بندازین و اجراش کنید ممکنه به درستی عمل نکنه چون شاید کاربر قبلا از اجرا شدن دستور شما Edit اولی رو انتخاب (Focus) کرده باشه و به جای اینکه Edit اولی رو فوکوس کنه Edit دومی فوکوس میگره برای جل اینکار هم باید قبل از شبیه سازی Focus رو روی یک شی بندازین و بر اساس اون تعداد فشرده شدن TAB رو اجرا کنید اگه شما نمیخواین این عمل رو تو برنامه های دیگه یا پلاگین انجام بدین و هدف شبیه سازی رو ندارین میتونید براحتی با دستور Edit1.SetFocus اینکار انجام بدین

For I:=1 to 3 do
begin
Keybd_event(VK_TAB,1,0,0);
Keybd_event(VK_TAB,1,Keyeventf_KeyUP,0);
end;
end;

joooje
دوشنبه 09 اسفند 1389, 09:35 صبح
ممنون
ولی من نمیخوام تب رو شبیه سازی بکنم
میخوام این خاصیت رو از دکمه تب بگیرم و به یه دکمه توی صفحه برنامه بدم
کسی میتونه راهنمایی کنه

joooje
چهارشنبه 11 اسفند 1389, 14:09 عصر
کسی کمکی نمیکنه!!!

Felony
چهارشنبه 11 اسفند 1389, 15:07 عصر
ممنون
ولی من نمیخوام تب رو شبیه سازی بکنم
میخوام این خاصیت رو از دکمه تب بگیرم و به یه دکمه توی صفحه برنامه بدم
کسی میتونه راهنمایی کنه
باید برای پیغام CM_DialogKey یک Message Handler بنویسید و فشار داده شدن کلید Tab رو بررسی کنید ، اگر Tab زده شد قبل از اینکه Message Handler اصلی برنامه پردازشش کنه 0 کنیدش تا اثری رو برنامه نزاره ، براش تغییر کاربرد یک کلید به عنوان Tab هم تو همون Message Handler ی که نوشتید کلید مورد نظر رو بررسی میکنید و اگر فشار داده شد یا کلید Tab رو به عنوان خروجی تحویل Message Handler اصلی برنامه میدید یا اینکه توسط تابع SelectNext و ActiveControl کنترل جاری رو به دست میارید و فکوس رو به کنترل بعدی که Tab Order داره میدید ؛ یک نمونه کد براتون نوشتم :

Message Handler پیغام DialogKey رو به صورت زیر در بخش Private کلاس فرم برنامتون تعریف کنید :

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
private
{ Private declarations }
procedure CMDialogKey(Var Msg: TWMKey) ; message CM_DIALOGKEY;
public
{ Public declarations }
end;

و به صورت زیر کد Message Handler رو بنویسید :

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
// Cancel tab key
if Msg.Charcode = VK_TAB then
Msg.Result:= 0;
// If Enter key pressed then focus on next control ( like Tab )
if Msg.CharCode= VK_Return then
SelectNext(ActiveControl, True, True);
end;

joooje
پنج شنبه 12 اسفند 1389, 21:36 عصر
سلام
ممنون مشکل حل شد
فقط دوتا سوال دیگه دارم ممنون میشم راهنماییم کنید.
1- الان وقتی روی editbox هستم و tab رو میزنم صدای دینگ میده.آیا میشه این رو حذف کرد؟
2- آیا میشه خارج از ترتیب taborder که برای هر شیء داده شده، یه شیء مورد نظر را انتخاب کرد.
مثلا با زدن یه دکمه توی صفحه ، checkbox یا combobox یا هر شیء دلخواه دیگه ای select بشه.
بازم ممنون

Felony
شنبه 06 فروردین 1390, 08:22 صبح
1- الان وقتی روی editbox هستم و tab رو میزنم صدای دینگ میده.آیا میشه این رو حذف کرد؟
برای حذف صدا باید مقدار Result رو با -1 مقداردهی کنید ، یعنی کد مربوط به Message Handler به صورت زیر باید تغییر کنه :

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
// Cancel tab key
if Msg.Charcode = VK_TAB then
Msg.Result:= -1;
// If Enter key pressed then focus on next control ( like Tab )
if Msg.CharCode= VK_Return then
SelectNext(ActiveControl, True, True);
end;


2- آیا میشه خارج از ترتیب taborder که برای هر شیء داده شده، یه شیء مورد نظر را انتخاب کرد.
میتونی از متد SetFocus شئ مورد نظر استفاده کنی .