powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / (Закрытие формы) А значения контролов были изменены
10 сообщений из 10, страница 1 из 1
(Закрытие формы) А значения контролов были изменены
    #33569522
JuniorFoxik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста!

На форме множество ТекстБоксов. Пользователь изменил значение нескольких (или одного), не сохранил и пытается закрыть форму. Как с минимальными затратами это отследить? Может у формы есть к.л. свойство? Или нужно все анализировать вручную? Я делала так: в ините формы добавляла свойства, в которые записывала "старые" значения контролов, а на выходе сравнивала их с "новыми". Но может можно как-то более эффективно"

VFP9, WinXPSP2

Спасибо.
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33569527
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В событии QueryUnload формы (класса) вызови метод формы (класса), котороый будет проверять, были ли изменения в текущем Control и фиксировать его. Этот код я взял из примера самого VFP:
Код: plaintext
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.
28.
QueryUnload :
DODEFAULT()
IF !THISFORM.WriteBuffer()
	NODEFAULT
	RETURN .F.
ENDIF

WriteBuffer:
LOCAL llRetval, loActiveControl
m.llRetVal = .T.
m.loActiveControl = IIF(TYPE("THISFORM.ActiveControl") == "O", THISFORM.ActiveControl, '')

IF TYPE("m.loActiveControl") == "O" AND ;
   UPPER(m.loActiveControl.BaseClass) <> "GRID"
      IF TYPE("m.loActiveControl.ControlSource") <> "U" 
               AND !EMPTY  (m.loActiveControl.ControlSource)
	IF USED(LEFT(m.loActiveControl.ControlSource, 
                AT('.', m.loActiveControl.ControlSource) -  1 ))
             	IF EVAL(m.loActiveControl.ControlSource)  
                                <>m.loActiveControl.Value
		   REPLACE (m.loActiveControl.ControlSource) WITH
                                 m.loActiveControl.Value
   		   m.llRetVal = (EVAL(m.loActiveControl.ControlSource)
                                       =m.loActiveControl.Value)
		ENDIF
	ENDIF
      ENDIF
ENDIF
RETURN (m.llRetVal)
С уважением, Алексей
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33578625
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi JuniorFoxik!

Если нет курсора и нет буферизации - то только "руками" - сохраняя старое
значение, сравнивая с новым и т.п. - т.е. по сути повторяя то что делает
буферизация. Если же есть курсор и контролы на форме привязаны к полям этого
курсора, то достаточно проверить GETNEXTMODIFIED(0) # 0 - это если записей
много и правиться могут любые из них - или в строчке возвращённой
GETFLDSTATE(-1) искать циферки отличные от 1 (как искать уж сам решай -
можно по поиску вхождения, можно сравнивая с эталонной строкой состоящей из
нужного числа единиц).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33578714
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JuniorFoxik...На форме множество ТекстБоксов. Пользователь изменил значение нескольких (или одного), не сохранил и пытается закрыть форму. Как с минимальными затратами это отследить?...На мой взгляд нужно разобрать еще случай: user изменил контролы, но информацию нехочет сохранять. Поэтому я лично поступаю так: на форме блокирую крестик (в правом верхнем углу формы) и ставлю на форму две кнопки <Принять> и <Отмена>, с выходом по клавише Esc на <Отмена>. И на Click-е кнопки <Принять> делаю сохранение. Поэтому твой вопрос: "Как с минимальными затратами это отследить?" У меня решается принятием решения самим User-ом.
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33579366
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я привел пример, который не дает потерять изменения в текущем Control
А что касается всех изменений, то я поступаю так:
1. Форма ( точнее класс) имеет свойство lAllowEdits, которое по умолчанию .F.
2. Каждый Control на форме создан от класса, который имеет в событии InteractiveChange код:
THISFORM.lAllowEdits = .F.
THISFORM.RefreshToolBars()

3. Код метода RefreshToolBars проверяет свойство lAllowEdits и включает или выключает доступность кнопок Save, Undo и New

4. В событии QueryUnload формы (класса) есть код, котороый проверяет свойство формы lAllowEdits и выводит соответствующий диалог с пользователем на предмет сохранение изменений. Собственно говоря, это событие для этих целей и введено разработчиками в базовый класс Form.
5. Свойство lAllowEdits сбрасывается при Save и Undo и также взводится при добавлении новой записи.

В принципе, все это хорошо описано в документации и примерах к VFP (начиная с версии VFP 3.0).
Так, как все мои приложения на VFP являются клиентской частью приложения клиент-сервер (только pass-through), то я использую именно такой способ фиксации изменений пользователя, а не GETNEXTMODIFIED и пр.

