![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TDBGrid
Алексей Петухов © (2003-08-14 09:01:00)
Здравствуйте, уважаемые мастера.
Допустим у нас есть DBGrid, в нем отображон некоторый набор данных.
Мы перемещаемся в некоторую ячейку некоторого столбца и нажимаем клавишу "Enter".
Данные в этой ячейке Выделяются и в ней появляется курсор.
Подскажите пожалуйста, как я могу узнать, что DBGrid находистя в этом состоянии?
roottim (2003-08-14 17:03:00) [1]
> Ну вы блин даете! (С)
моя версия универсальна для всех контролов формы... это единственный "+"
MXA (2003-08-14 16:28:00) [2]
Ну вы блин даете! (С)
Предлагаю свою версию:
1. У фоpмы KeyPreview ставим в true;
2. Делаем обработчик:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case key of
VK_Escape:
if not DBGrid1.EditorMode then Close;
end;
end;
Алексей Петухов (2003-08-14 14:01:00) [3]
Попробую с TTimer-ом, хотя не до коннца понял.
roottim (2003-08-14 13:36:00) [4]
2Mike2 Kouzmine2 (14.08.03 13:28) [44]
зачем ?
таимер и так работает в отдельной нитке!
Mike2 Kouzmine2 (2003-08-14 13:28:00) [5]
roottim (14.08.03 13:19) [43] Только все это надо было засунуть в отдельный поток.
roottim (2003-08-14 13:19:00) [6]
вот вариант твоей задачи:
кидаешь на форму TTimer
в дизайне:
.Name = "Timer1"
.Interval = 500;
.Enabled := False;
кликаем по нему дважды и пишем обработчик
procedure TmyForm.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
end;
далее у формы проперти KeyPreview = True;
и пишем обработчик на key_down для формы
procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_ESCAPE) then
begin
if Timer1.Enabled then
begin
Timer1.Enabled := not Timer1.Enabled;
Self.Close;
end
else
Timer1.Enabled := True;
end;
end;
вот теперь если ты нажмеш один раз... Esc то если DataSet редактирование закончится
А если ты двыжды нажмеш на Esc, или подержиш подольше, или один раз (при том что DataSet не в режиме dsEdit) формочка твоя закроется!
Mark (2003-08-14 12:55:00) [7]
Так ты заперти закрытие формы, коль не хочешь!
Там же есть
Action:=caNone
The form is not allowed to close, so nothing happens.
Mark (2003-08-14 12:49:00) [8]
Ты сделай, а потом говорить будешь.
Мы ещё не закрыли окно, но событие OnClose наступило. Именно там всегда и отлавливается. И ты не прерываешь редактирование таблицы - достаточно посмотреть, что она действительно будет находиться в состоянии dsEdit.
Хотел помочь, а ты, я вижу, даже не проверяешь подсказку... Ну, извини...
Vlad (2003-08-14 11:58:00) [9]
2 Reindeer Moss Eater ©
Если прервал редактирование то Close и не будет.
Читай внимательнее.
Ладно, по-другому:
If (key=#27) and not(gdFocused in DBGrid.State) then Close
Reindeer Moss Eater (2003-08-14 11:54:00) [10]
Автору не нужен Close если Esc прервал редактирование.
Mike2 Kouzmine2 (2003-08-14 11:50:00) [11]
case Key of
#13 : ......;
#27 :
begin
if (t.state in [dsbrowse]) then modalresult := mrOk
else Application.MessageBox("нах","впд");
end;
Vlad (2003-08-14 11:50:00) [12]
На сколько я понял речь идет НЕ о DataSet.State, а о DBGrid.State,т.е. когда ячейка грида имеет фокус ввода. [gdFocused]
Т.е. на событие OnKeyPress нужно проверять
1) Нажата ли клавиша Esc
2) Не имеет ли DBGrid фокус ввода.
Если ОБА эти условия выполняются, то нужно делать Close.
Johnmen (2003-08-14 11:44:00) [13]
>Mark (14.08.03 11:40) [34]
Не совсем то...
Johnmen (2003-08-14 11:43:00) [14]
Просто заведи флаг, которым будет определяться, было ли редактирование, и анализируй его, когда надо и где надо...
Mark (2003-08-14 11:40:00) [15]
Алексею Петухову!
Всё понятно, что имелось ввиду. Только делать лучше, по-моему, вот так:
1 В событии OnKeyPress отлавливаем клавишу ESC и пишем Close. И всё! Больше здесь ничего не надо!!!
2 В событии OnClose пишем:
with DBGrid1.DataSource.DataSet do
if State in [dsEdit,dsInsert] then
try Post except Cancel end;
И всё будет в порядке!
Алексей Петухов (2003-08-14 11:23:00) [16]
Поздно пить боржом.
Только не внашем случае. Мы выпьем его ранньше!
Только когда?
Вот в чем вопрос.
Алексей Петухов (2003-08-14 11:21:00) [17]
Ой.
Ну ладно, устраивайтесь поудобнее. Яначинаю свой рассказ... :-)
1. У меня есть форма, на ней BDGrid. Пусть будет Form.BDGrid
2. Мне хочется что-бы форма закрывалась при нажатии на клавишу "Esc".
3. Если я в BDGrid нажал на клавишу "Enter" и побегал по строке текста стрелочками влево, вправо (т.е. BDGrid как-бы в режиме редактирования), то при нажатии на клавишу "Esc" уже я не хочу что-бы форма закрывалась, а хочу что-бы BDGrid вернулся в обычное состояние(т.е курсор вышел бы из ячейки BDGrid-а и перешол бы на сам BDGrid).
Вот что-то в этом роде.
Vlad (2003-08-14 11:16:00) [18]
(gdFocused in DBGrid1.State)
Можно на OnDrawColumnCell вешать.
Reindeer Moss Eater (2003-08-14 11:10:00) [19]
2. Я нажимаю "Esc" или "стрелочка вверх".
3. в теле какого то обработчика выполняется такой код:
Если DBGrid описанном состоянии
тогда
Если нажата Esc
тогда
ModalResult:=MrCancel
иначе
Если "стрелочка вверх"
тогда DBGrid.datasourse.dataset.prior;
Нажатие на эти стрелочки и кнопочки выводит из режима редактирования.
И в твоем обработчике он уже отменен. Поздно пить боржом.
Johnmen (2003-08-14 11:07:00) [20]
Может ты просто скажешь, что нужно ? Четко и последовательно.