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

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

VFP9, WinXPSP2

Спасибо.
...
Рейтинг: 0 / 0
28.02.2006, 08:19
    #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
03.03.2006, 02:18
    #33578625
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Закрытие формы) А значения контролов были изменены
Hi JuniorFoxik!

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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
03.03.2006, 06:56
    #33578714
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Закрытие формы) А значения контролов были изменены
JuniorFoxik...На форме множество ТекстБоксов. Пользователь изменил значение нескольких (или одного), не сохранил и пытается закрыть форму. Как с минимальными затратами это отследить?...На мой взгляд нужно разобрать еще случай: user изменил контролы, но информацию нехочет сохранять. Поэтому я лично поступаю так: на форме блокирую крестик (в правом верхнем углу формы) и ставлю на форму две кнопки <Принять> и <Отмена>, с выходом по клавише Esc на <Отмена>. И на Click-е кнопки <Принять> делаю сохранение. Поэтому твой вопрос: "Как с минимальными затратами это отследить?" У меня решается принятием решения самим User-ом.
...
Рейтинг: 0 / 0
03.03.2006, 11:28
    #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
03.03.2006, 12:35
    #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
03.03.2006, 13:28
    #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
03.03.2006, 13:46
    #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
03.03.2006, 14:21
    #33580161
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Закрытие формы) А значения контролов были изменены
А в каждой форме приходится взводить свойства по разному, но как правило это выглядит след. образом:

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

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

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


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