View Full Version : سوال: حرکت کردن از یک Edit به Edite با کلید Enter
hasandrw
شنبه 01 مرداد 1390, 11:12 صبح
سلام:
چجوی میشه با کلید Enter از Edite1 به Edite2 و از Edite2 به button1 رفت.
یوسف زالی
شنبه 01 مرداد 1390, 11:38 صبح
سلام.
در رویداد OnKeyPress روی کنترل مورد نظرتون SetFocus کنید.
hasandrw
شنبه 01 مرداد 1390, 18:15 عصر
متشکرم از راهنمایی تون
hasandrw
یک شنبه 02 مرداد 1390, 23:20 عصر
من این کار رو انجام دادم ولی من فقط می تونم یک حرف رو تو Edit مبدا بنویسم و به محض نوشتن یک حرف به Edit مقصد پرش می کنه
ولی من می خوام وقتی تو Edit مبدا کل اطلاعاتم رو نوشتم بعدا با زدن Enter اشار گر به Edit مقصد پرش کنه.
Felony
یک شنبه 02 مرداد 1390, 23:25 عصر
تو رویداد OnKeyDown به صورت زیر باید بررسی کنی وقتی Enter زده شد به Edit مورد نظر فکوس کنی :
if Key = vk_Enter then
Edit2.SetFocus;
hasandrw
سه شنبه 04 مرداد 1390, 10:23 صبح
من کار رو انجام دادم ولی رو vk_Enter خطا می گیره!
mohsen_r
سه شنبه 04 مرداد 1390, 10:32 صبح
من کار رو انجام دادم ولی رو vk_Enter خطا می گیره!
دستوره درسته
به جاي vk_Enter بنويس 13
يا در رویداد OnKeyPress بنويس if key=#13 then edit2.SetFocus
یوسف زالی
سه شنبه 04 مرداد 1390, 10:59 صبح
احتمالا در KeyPress گذاشتید.
در KeyPress باید 13# بگذارید.
در KeyDown باید 13 بگذارید (یا همون VK_RETURN)
دوستمون اشتباهی گفتند VK_ENTER
mahsara
سه شنبه 04 مرداد 1390, 11:16 صبح
از این کد هم میتونید استفاده کنید.
در رویداد onkeypress :
if (key=#13) then
begin
Key := #0;
Perform (CM_DialogKey, VK_TAB, 0);
end;
اینطوری عملکرد enter مثل Tab میشه.
mohsen_r
سه شنبه 04 مرداد 1390, 12:04 عصر
از این کد هم میتونید استفاده کنید.
در رویداد onkeypress :
if (key=#13) then
begin
Key := #0;
Perform (CM_DialogKey, VK_TAB, 0);
end;
اینطوری عملکرد enter مثل Tab میشه.
فقط يه مشكل كوچولو داره حتما" بايد taborder ها به ترتيب باشه
Felony
سه شنبه 04 مرداد 1390, 14:00 عصر
من کار رو انجام دادم ولی رو vk_Enter خطا می گیره!
VK_Return ...
tdkhakpur
سه شنبه 04 مرداد 1390, 14:21 عصر
من کار رو انجام دادم ولی رو vk_Enter خطا می گیره
به جاش بنویسید 13
joooje
چهارشنبه 05 مرداد 1390, 17:41 عصر
سلام
من این پست رو خوندم ، یه سوال تو ذهنم بود که نتونستم جوابشو پیدا کنم، گفتم شاید دوستان بتونن کمک کنن:
در KeyPress باید 13# بگذارید.
در KeyDown باید 13 بگذارید (یا همون VK_RETURN)
و
از این کد هم میتونید استفاده کنید.
در رویداد onkeypress :
if (key=#13) then
begin
Key := #0;
Perform (CM_DialogKey, VK_TAB, 0);
end;
اینطوری عملکرد enter مثل Tab میشه.
حالا اگر من بخوام تو رویداد KeyDown همین کد رو بنویسم به جای Key := #0 چی باید بزارم
if (key=VK_RETURN) then
begin
؟؟؟؟؟؟؟؟؟؟؟
end;
و چرا کد زیر همون کار رو نمیکنه؟
چون من از کد بالا برای شبیه سازی tab استفاده کردم که روی ادیت دینگ دینگ میکرد که با کد Key := #0 درست شد
حالا برای دکمه میخوام توی KeyDown همون کار رو بکنم که نمیشه و دینگ دینگ میکنه
if (key=13) then
begin
Key := 0;
end;
MohsenB
چهارشنبه 05 مرداد 1390, 22:45 عصر
سلام به همه دوستان و برنامه نویسان زیان شیرین دلفی
من یه راه خیلی ساده و کلی براتون میگم :
خاصیت KeyPreview از فرم رو به True تغییر بدین و فقط کد زیر رو تو رویداد KeyPress از فرم بذارین . دیگه هیچ جای دیگه هیچ کدی نمیخواد :
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key= #13 then begin
keybd_event(VK_TAB,1,0,0);
keybd_event(VK_TAB,1,KEYEVENTF_KEYUP,0);
Key:= #0;
end;
end;
فقط توضیح یا نکتش اینه که باید TabOrder کنترل ها رو به همون ترتیبی شماره گذاری کنید که می خواید .
اگه یه جاهایی با این کد به علت گرفتن عمومی اینتر مشکل دارین بگین براتون یه روش کلی دیگه بگم .
در جواب پست قبلی هم بگم که شما باید کلید اینتری که فشار داده شده رو خنثی کنید تا صدا نکنه مثل کد Key:= #0 تو کد بالا .
موفق و پیروز و سربلند باشید .
سيد مجتبي هاشمي
یک شنبه 09 مرداد 1390, 08:27 صبح
دوست عزیز باید در رویداد On key perss مربوط به Edit مورد نظرت دستور زیر رو بنویسی. مثلا اگه بخوای از Edit1 به Edit2 بری به شکل زیر هست.
if key = char(VK_Return) then
begin
Edit2.setfocuse;
end;
این یعنی اینکه اگه کلید فشار داده شده کلید اینتر بود روی Edit2 قرار بگیره. تازه میتونی به جای دستور Edit2.setfocuse هر دستور دیگه ای هم بنویسی یا تعداد دستوراتت رو بشتر بکنی. مثلا اگه Edit2 غیر فعال باشه کد رو میتونی به شکل زیر بنویسی.
if key = char(VK_Return) then
begin
Edit2.Enable := True;
Edit2.setfocuse;
end;
این دستور رو من خودم تو برنامه هام استفاده میکنم و کاملا درست عمل میکنه.
hsn_abieteh
یک شنبه 09 مرداد 1390, 15:59 عصر
دوستان این فقط برا این بود که بریم به کنترل بعدی
اما اگر بخواهیم با کلید بالا برگرده به کنترل قبلی چه کدی باید در keypress نوشته بشه؟
یوسف زالی
یک شنبه 09 مرداد 1390, 16:37 عصر
دوست من اینهمه راهنمایی کردند دوستان چی بود پس؟
خب کمی تلاش کن هر جا نتونستی در خدمتیم.
hsn_abieteh
یک شنبه 09 مرداد 1390, 17:13 عصر
چشم دوست عزیز
حرف شما کاملا درسته.
راستش من برا رفتن به کنترل بعدی از این کد استفاده می کردم قبلا
if Key = #13 then
Self.Perform(WM_NEXTDLGCTL, 0, 0)
ولی صدای دینگ میداد که با راهنمایی دوستان درستش کردم.
خوب برا رفتن به کنترل قبل هم میشه کنترل قبلیش رو set focus کرد. ولی می خوام که برا همه ی edit ها تعریف نکنیم تا set focus بره رو کنترل قبلی. شاید صد تا edit داشتیم.
خواستم ببینم تو دلفی تابعی وجود نداره که خودش این کارو کامل انجام بده و با هر بار کلید بالا که زده میشه یا هر کلیدی که براش تعریف کنیم یکی از taborder کم کنه و در نتیجه بره کنترل قبلی و قبلی و قبلی و ....
Felony
یک شنبه 09 مرداد 1390, 17:27 عصر
خواستم ببینم تو دلفی تابعی وجود نداره که خودش این کارو کامل انجام بده و با هر بار کلید بالا که زده میشه یا هر کلیدی که براش تعریف کنیم یکی از taborder کم کنه و در نتیجه بره کنترل قبلی و قبلی و قبلی و ....
اگر نظرتون این موردی هست که اشاره کردید پیاده کردنش کار چند دقیقه هست ولی سناریو شما مشکل داره ، مثلا الان من روی Edit شماره 23 هستم حالا با موس روی Edit شماره 70 کلیک میکنم و بعد دکمه مورد نظر شما رو فشار میدم تا به کنترل قبل برم ، بر اساس سناریو شما یکی از Tab Order کم میکنیم که میشه 69 و روی Edit شماره 69 فکوس میکنیم در صورتی که شماره Edit قبلی ما 23 بود !
hsn_abieteh
یک شنبه 09 مرداد 1390, 18:18 عصر
اگر نظرتون این موردی هست که اشاره کردید پیاده کردنش کار چند دقیقه هست ولی سناریو شما مشکل داره ، مثلا الان من روی Edit شماره 23 هستم حالا با موس روی Edit شماره 70 کلیک میکنم و بعد دکمه مورد نظر شما رو فشار میدم تا به کنترل قبل برم ، بر اساس سناریو شما یکی از Tab Order کم میکنیم که میشه 69 و روی Edit شماره 69 فکوس میکنیم در صورتی که شماره Edit قبلی ما 23 بود !
خوب درست میگین. خوب یه راهنمایی می کردید:p
خوب باید آدرس آخرین فکوس رو پیدا کنیم.
تو keypress تعریف کنیم که اگه کلید بالا زده شد برو به آخرین فکوس قبلی
یه رویدادی هت به نام focused
از اون نمیشه استفاده کرد.
چون ب گذشته اشارهمیکنه فکر کردم شاید آدرس آخرین فکوس رو بهمون میده
Felony
یک شنبه 09 مرداد 1390, 18:33 عصر
خوب درست میگین. خوب یه راهنمایی می کردید:p
در قسمت Private کلاس فرمتون متغییر های ActiveControl و PreviousControl را به صورت زیر تعریف کنید :
ActiveControl, PreviousControl: TWinControl;
و در قسمت Public کلاس فرمتون تابع ActiveControlChanged را به صورت زیر اعلان کنید :
procedure ActiveControlChanged(Sender: TObject);
و به صورت زیر تعریفش کنید :
procedure TForm1.ActiveControlChanged(Sender: TObject);
begin
PreviousControl := ActiveControl;
ActiveControl := Self.ActiveControl;
end;
حالا در رویداد OnCreate فرم برنامتون تابعی که نوشتید رو به رویداد OnActiveControlChange اختصاص بدید :
Screen.OnActiveControlChange := ActiveControlChanged;
حالا شئ PreviousControl حاوی شئ قبلی که Focus رو در اختیار داشته هست و میتونید مثلا به صورت زیر ازش استفاده کنید :
if Key = VK_UP then
PreviousControl.SetFocus;
این نمونه که براتون نوشتم فقط میتونه 1 کنترل رو در حافظه نگه داری کنه ، یعنی مثلا با 2 بار زدن کلید Up به 2 کنترل قبلی که Focus داشتن بر نمیگردید ، برای اون کار هم میتونید همین پیاده سازی رو داخل یک پشته انجام بدید .
سيد مجتبي هاشمي
دوشنبه 10 مرداد 1390, 10:46 صبح
راستش من برا رفتن به کنترل بعدی از این کد استفاده می کردم
if Key = #13 then
Self.Perform(WM_NEXTDLGCTL, 0, 0)
ولی صدای دینگ میداد که با راهنمایی دوستان درستش کردم.
ببخشید دوست عزیز این مشکل رو چه طور حل کردین؟ من هم بعضی مواقع که از کدی که براتون نوشتم استفاده میکنم یه صدای دینگ میده.
لطفا راهنمایی کنید چیکار کنم که این مشکل حل بشه.
MohsenB
دوشنبه 10 مرداد 1390, 14:22 عصر
ببخشید دوست عزیز این مشکل رو چه طور حل کردین؟ من هم بعضی مواقع که از کدی که براتون نوشتم استفاده میکنم یه صدای دینگ میده.
لطفا راهنمایی کنید چیکار کنم که این مشکل حل بشه.
تو پست 14 توضیح داده شد .
jaihoni
جمعه 08 دی 1396, 19:20 عصر
سلام
میدونم این پاسخ خیلی دیره اما شاید جوابم به این پست به درد کسی بخوره.
در قسمت type فرم مربوط این procedure رو اضافه کنید :
procedure EditEnterKeyPress(Sender: TObject; var Key: Char);
و در قسمت متغیر های فرم متغیر خودتون رو تعریف کنید:
var
EditEnter:TEdit;
حالاprocedure رو که تعریف کردبن کدش رو در Unit مربوط وارد کنید:
procedure TMyForm.EditEnterKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then key := #0;
end;
این کد رو هم باید در قسمت OnKeyDown فرم خودتون وارد کنید :
procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);var
ACtrl: TWinControl;
k: TKeyPressEvent;
begin
if key = 13 then
begin
ACtrl := ActiveControl;
if ACtrl is TEdit then
begin
if assigned(TEdit(ACtrl).onKeyPress) then
k:= TEdit(ACtrl).OnKeyPress;
TEdit(ACtrl).OnKeyPress := EditEnterKeyPress;
end;
repeat
ACtrl:= FindNextControl(ACtrl,true,true,false);
until (ACtrl is TCustomEdit) or
(ACtrl is TCustomComboBox) or
(ACtrl is TCustomListBox) or
(ACtrl is TCustomCheckBox) or
(ACtrl is TRadioButton);
if ACtrl is TEdit then
begin
if assigned(K) then
TEdit(ACtrl).OnKeyPress:=EditEnter.OnKeyPress;
end;
ACtrl.SetFocus ;
end;
end;
حتما فراموش نکنید که
خاصیت KeyPreview فرم رو به True تغییر بدین.
پیروز باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.