Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.04;
Скачать: CL | DM;

Вниз

TDBGrid   Найти похожие ветки 

 
Алексей Петухов   (2003-08-14 09:01) [0]

Здравствуйте, уважаемые мастера.

Допустим у нас есть DBGrid, в нем отображон некоторый набор данных.
Мы перемещаемся в некоторую ячейку некоторого столбца и нажимаем клавишу "Enter".
Данные в этой ячейке Выделяются и в ней появляется курсор.

Подскажите пожалуйста, как я могу узнать, что DBGrid находистя в этом состоянии?


 
Reindeer Moss Eater ©   (2003-08-14 09:06) [1]

DBGrid.DataSource.DataSet.State in dsEditModes


 
Алексей Петухов   (2003-08-14 09:11) [2]

> DBGrid.DataSource.DataSet.State in dsEditModes
Что то не сработало...


 
Reindeer Moss Eater ©   (2003-08-14 09:16) [3]

Что не сработало? Что должно было сработать?


 
HSolo ©   (2003-08-14 09:20) [4]

DBGrid.DataSource.DataSet.State = dsEdit;


 
Алексей Петухов   (2003-08-14 09:24) [5]

Дело в том, что в теле обработчика DBGrid.OnKeyPress
DBGrid.DataSource.DataSet.State = dsBrowse
А мне при нажатии "Esc" на DBGrid нужно: в случае если DBGrid находится в вышеописанном состоянии произвести обычнае действия, иначе - закрыть форму.


 
Reindeer Moss Eater ©   (2003-08-14 09:28) [6]

Ты чего в начале спрашивал?
как я могу узнать, что DBGrid находистя в этом состоянии?

Тебе написали булево выражение, отвечающее на твой вопрос.


 
Алексей Петухов   (2003-08-14 09:33) [7]

>Ты чего в начале спрашивал?
Если DBGrig находится в описанном в начале состоянии, и я нажимаю "Esc", то в теле обработчика события DBGrid.OnKeyPress
(DBGrid.DataSource.DataSet.State in dsEditModes)=false, потому что DBGrid.DataSource.DataSet.State=dsBrowse.
Вот такое булево выражение.


 
Reindeer Moss Eater ©   (2003-08-14 09:35) [8]

Ну так ты получил значение этого выражения, узнав при этом, что датасет не в режиме редактирования.

Еще вопросы?


 
Reindeer Moss Eater ©   (2003-08-14 09:35) [9]

Ну так ты получил значение этого выражения, узнав при этом, что датасет не в режиме редактирования.

Еще вопросы?


 
Johnmen ©   (2003-08-14 09:36) [10]

>Алексей Петухов

DBGrid1.EditorMode


 
Reindeer Moss Eater ©   (2003-08-14 09:37) [11]

потому что DBGrid.DataSource.DataSet.State=dsBrowse.

hint:
Грид - dataaware компонент. И сам имеет виды на нажатие некоторых кнопок.


 
Алексей Петухов   (2003-08-14 09:38) [12]

Ну так ты получил значение этого выражения, узнав при этом, что датасет не в режиме редактирования.
Отладчиком.


 
Алексей Петухов   (2003-08-14 09:43) [13]

DBGrid1.EditorMode
То-же не помогает.

hint:
Грид - dataaware компонент. И сам имеет виды на нажатие некоторых кнопок.


И что же делать?


 
Reindeer Moss Eater ©   (2003-08-14 09:49) [14]

то в теле обработчика события DBGrid.OnKeyPress

Перенести логику в Form1.OnKeyPress


 
Reindeer Moss Eater ©   (2003-08-14 09:50) [15]

DBGrid1.EditorMode
То-же не помогает.


Абалдеть! "Не помогает". А что должно произойти при вычислении этого выражения по твоему? Салют что ли начаться?


 
Johnmen ©   (2003-08-14 09:53) [16]

>Алексей Петухов

EditorMode однозначно определяет, находится ли текущая ячейка в режиме редактирования. Т.е. создан ли в данный момент инплейседитор для редактирования...


 
Алексей Петухов   (2003-08-14 10:01) [17]

Перенести логику в Form1.OnKeyPress
Т.е. если я нажму кнопочку на DBGrid-е, произойдет событие Form1.OnKeyPress, так?


 
Reindeer Moss Eater ©   (2003-08-14 10:02) [18]

