Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50

Закрытие окна крестиком и реакция ADOTable.Modified

01.06.2016, 07:51. Показов 3225. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня есть окно, в котором 3 компонента: ADOConnection, ADOTable и DataSource. Поля самой таблицы отображаются в DBEdit и DBMemo. Есть кнопка Закрыть, в событии OnClick которой указана всего 1 строка Form1.Close;

В событии OnCloseQuery этой же формы такой код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TFmSozdanieZayavki.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
 
begin// 0
If FmZayavki.ADOTable1.Modified Then//A
Begin// 1
  If Application.MessageBox('Сохранить все сделанные вами изменения?', //B
    'Сохранение изменений', MB_IConQuestion + MB_YesNo) = 6 Then
  Begin// 2
    FmZayavki.ADOTable1.Post;
    FmZayavki.ADOTable1.Edit;
    If (S3 = '0') And (DBMoPrim.Lines.Count > 0) Then
    Begin// 3
      FmZayavki.ADOTable1.FieldByName('PervOsmotr').Value :=
      FormatDateTime('d/mmm/yyyy', Date) + ' | ' + FormatDateTime('h:nn', Time);
    End;// 3
    For i := 0 To 3 Do
      S1 := S1 + DBMoSoder.Lines[i] + ' ';
    FmZayavki.ADOTable1.FieldByName('SoderjanieStroka').Value := S1;
    FmZayavki.ADOTable1.Post;
  End// 2
  Else//B
  Begin// 4
    FmZayavki.ADOTable1.Cancel;
  End;// 4
End//1
end;//0
Вопрос в том, почему при нажатии на кнопку Закрыть все команды события OnCloseQuery выполняются, а при нажатии на красный крестик закрытия формы - как-будто ничего и нет? Он считает, что ADOTable1.Modified = False и закрывается, хотя текст я вбивал в DBMemo и после этого ADOTable1.Post не выполнял. Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2016, 07:51
Ответы с готовыми решениями:

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

Как сделать Закрытие/Открытие элемента, с крестиком?
https://codepen.io/bogdanmaslyanik/pen/MPydzm <div class="alblackover"> <h6 id="form_show" style="padding: 12px 0">Форма...

Пишу программу Быстрые записи и не могу поставить своё действие на закрытие крестиком
Привет всем, пишу на C# прогу в которую можно вставить текст и закрыть и она его сохранит, я уже сделал выход и сохранение по кнопке ESC, с...

16
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
01.06.2016, 09:23
Надо немного не так проверять:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TFmSozdanieZayavki.FormCloseQuery(Sender: TObject;
var CanClose: Boolean); 
begin// 0
if FmZayavki.ADOTable1.State = dsBrowse then Exit;
  If Application.MessageBox('Сохранить все сделанные вами изменения?', //B
    'Сохранение изменений', MB_IConQuestion + MB_YesNo) = 6 Then
  Begin// 2
    FmZayavki.ADOTable1.Post;
    FmZayavki.ADOTable1.Edit;
    If (S3 = '0') And (DBMoPrim.Lines.Count > 0) Then
    Begin// 3
      FmZayavki.ADOTable1.FieldByName('PervOsmotr').Value :=
      FormatDateTime('d/mmm/yyyy', Date) + ' | ' + FormatDateTime('h:nn', Time);
    End;// 3
    For i := 0 To 3 Do
      S1 := S1 + DBMoSoder.Lines[i] + ' ';
    FmZayavki.ADOTable1.FieldByName('SoderjanieStroka').Value := S1;
    FmZayavki.ADOTable1.Post;
  End// 2
  Else//B
  Begin// 4
    FmZayavki.ADOTable1.Cancel;
  End;// 4
 
