Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46

Запись в базу после нажатия Enter

13.02.2013, 13:11. Показов 2389. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть FibDataset (FbClient) и DbGridEh (DbClient). Я хочу дать пользователю возможность редактировать значения в некоторых ячейках в ДбГриде.
Как обычно это происходит - пользователь редактирует в таблице какое-нибудь значение, нажимает Enter, а затем чтобы значение сохранилось нужно выйти из текущей записи, нажав например на клавиатуре ВВЕРХ или ВНИЗ (мне такой подход не нравится).
Так вот я хочу сделать так чтобы после того как пользователь нажал Enter, то запись сразу бы сохранялась в базу.
Сделал я это так:
Delphi
1
2
3
4
procedure TDM.FbClientFieldChange(Sender: TField);
begin
   FbClient.ApplyUpdates;
end;
Получилось то что хотел: после Enter-а сразу идет запись в базу,
НО теперь если после внесения изменения нажать не Enter, а клавишу ВВЕРХ или ВНИЗ, то выдается ошибка (хоть запись и сохраняется):
FbClient: Dataset not in edit or insert mode'.
Как от нее избавиться?
Видимо Post происходит дважды... вот только где второй раз? (видимо при смене указателя записи, но где конкретно это место... я бы его закомментировал )

PS. У FbClient свойство AutoCommit=true, если это важно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2013, 13:11
Ответы с готовыми решениями:

DataGridView все действия сохранить в базу, обновить после нажатия кнопки enter
Добрый день, я не понимаю принцип работы таблицы DataGridView с базой данных. Интересует момент сохранения всех действий. И обновить. Хотя...

После нажатия клавиши Enter или нажатия на Button
Помогите пожалуйста.:-[ Задача: После нажатия клавиши Enter или нажатия на Button поле курсора переходит в соответствующий компонент...

После загрузки биоса Windows грузится только после нажатия enter + f4
Люди, что это может быть если после загрузки биоса винда грузится только после нажатия enter + f4? Как с этим бороться ?

12
36 / 36 / 7
Регистрация: 15.01.2013
Сообщений: 161
13.02.2013, 16:22
а убрать applyUpdates?

Если AutoCommit = true,
то транзацкия коммититься автоматом после Post.
0
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
14.02.2013, 12:09  [ТС]
ArtProud, вы не правильно поняли условие задачи...
В общем решение подсказали на соседнем форуме: обрабатывать OnKeyDown - это самый простой способ.

Delphi
1
2
3
4
5
if Key = VK_RETURN then 
begin
  FbClient.ApplyUpdates;
  Key := 0;
end;
0
 Аватар для SHMS
6 / 6 / 7
Регистрация: 13.02.2013
Сообщений: 152
16.02.2013, 12:00
а можно как-нибудь на Enter сделать так, чтоб PopUmenu выпадало.?
0
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
18.02.2013, 11:59  [ТС]
SHMS, вот так
Delphi
1
2
3
4
5
if Key = VK_RETURN then 
begin
  PopupMenu1.Popup(100,200); // в скобках координаты
  Key := 0;
end;
1
 Аватар для SHMS
6 / 6 / 7
Регистрация: 13.02.2013
Сообщений: 152
20.02.2013, 11:05
Rusland, спасибо за код, но в столкнулся с проблемой передачи координат активной ячейки в эту программу(
0
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
20.02.2013, 11:50  [ТС]
SHMS, координаты выделенной ячейки можно узнать так:
Delphi
1
2
3
4
      DbClient.CellRect(DbClient.Col,DbClient.Row).Top;
      DbClient.CellRect(DbClient.Col,DbClient.Row).Left;
      DbClient.CellRect(DbClient.Col,DbClient.Row).Right;
      DbClient.CellRect(DbClient.Col,DbClient.Row).Bottom;
DbClient - это DbGrid
1
 Аватар для SHMS
6 / 6 / 7
Регистрация: 13.02.2013
Сообщений: 152
20.02.2013, 12:45
не работает. Просто подчеркивает всю строку.
Цитата Сообщение от Rusland Посмотреть сообщение
DbClient - это DbGrid
сделал
0
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
20.02.2013, 13:12  [ТС]
Прошу прощения, ввел в заблуждение... у меня не стандартный DbGrid, а DbGridEh, поэтому этот код не подходит.

Добавлено через 10 минут
Вот нашел ответ:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
implementation
 
type
  THackDBGrid=class(TDBGrid);
 
//...
// В месте где нужны координаты
var
  CurrRow: Integer;
  Rect: TRect;
begin
  // и "Row" и "CellRect"  - protected и напрямую недоступны
  CurrRow := THackDBGrid(DBGrid1).Row; 
  Rect := THackDBGrid(DBGrid1).CellRect( ИндексНужнойКолонки, CurrRow );
  // Rect теперь содержит нужные нам экранные координаты или 
  // пустой прямоугольник, если ячейки с такими колонкой-строкой не существует
end;
Добавлено через 3 минуты
Индекс нужной колонки определяется так: DBGrid1.SelectedIndex
1
 Аватар для SHMS
6 / 6 / 7
Регистрация: 13.02.2013
Сообщений: 152
20.02.2013, 13:20
Rusland, слушай спасибо тебе за помощь.
Delphi
1
2
3
4
5
6
7
8
9
10
11
  var
  CurrRow: Integer;
  Rect: TRect;
begin
CurrRow := THackDBGrid(DBGrid1).Row;
  Rect := THackDBGrid(DBGrid1).CellRect(DBGrid1.SelectedIndex, CurrRow );
if Key = VK_RETURN then
begin
 PM_Osn_kar.Popup(X,Y);
  Key := 0;
end;
Если
Цитата Сообщение от Rusland Посмотреть сообщение
Rect теперь содержит нужные нам экранные координаты или
то он выдает ошибку на не совпадение типов(
0
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
20.02.2013, 13:23  [ТС]
Смотри координаты так y:=Rect.Top, x:=Rect.Left или .Right и .Bottom
1
 Аватар для SHMS
6 / 6 / 7
Регистрация: 13.02.2013
Сообщений: 152
20.02.2013, 13:31
да да я понел) спасибо
0
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
20.02.2013, 13:35  [ТС]
Рад был помочь
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.02.2013, 13:35
Помогаю со студенческими работами здесь

Стоп после нажатия на Enter
Добрый день. У меня небольшой вопрос. Я ввожу числа через cin, разделяя их пробелами. Нужно, чтобы при нажатии на Enter ввод чисел...

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

Остановить ввод после нажатия клавиши enter
int i = 0; while (mass1 != '\0') { scanf_s("%a", &m); i++; mass1 = m; p++; } Что я делаю не так?

После нажатия ENTER переход на следующий textbox
Всем привет На форме есть : text1.text , text2.text , text3.text По умолчанию активно text2.text Нужно прописать чтобы после...

Закрывается, а не выполняется программа после нажатия enter
Доброй ночки всем. Помогите новичку: после нажатия enter после ввода переменных программа не выполняется, а попросту закрывается. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru