0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 50

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

01.06.2016, 07:51. Показов 3277. Ответов 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 / 2271 / 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 / 2271 / 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 / 2271 / 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
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru