Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Enter вместо Tab / Delphi 2007 [WinXP]


HandBrake ©   (2009-04-09 15:35:00) 

Уважаемые Коллеги!

Горю от стыда и злости:(

На форме четыре Edita.
У всех TabStop := true;
TabOrder'ы выставлены 0..4

Запускаю прогу. Жму Tab и прекрасно перемещаюсь по всем Edit в порядке их TabOrder.

Теперь хочу сделать перемещение между контролами (Edit'ами) по нажатию Enter.

TMyForm.KeyPreview := true;
и

procedure TMyForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Key =#13 then
 begin
   SelectNext(Sender as TWinControl,true,true);
   Key := #0;
 end;
end;

Запускаю прогу. Жму Enter и получаю следующее:

Если фокус на Edit1, то никакого перемещения ни к какому контролу не происходит.
Если фокус на любом другом Edit (TabOrder > 0), то возвращаюсь на Edit1 (TabOrder > 0).

Смотрю как работает процедура TWinControl.SelectNext: угу, виден вызов FindNextControl.
Вот этот самый FindNextControlи приводит к такому поведению.
Кто с этим сталкивался? Баг или я опять HandBreak?


  (2009-04-11 02:09:00) [1]

Удалено модератором


  (2009-04-10 14:41:00) [2]

Удалено модератором


  (2009-04-10 13:33:00) [3]

Удалено модератором


HandBrake   (2009-04-10 10:45:00) [4]

2 Игорь Шевченко ©

Спасибо, предложенное Вами работает!
Однако, я в ступоре, код ниже работает:


procedure TMyForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Key =#13 then
 begin
//    SelectNext(Sender as TWinControl,true,true);
   FindNextControl(ActiveControl,true,true,true).SetFocus;
   Key := #0;
 end;
end;


Но ведь SelectNext и вызывает FindNextControl???????????
Прокомментируете? А то я щас (прям с утра и на работе) напьюсь!!!


DVM   (2009-04-09 21:39:00) [5]


> HandBrake   (09.04.09 15:35)  

Иван?


Игорь Шевченко   (2009-04-09 20:26:00) [6]

Где-то так получается:

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   Button1: TButton;
 private
   procedure CmDialogKey (var Message: TCMDialogKey); message CM_DIALOGKEY;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.CmDialogKey(var Message: TCMDialogKey);
begin
 if (Message.CharCode = VK_RETURN) and not (ActiveControl is TButton) then
   Message.CharCode := VK_TAB;
 inherited;
end;

end.


Игорь Шевченко   (2009-04-09 20:22:00) [7]


>  Я кардинально неправ


да. посмотри в реализацию TCustomForm.CMDialogKey


HandBrake   (2009-04-09 18:39:00) [8]

2 Игорь Шевченко ©  

 Спасибо, завтра попробую. Только нет понимания, почему так [0] не получается:(
 Я кардинально неправ или Баг?


Игорь Шевченко   (2009-04-09 17:07:00) [9]

Обрабатывай CM_DIALOGKEY у формы


Наверх

Титульная страница Поиск, карта сайта Написать письмо