end;//0
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50
01.06.2016, 10:25  [ТС]
Не помогло. Хотя, и не должно было, судя по изменениям.
0
12 / 12 / 7
Регистрация: 09.12.2015
Сообщений: 191
01.06.2016, 11:11
попробуй делать проверку не на adoTable,а на DataSource1.DataSet.Modified поставить проверку
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50
01.06.2016, 11:53  [ТС]
Ни фига. На кнопку Закрыть всё работает, а на крестик - нет. Как-будто крестик не вызывает событие OnCloseQuery. Использовать CanClose := False и собитие OnClose тоже пробовал. Windows 7, если что.
0
12 / 12 / 7
Регистрация: 09.12.2015
Сообщений: 191
01.06.2016, 12:08
Цитата Сообщение от KAV1989 Посмотреть сообщение
Ни фига. На кнопку Закрыть всё работает, а на крестик - нет. Как-будто крестик не вызывает событие OnCloseQuery. Использовать CanClose := False и собитие OnClose тоже пробовал. Windows 7, если что.
а если поставить точку останова и сделать трассировку заходить в процедуру?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
01.06.2016, 12:14
У меня тестик с похожим кодом прекрасно все отрабатывает. Попробуйте новый проект собрать и минимум кода написать для проверки ситуации.
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50
01.06.2016, 12:25  [ТС]
Пробовал заходить в процедуру трассировкой - он считает, что Modified = False и пропускает всё что должен выполнить, хотя я писал текст в DBMemo и DBEdit. Если же вызвать это событие через кнопку, то он считает, что Modified = True и все ок. На 2 компах так.

Добавлено через 1 минуту
Может в свойствах самой формы надо что-то поменять?
0
12 / 12 / 7
Регистрация: 09.12.2015
Сообщений: 191
01.06.2016, 12:33
попробуй так что ли при вызови события CloseQuery, вызывается процедура нажатия на кнопку
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
01.06.2016, 12:37
Лучший ответ Сообщение было отмечено KAV1989 как решение

Решение

И не будет работать. Я же вам дал код который надо использовать для проверки состояния датасета:
Delphi
1
FmZayavki.ADOTable1.State
1
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50
01.06.2016, 12:40  [ТС]
Вот обработчик нажатия на кнопку Закрыть:

Delphi
1
2
3
4
procedure TFmSozdanieZayavki.BtBnZakritClick(Sender: TObject);
begin// 1
FmSozdanieZayavki.Close;
end;// 1
Обработчик события OnCloseQuery я написал в шапке.

P.S. Что надо тут нажать, чтобы вставить чей-то ответ в своё сообщение как цитату, и чтобы имя, к кому обращаюсь, тоже автоматом ставилось?
0
12 / 12 / 7
Регистрация: 09.12.2015
Сообщений: 191
01.06.2016, 12:50
исходник можно?
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
01.06.2016, 12:58
Цитата Сообщение от KAV1989 Посмотреть сообщение
Вопрос в том, почему при нажатии на кнопку Закрыть все команды события OnCloseQuery выполняются, а при нажатии на красный крестик закрытия формы - как-будто ничего и нет? Он считает, что ADOTable1.Modified = False и закрывается, хотя текст я вбивал в DBMemo и после этого ADOTable1.Post не выполнял.
При нажатии на кнопку закрыть сначала DBMemo теряет фокус и при этом происходит запись в таблицу. При нажатии на крестик DBMemo фокус не теряет и свойство Modified остается False.
1
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50
06.06.2016, 07:33  [ТС]
А кто-нибудь знает, как определить, выполнился ли метод Post или нет? Например, нажимаем на кнопку - выскакивает форма - в ней что-то делаем с базой и происходит или не происходит Post и форма закрывается - если в только что закрывшейся форме был выполнен Post, то кнопка будет неактивна, иначе будет активна.
0
12 / 12 / 7
Регистрация: 09.12.2015
Сообщений: 191
06.06.2016, 08:18
afterpost - событие, которое наступает после вставки
1
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50
07.06.2016, 11:02  [ТС]
А кто-нибудь знает как реализовать автоматический пересчёт столбца в базе данных? Надо, чтобы в столбец автоматически записывалась разность между текущей датой и датой создания записи (проще говоря, количество прошедших дней). С помощью таймера это делать? Тогда надо интервал выставить 24 часа
0
12 / 12 / 7
Регистрация: 09.12.2015
Сообщений: 191
07.06.2016, 15:37
нет в базе данных создай поле
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2016, 15:37
Помогаю со студенческими работами здесь

Реакция на закрытие процесса
А вопрос достаточно прост Из дочернего окна вызывается процесс - скажем ноутпад Хочется чтобы после закрытия процессa дочернее...

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

Закрытие одного окна по таймеру с последующем открытием другого окна
Приветствую! Необходимо создать приветственное окно для программы. Сначала должно открываться приветственное окно, висеть примерно 7...

Реакция на изменение окна
здраствуйте, есть клас, который отвечает за роботу окна: public class Form extends Base клас является наследником класа Base в котором...

Закрытие дочернего окна приводит к закрытию основного окна
Суть задания "После нажатия левой кнопки мышки в области окна в левом углу окна создать временное окно размером в чверть основного окна....


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru