Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх









Память: 0.72 MB
Время: 0.078 c
1-10694
Chandr
2003-08-13 09:07
2003.09.04
Редактирование TListView


1-10668
Sirus
2003-08-25 11:33
2003.09.04
Нужно событие типа AfterFormShow???


14-10983
Igor__
2003-08-14 07:40
2003.09.04
Ох эти цыклы!!!!


3-10547
Lapin
2003-08-12 10:31
2003.09.04
Operation not applicable


4-11013
Nick Denry
2003-07-05 20:49
2003.09.04
9x и wm_devicechange. в SDK написано -нет такой мессаги в 9x





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский