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

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

Непонятное поведение accelerator character [D7]


Opilki_Inside ©   (2009-04-02 03:46:00) 

Поведение, трудно поддающееся описанию, поэтому объясню на примере:

Кинем на форму TStringGrid, TListBox, TBitBtn

в TBitBtn зададим Caption, например 'h&ello', т.е. кнопочка 'E' становится клавишей быстрого вызова (accelerator character)

Запускаем прогу,

ставим фокус на StringGrid и нажимаем 'E' (без Alt) при этом вызоветсяобработчик BitBtn !

ставим фокус на TListBox и так же нажимаем 'E' - при этом обработчик не вызовется!

Вопрос - почему? Есть идеи?


Opilki_Inside   (2009-04-03 05:03:00) [1]

Игорь, спасибо. Я так и сделал :-)


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


> Поведение, трудно поддающееся описанию, поэтому объясню
> на примере:
>
> Кинем на форму TStringGrid, TListBox, TBitBtn
>
> в TBitBtn зададим Caption, например 'h&ello', т.е. кнопочка
> 'E' становится клавишей быстрого вызова (accelerator character)
>
>
> Запускаем прогу,
>
> ставим фокус на StringGrid и нажимаем 'E' (без Alt) при
> этом вызовется обработчик BitBtn !
>
> ставим фокус на TListBox и так же нажимаем 'E' - при этом
> обработчик не вызовется !
>
> Вопрос - почему? Есть идеи?


Вот поэтому:

procedure TCustomGrid.WMGetDlgCode(var Msg: TWMGetDlgCode);
begin
 Msg.Result := DLGC_WANTARROWS;
 if goRowSelect in Options then Exit;
 if goTabs in Options then Msg.Result := Msg.Result or DLGC_WANTTAB;
 if goEditing in Options then Msg.Result := Msg.Result or DLGC_WANTCHARS;
end;

ставим у грида в Options goEditing и наблюдаемое поведение пропадает.

В наследнике я бы переписал метод WMGetDlgCode, с учетом того, что если нужен инкрементальный поиск, то возвращать всегда DLGC_WANTCHARS


Opilki_Inside   (2009-04-02 22:13:00) [3]


> > модифицирую свой Grid унаследованный от TCustomGrid (компонент
>
> > уже написан другими разработчиками), и мне нужно реализовать
>
> > инкрементный поиск
> >
>
> Посмотри исходники DBGridEh из EhLib, там реализован инкрементный
> поиск.


Посмотрел EhLib. Инкрементный поиск реализован. Только там тоже есть описанная мной проблема. Если на форме лежит кнопочка с быстрым вызовом, то она нажимается.

Причем, KeyDown срабатывает у наследников TCustomGrid, но Key := 0; в нем не помогает. А до KeyPress дело даже не доходит.


Amoeba   (2009-04-02 21:47:00) [4]


> модифицирую свой Grid унаследованный от TCustomGrid (компонент
> уже написан другими разработчиками), и мне нужно реализовать
> инкрементный поиск
>

Посмотри исходники DBGridEh из EhLib, там реализован инкрементный поиск.


Opilki_Inside   (2009-04-02 20:42:00) [5]

clickmaker © , Это я понимаю. Я просто как раз модифицирую свой Grid унаследованный от TCustomGrid (компонент уже написан другими разработчиками), и мне нужно реализовать инкрементный поиск. Так вот, появилась проблема, что как только юзер начинает вводить символы (фокус в гриде), то срабатывают обработчики у кнопок на форме.
Я долго копался в исходниках VCL но не так и не смог найти принципиальной разницы между TListBox и TStringGrid...


clickmaker   (2009-04-02 11:45:00) [6]

> ставим фокус на TListBox и так же нажимаем 'E' - при этом
> обработчик не вызовется !
>
> Вопрос - почему? Есть идеи?

есть. В листбоксе нажатие буквенных клавиш - быстрый поиск по первым буквам


DimaBr   (2009-04-02 09:04:00) [7]

Внимание!Здесьобсуждаются вопросы, связанные с разработкойкомпонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поискуи использованиюготовых компонентов, редакторов или экспертов являются нарушениемтематики и могут быть удалены.


Наверх

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