Т.е. если я нажму кнопочку на DBGrid-е, произойдет событие Form1.OnKeyPress, так?

Если у формы выставлено KeyPreview, то да.


 
Алексей Петухов   (2003-08-14 10:03) [19]

DBGrid1.EditorMode
То-же не помогает.
Абалдеть! "Не помогает". А что должно произойти при вычислении этого выражения по твоему? Салют что ли начаться?


DBGrid1.EditorMode=false
- вот что эначит непомогает.


 
Reindeer Moss Eater ©   (2003-08-14 10:04) [20]

DBGrid1.EditorMode=false
- вот что эначит непомогает.


Не помогает понять, что нет режима редактирования?


 
Reindeer Moss Eater ©   (2003-08-14 10:05) [21]

Что уже нет режима редактирования?


 
Алексей Петухов   (2003-08-14 10:12) [22]

установил Form1.KeyPreview:=true;

Все равно в обработчике Form1.OnKeyPress, при описанных выше условиях DBGrid1.EditorMode=false.


 
Johnmen ©   (2003-08-14 10:14) [23]

>Алексей Петухов (14.08.03 10:12) [22]

Потому, что OnKeyPress возникает до перехода в режим редактирования.


 
Reindeer Moss Eater ©   (2003-08-14 10:15) [24]

Это значит, что нет режима редактирования.
Ты узнал то, что хотел узнать.
Что хочешь узнать еще?


 
Reindeer Moss Eater ©   (2003-08-14 10:17) [25]

Потому, что OnKeyPress возникает до перехода в режим редактирования.

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


 
Johnmen ©   (2003-08-14 10:25) [26]

>Reindeer Moss Eater © (14.08.03 10:17) [25]

Совершенно верно :)


 
Алексей Петухов   (2003-08-14 11:01) [27]

Ну ладно, значит так:
1. У меня DBGrid в "режиме редактирования" (то есть я просто нажал Enter в одной из ячеек, но пока ничего там не менял - весь текст в ячейке выделен и там мигает курсорчик).
2. Я нажимаю "Esc" или "стрелочка вверх".
3. в теле какого то обработчика выполняется такой код:
Если DBGrid описанном состоянии
тогда
Если нажата Esc
тогда
ModalResult:=MrCancel
иначе
Если "стрелочка вверх"
тогда DBGrid.datasourse.dataset.prior;

Вопрос: как осуществить такую проверку?


 
Соловьев ©   (2003-08-14 11:06) [28]


> 1. У меня DBGrid в "режиме редактирования" (то есть я просто
> нажал Enter в одной из ячеек, но пока ничего там не менял
> - весь текст в ячейке выделен и там мигает курсорчик).

из второго первое не следует, т.е. по миганию курсорчика нельзя сказать что НД уже в режиме редактирования.


 
Johnmen ©   (2003-08-14 11:07) [29]

Может ты просто скажешь, что нужно ? Четко и последовательно.


 
Reindeer Moss Eater ©   (2003-08-14 11:10) [30]

2. Я нажимаю "Esc" или "стрелочка вверх".
3. в теле какого то обработчика выполняется такой код:
Если DBGrid описанном состоянии
тогда
Если нажата Esc
тогда
ModalResult:=MrCancel
иначе
Если "стрелочка вверх"
тогда DBGrid.datasourse.dataset.prior;


Нажатие на эти стрелочки и кнопочки выводит из режима редактирования.
И в твоем обработчике он уже отменен. Поздно пить боржом.


 
Vlad   (2003-08-14 11:16) [31]

(gdFocused in DBGrid1.State)
Можно на OnDrawColumnCell вешать.


 
Алексей Петухов   (2003-08-14 11:21) [32]

Ой.
Ну ладно, устраивайтесь поудобнее. Яначинаю свой рассказ... :-)
1. У меня есть форма, на ней BDGrid. Пусть будет Form.BDGrid
2. Мне хочется что-бы форма закрывалась при нажатии на клавишу "Esc".
3. Если я в BDGrid нажал на клавишу "Enter" и побегал по строке текста стрелочками влево, вправо (т.е. BDGrid как-бы в режиме редактирования), то при нажатии на клавишу "Esc" уже я не хочу что-бы форма закрывалась, а хочу что-бы BDGrid вернулся в обычное состояние(т.е курсор вышел бы из ячейки BDGrid-а и перешол бы на сам BDGrid).
Вот что-то в этом роде.


 
Алексей Петухов   (2003-08-14 11:23) [33]

