enter vmesto Tab

13 отговора 393 прегледа
#1

enter vmesto Tab

може ли никой да ми каже как да минавам м/у editbox-oвете с enter вместо с tab..опитах разни работи от рода на долния пример..ама не става.. 10x :

procedure TKEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (Key=Key_Return) or (key=Key_Enter) then
begin
key:=Key_Tab ;
end;

end;

end.


Отговор
в отговор на koko #2

Re: enter vmesto Tab

едно решение:

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key = 13 then begin
self.FindNextControl(Edit1, true, true, true).SetFocus;
end;
end;

така написано върти ВСИЧКИ контроли, трябва да се дооправи ако искаш само TEdit-и
подлежи на оптимизация - вместо да се вика тоя готов метод, който ВСЕКИ ПЪТ прави СОРТИРАН по TabOrder лист, може да си направиш кеширане, на Form.Create, например, в ObjectList който пази необходимата информация /вкл. и филтрирането само на определени типове/ в сортиран и подходящ за логаритмуване вид :-)

ПС: Мхм, и огледай какво става с контроли, на които Parent е нещо друго, а не Form1...

--------------------------------------
Започва Път от моят праг...
Отговор
в отговор на Hateras #3

Re: enter vmesto Tab

мерси за отговора..
оба4е ..то това не работи в(или SelectNext).. в когато са в компонент(..и незнам защо ).. а то целта е този код да роботи в компонента TKEdit ..(и то на CLX..)...
ako имаш няква идея .. ще съм ти много задължен..

Отговор
в отговор на koko #4

Re: enter vmesto Tab

Виж KeyPreview на формата ти. Трябва да е True. И сложи този евент на самата форма, а не на някой (всичките) контроли....

Редактирано от andrew_nikoloff на

Отговор
в отговор на andrew_nikoloff #5

Re: enter vmesto Tab

:) опитах..ама не ще..
KeyPreview = True

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
SelectNext(self,true,true);
end;


ако в контрола.(да ре4ем TEdit)..
например..

procedure TForm1.KEdit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
SelectNext(sender as TWidgetControl,true,true)
end;

така работи....( неговата мама)....


Отговор
в отговор на koko #6

Re: enter vmesto Tab

мхм, сега баш нямам Delphi, ама ти погледна ли какво пише за Parent, Owner и т.н.т в хелпа?
прочее, това със SEFL, когато SELF е форма... ми няма начин да й дадеш TabStop=TRUE, и още кило други такива...

к, с готовите работи - трудно.
има едно дето е с повече писане, ама може да ти е по-полезно...

идеята: кеширай ги тия контроли дето ти трябват в едно масивче /TObjectList, да не се юрнеш сега масиви да пишеш :-)/, например на OnCreate (ако е удачно - ти си знаеш). кеширай - цикълче, погледни кое по формата дава такова инфо - да е по Owner, не по Parent! (ама май готово няма, та ще се наложи с рекурсия - обикаляш си ги контролите и гледаш имат ли ботушки), подреждаш си ги в удобен вид, после на ВСЕКИ едит, на KeyUP му закачаш при ентер да търси следващия в оня списък /глей кат стигнеш последния да почнеш от начало не от първия след последния :-)/

ПС: бата мата, как може да се върши работа в 9:00 сутринта!?!?
ППС: това всичкото го мисля на VCL, изв. ама никога не съм правил нещо с CLX... та може и ГОООЛЕМИ глупости да съм нашляпал...

--------------------------------------
Започва Път от моят праг...

Редактирано от Hateras на

Отговор
в отговор на Hateras #7

Re: enter vmesto Tab

ми..незнам дали са глупости... ама съм ти благодарен за написаното..:) ама.. 4естно казано това маи(ама не съм сигурен ;)) ) не ми върши работа( искам да работи в метода KeyDown на KEdit ..(дето се опитвам да предифинирам..)..
а то4но там..owner i parent са ми недостъпни.....
Когато ве4е имам компонентите във форма и там като на KeyDown и напиша:
procedure TForm1.KEdit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key=Key_return) then
SelectNext(sender as TWidgetControl,true,true)
end;
и това си работи..
ама като в компонента напиша:
SelectNext(self,true,true)
не става..
и още един път мерси за вниманието...

Отговор
в отговор на koko #8

Re: enter vmesto Tab

Във формата с KeyPreview:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If Key=#13
then begin
Key:=#0;
SelectNext(ActiveControl,True,True);
end;
end;

В контролата:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If Key=#13
then begin Key:=#0;Perform(CM_DialogKey,VK_TAB,0);end;
end;

Редактирано от NDeu на

Отговор
в отговор на NDeu #9

Re: enter vmesto Tab

procedure TForm1.Form1KeyPress(var Key: char);
begin
if Key = #13 then
begin
Key := #0;
PostMessage (Handle, wm_KeyDown, vk_Tab, 0);
end;
end;

и KeyPreview на формата трябва да е True. И не се занимаваш с глупости да качориш евенти на всеки контрол. Може обаче да си правиш проверка какъв е типа на активния контрол и да изпращаш Tab само за някои...

Отговор
в отговор на andrew_nikoloff #10

Re: enter vmesto Tab

Мерси за отговорите :)

ама под Linux това не ми върши работа..:(
Пък и исках тази простотия да работи в предифинирания клас КEdit ...

ако имате ниакви идеи ще съм ви признателен , ако ги споделите

Отговор
в отговор на koko #11

Re: enter vmesto Tab

Probvaj tova. 6te ti svar6i rabota.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
Edit2.SetFocus;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
Edit1.SetFocus;
end;

Отговор
в отговор на dani #12

Re: enter vmesto Tab

Е да де - ама при 20 edit-a представи си колко код ще изпишеш.
Хората дадоха добри отговори - има и компоненти по върпоса - ако някой се нуждае мога да помогна.

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #13

Re: enter vmesto Tab

Znam 4e ne e perfektnoto re6enie, zatova go dadoh tolkova kasno. Vse pak priemam zabelejkata :).

Отговор
в отговор на koko #14

Re: enter vmesto Tab

Za da ne se nalaga da pi6et code za wseki control na formata prawi6 slednoto:

1) Slaga6 property na KeyPreview=True na formata
2) na OnKeyPress na formata:
if Key = #13 then SelectNext( ActiveControl, True, True );

i si gotow.

Отговор