سلام:
چجوی میشه با کلید Enter از Edite1 به Edite2 و از Edite2 به button1 رفت.
سلام:
چجوی میشه با کلید Enter از Edite1 به Edite2 و از Edite2 به button1 رفت.
سلام.
در رویداد OnKeyPress روی کنترل مورد نظرتون SetFocus کنید.
آخرین ویرایش به وسیله یوسف زالی : شنبه 01 مرداد 1390 در 12:51 عصر
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
متشکرم از راهنمایی تون
من این کار رو انجام دادم ولی من فقط می تونم یک حرف رو تو Edit مبدا بنویسم و به محض نوشتن یک حرف به Edit مقصد پرش می کنه
ولی من می خوام وقتی تو Edit مبدا کل اطلاعاتم رو نوشتم بعدا با زدن Enter اشار گر به Edit مقصد پرش کنه.
تو رویداد OnKeyDown به صورت زیر باید بررسی کنی وقتی Enter زده شد به Edit مورد نظر فکوس کنی :
if Key = vk_Enter then
Edit2.SetFocus;
من کار رو انجام دادم ولی رو vk_Enter خطا می گیره!
احتمالا در KeyPress گذاشتید.
در KeyPress باید 13# بگذارید.
در KeyDown باید 13 بگذارید (یا همون VK_RETURN)
دوستمون اشتباهی گفتند VK_ENTER
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
از این کد هم میتونید استفاده کنید.
در رویداد onkeypress :
if (key=#13) then
begin
Key := #0;
Perform (CM_DialogKey, VK_TAB, 0);
end;
اینطوری عملکرد enter مثل Tab میشه.
به جاش بنویسید 13من کار رو انجام دادم ولی رو vk_Enter خطا می گیره
سلام
من این پست رو خوندم ، یه سوال تو ذهنم بود که نتونستم جوابشو پیدا کنم، گفتم شاید دوستان بتونن کمک کنن:
ودر KeyPress باید 13# بگذارید.
در KeyDown باید 13 بگذارید (یا همون VK_RETURN)
حالا اگر من بخوام تو رویداد KeyDown همین کد رو بنویسم به جای Key := #0 چی باید بزارماز این کد هم میتونید استفاده کنید.
در رویداد onkeypress :
if (key=#13) then
begin
Key := #0;
Perform (CM_DialogKey, VK_TAB, 0);
end;
اینطوری عملکرد enter مثل Tab میشه.
if (key=VK_RETURN) then
begin
؟؟؟؟؟؟؟؟؟؟؟
end;
و چرا کد زیر همون کار رو نمیکنه؟
چون من از کد بالا برای شبیه سازی tab استفاده کردم که روی ادیت دینگ دینگ میکرد که با کد Key := #0 درست شد
حالا برای دکمه میخوام توی KeyDown همون کار رو بکنم که نمیشه و دینگ دینگ میکنه
if (key=13) then
begin
Key := 0;
end;
سلام به همه دوستان و برنامه نویسان زیان شیرین دلفی
من یه راه خیلی ساده و کلی براتون میگم :
خاصیت 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 تو کد بالا .
موفق و پیروز و سربلند باشید .
دوست عزیز باید در رویداد 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;
این دستور رو من خودم تو برنامه هام استفاده میکنم و کاملا درست عمل میکنه.
آخرین ویرایش به وسیله سيد مجتبي هاشمي : دوشنبه 10 مرداد 1390 در 10:32 صبح دلیل: تصحیح کد
دوستان این فقط برا این بود که بریم به کنترل بعدی
اما اگر بخواهیم با کلید بالا برگرده به کنترل قبلی چه کدی باید در keypress نوشته بشه؟
دوست من اینهمه راهنمایی کردند دوستان چی بود پس؟
خب کمی تلاش کن هر جا نتونستی در خدمتیم.
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
چشم دوست عزیز
حرف شما کاملا درسته.
راستش من برا رفتن به کنترل بعدی از این کد استفاده می کردم قبلا
if Key = #13 then
Self.Perform(WM_NEXTDLGCTL, 0, 0)
ولی صدای دینگ میداد که با راهنمایی دوستان درستش کردم.
خوب برا رفتن به کنترل قبل هم میشه کنترل قبلیش رو set focus کرد. ولی می خوام که برا همه ی edit ها تعریف نکنیم تا set focus بره رو کنترل قبلی. شاید صد تا edit داشتیم.
خواستم ببینم تو دلفی تابعی وجود نداره که خودش این کارو کامل انجام بده و با هر بار کلید بالا که زده میشه یا هر کلیدی که براش تعریف کنیم یکی از taborder کم کنه و در نتیجه بره کنترل قبلی و قبلی و قبلی و ....
اگر نظرتون این موردی هست که اشاره کردید پیاده کردنش کار چند دقیقه هست ولی سناریو شما مشکل داره ، مثلا الان من روی Edit شماره 23 هستم حالا با موس روی Edit شماره 70 کلیک میکنم و بعد دکمه مورد نظر شما رو فشار میدم تا به کنترل قبل برم ، بر اساس سناریو شما یکی از Tab Order کم میکنیم که میشه 69 و روی Edit شماره 69 فکوس میکنیم در صورتی که شماره Edit قبلی ما 23 بود !خواستم ببینم تو دلفی تابعی وجود نداره که خودش این کارو کامل انجام بده و با هر بار کلید بالا که زده میشه یا هر کلیدی که براش تعریف کنیم یکی از taborder کم کنه و در نتیجه بره کنترل قبلی و قبلی و قبلی و ....
خوب درست میگین. خوب یه راهنمایی می کردید:p
خوب باید آدرس آخرین فکوس رو پیدا کنیم.
تو keypress تعریف کنیم که اگه کلید بالا زده شد برو به آخرین فکوس قبلی
یه رویدادی هت به نام focused
از اون نمیشه استفاده کرد.
چون ب گذشته اشارهمیکنه فکر کردم شاید آدرس آخرین فکوس رو بهمون میده
در قسمت Private کلاس فرمتون متغییر های ActiveControl و PreviousControl را به صورت زیر تعریف کنید :خوب درست میگین. خوب یه راهنمایی می کردید:p
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 داشتن بر نمیگردید ، برای اون کار هم میتونید همین پیاده سازی رو داخل یک پشته انجام بدید .
سلام
میدونم این پاسخ خیلی دیره اما شاید جوابم به این پست به درد کسی بخوره.
در قسمت 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 تغییر بدین.
پیروز باشید.