Поздно пить боржом.
Только не внашем случае. Мы выпьем его ранньше!
Только когда?
Вот в чем вопрос.


 
Mark   (2003-08-14 11:40) [34]

Алексею Петухову!
Всё понятно, что имелось ввиду. Только делать лучше, по-моему, вот так:
1 В событии OnKeyPress отлавливаем клавишу ESC и пишем Close. И всё! Больше здесь ничего не надо!!!
2 В событии OnClose пишем:
with DBGrid1.DataSource.DataSet do
if State in [dsEdit,dsInsert] then
try Post except Cancel end;

И всё будет в порядке!


 
Johnmen ©   (2003-08-14 11:43) [35]

Просто заведи флаг, которым будет определяться, было ли редактирование, и анализируй его, когда надо и где надо...


 
Johnmen ©   (2003-08-14 11:44) [36]

>Mark (14.08.03 11:40) [34]

Не совсем то...


 
Mike2 Kouzmine2   (2003-08-14 11:50) [37]

case Key of
#13 : ......;
#27 :
begin
if (t.state in [dsbrowse]) then modalresult := mrOk
else Application.MessageBox("нах","впд");
end;


 
Vlad   (2003-08-14 11:50) [38]

На сколько я понял речь идет НЕ о DataSet.State, а о DBGrid.State,т.е. когда ячейка грида имеет фокус ввода. [gdFocused]
Т.е. на событие OnKeyPress нужно проверять
1) Нажата ли клавиша Esc
2) Не имеет ли DBGrid фокус ввода.
Если ОБА эти условия выполняются, то нужно делать Close.


 
Reindeer Moss Eater ©   (2003-08-14 11:54) [39]

Автору не нужен Close если Esc прервал редактирование.


 
Vlad   (2003-08-14 11:58) [40]

2 Reindeer Moss Eater ©
Если прервал редактирование то Close и не будет.
Читай внимательнее.
Ладно, по-другому:
If (key=#27) and not(gdFocused in DBGrid.State) then Close


 
Mark   (2003-08-14 12:49) [41]

Ты сделай, а потом говорить будешь.
Мы ещё не закрыли окно, но событие OnClose наступило. Именно там всегда и отлавливается. И ты не прерываешь редактирование таблицы - достаточно посмотреть, что она действительно будет находиться в состоянии dsEdit.
Хотел помочь, а ты, я вижу, даже не проверяешь подсказку... Ну, извини...


 
Mark   (2003-08-14 12:55) [42]

Так ты заперти закрытие формы, коль не хочешь!
Там же есть
Action:=caNone
The form is not allowed to close, so nothing happens.


 
roottim   (2003-08-14 13:19) [43]

вот вариант твоей задачи:
кидаешь на форму 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) формочка твоя закроется!


 
Mike2 Kouzmine2   (2003-08-14 13:28) [44]

roottim (14.08.03 13:19) [43] Только все это надо было засунуть в отдельный поток.


 
roottim   (2003-08-14 13:36) [45]

2Mike2 Kouzmine2 (14.08.03 13:28) [44]
зачем ?
таимер и так работает в отдельной нитке!


 
Алексей Петухов   (2003-08-14 14:01) [46]

Попробую с TTimer-ом, хотя не до коннца понял.


 
MXA   (2003-08-14 16:28) [47]

Ну вы блин даете! (С)

Предлагаю свою версию:

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;


 
roottim   (2003-08-14 17:03) [48]

> Ну вы блин даете! (С)
моя версия универсальна для всех контролов формы... это единственный "+"



Страницы: 1 2 вся ветка

Текущий архив: 2003.09.04;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.028 c
14-10925
mOOx_
2003-08-16 15:14
2003.09.04
Список запущенных задач на удаленной машине


14-10900
Soft
2003-08-18 13:58
2003.09.04
Как просто заработать 3 биллиона.


1-10801
Zheks
2003-08-22 09:43
2003.09.04
После экзэшника


14-10941
McLoop
2003-08-18 19:29
2003.09.04
Как вкручивают лампочку программисты (алгоритм)


14-10949
ehri
2003-08-16 12:45
2003.09.04
Gif Animated