С уважением, Алексей
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33579657
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K
А что касается всех изменений, то я поступаю так:
1. Форма ( точнее класс) имеет свойство lAllowEdits, которое по умолчанию .F.
2. Каждый Control на форме создан от класса, который имеет в событии InteractiveChange код:
THISFORM.lAllowEdits = .F.
THISFORM.RefreshToolBars()

3. Код метода RefreshToolBars проверяет свойство lAllowEdits и включает или выключает доступность кнопок Save, Undo и New



Алексей.

Вот так безусловно сразу в .F.

Код: plaintext
THISFORM.lAllowEdits = .F.

и если не секрет приведите код метода THISFORM.RefreshToolBars()
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33579886
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В методе THISFORM.RefreshToolBars() обновляются специфические для формы кнопки и вызывается метод Refersh главного ToolBar (создан на основе класса Container и ряда кнопок класса commandbutton) на котором и присутствуют кнопки Save, Undo, New и пр. общие для всех форм кнопки.
Так, что имеет смысл привести код имеено метода Refresh главной панели инструментов, которая присутст. почти на всех моих формах:

Код: plaintext
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.
28.
29.
30.
31.
32.
33.
34.
35.
*-- Обновление состояния SAVE, UNDO, New, Del,Close и пр. кнопок
LOCAL llBOF, llEOF, loForm, lnRecno1, lnRecno2, lnRecno
WITH THISFORM
	IF !EMPTY(.SourceTable) AND USED(.SourceTable)
		SELECT (.SourceTable)
	ENDIF
	THIS.cmdToExcel.Enabled = .lAllowEXCEL
	THIS.cmdClose.Enabled = .Closable
	THIS.cmdReload.Enabled = .lAllowReload
	IF EMPTY(.SourceTable) OR !USED(.SourceTable) OR EOF()
		THIS.cmdFirst.Enabled = .F.
		THIS.cmdPrior.Enabled = .F.
		THIS.cmdNext.Enabled = .F.
		THIS.cmdLast.Enabled = .F.
	ELSE
		m.lnRecno = RECNO()
		GOTO TOP
		m.lnRecno1 = RECNO()
		GOTO BOTTOM
		m.lnRecno2 = RECNO()
		GOTO (m.lnRecno)
		m.llBOF = (m.lnRecno = m.lnRecno1)
		m.llEOF = (m.lnRecno = m.lnRecno2)
		THIS.cmdFirst.Enabled = !m.llBOF
		THIS.cmdPrior.Enabled = !m.llBOF
		THIS.cmdNext.Enabled = !m.llEOF
		THIS.cmdLast.Enabled = !m.llEOF
	ENDIF
	THIS.cmdEdit.Enabled = .lAllowEd AND !EOF()
	THIS.cmdNew.Enabled = .lAllowNew
	THIS.cmdSave.Enabled = !.lAllowEdits
	THIS.cmdUndo.Enabled = !.lAllowEdits
	THIS.cmdPrint.Enabled = .PrintEnabled
	THIS.cmdDel.Enabled = .lAllowDelete
	THIS.cmdFind.Enabled = .lAllowFind
ENDWITH

С уважением, Алексей
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33579973
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей.

Спасибо.

Ещё вопрос, кто и как взводит свойства, например вот эти

Код: plaintext
1.
2.
3.
4.
5.
6.
THIS.cmdNew.Enabled = .lAllowNew
THIS.cmdToExcel.Enabled = .lAllowEXCEL
THIS.cmdClose.Enabled = .Closable
THIS.cmdReload.Enabled = .lAllowReload
THIS.cmdPrint.Enabled = .PrintEnabled
THIS.cmdDel.Enabled = .lAllowDelete
THIS.cmdFind.Enabled = .lAllowFind

Почему такой пристальный интерес, как раз сейчас пределываю свой FW.
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33580161
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в каждой форме приходится взводить свойства по разному, но как правило это выглядит след. образом:

.lAllowEXCEL = !EOF()
.PrintEnabled = !EOF()
.lAllowNew = .F. в методе добавления новой строки
и .T. при операции Save или Undo
.lAllowDelete - сильно зависит от самой формы: EOF(), права пользователя на удаление и пр. , а также = .F. если не зафиксировано изменения.
.lAllowFind - устанавливается на этапе дизайна формы и определяется наличием (или отсутствием) метода поиска для данной формы.
.Closable - меняется программно для искл. закрытия формы, когда выполняется что-то, что не позволяет закрыть форму (типа асинхронный SQL запрос).
THIS.cmdReload.Enabled почти всегда равен .T.

С уважением, Алексей
...
Рейтинг: 0 / 0
(Закрытие формы) А значения контролов были изменены
    #33580230
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно.

Тоже ручками. Ну ладно. Видать нет красивого решения.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / (Закрытие формы) А значения контролов были изменены
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]