powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сохранение
21 сообщений из 21, страница 1 из 1
Сохранение
    #34110990
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На Grid1.Column2.Header1.Text1 прописал такой код
LPARAMETERS nKeyCode, nShiftAltCtrl
SELECT disp1
ON ERROR *
IF nKeyCode = 13
NODEFAULT
IF this.ReadOnly = .T.
this.ReadOnly = .F.
this.BackColor= RGB(104,166,179)
this.ForeColor= RGB(128,0,128)
this.FontBold = .T.
ELSE
If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
= TABLEUPDATE(.T.)
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif
this.BackColor= RGB(255,255,255)
this.ForeColor= RGB(0,0,0)
ENDIF
this.ReadOnly = .T.
ENDIF
endif
Чтобы по нажатию на enter вводились или изменялись данные ,по второму нажатию они сохранялись. Но проблема в том что пока форма открыта изменнённые данные видны ,если закрыть и открыть форму то изменённые данные иногда сохраняются , а иногда нет,т.е. ячейка остаётся пустой.
...
Рейтинг: 0 / 0
Сохранение
    #34111015
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
= TABLEUPDATE(.T.)

Вот здесь надо проверить, что вернула ф-ия, а так же хорошо использовать все параметры ф-ии включая алиас.
...
Рейтинг: 0 / 0
Сохранение
    #34111027
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Если хочешь изменять содержимое ячейки Grid-а, то зачем выдумывать велосипед. Прямо в Grid-е и изменяй. И обновляешь данные.
2. Если изменяются все записи этого поля, то лучше наверное вызывать новую форму при Click-е на заголовок колонки Grid-а. И при нажатии OK этой новой формы производишь изменения в таблице и соответственно в Grid-е.
...
Рейтинг: 0 / 0
Сохранение
    #34111064
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как именно проверить, я понимаю что через Debuger, но как ?
...
Рейтинг: 0 / 0
Сохранение
    #34111233
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при чем тут дебагер? Это обычная функция, возвращающая огическое значение.
...
Рейтинг: 0 / 0
Сохранение
    #34111269
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Код: plaintext
= TABLEUPDATE(.T.)

Вот здесь надо проверить, что вернула ф-ия, а так же хорошо использовать все параметры ф-ии включая алиас.
Я проверяю
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif и всегда при выполнении возникает надпись ('сохранено').Но после нового открытия формы новых значений нет.
...
Рейтинг: 0 / 0
Сохранение
    #34111325
МашкоБ.В. PaulWist
Код: plaintext
= TABLEUPDATE(.T.)

Вот здесь надо проверить, что вернула ф-ия, а так же хорошо использовать все параметры ф-ии включая алиас.
Я проверяю
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif и всегда при выполнении возникает надпись ('сохранено').Но после нового открытия формы новых значений нет.
Так это уже совсем другая проверка...
Вот если бы Вы проверили:
Код: plaintext
1.
2.
3.
IF TABLEUPDATE(.T.)
MESSAGEBOX('сохранено')
endif
тогда было бы совсем другое дело....
...
Рейтинг: 0 / 0
Сохранение
    #34111363
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С МашкоБ.В. PaulWist
Код: plaintext
= TABLEUPDATE(.T.)

Вот здесь надо проверить, что вернула ф-ия, а так же хорошо использовать все параметры ф-ии включая алиас.
Я проверяю
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif и всегда при выполнении возникает надпись ('сохранено').Но после нового открытия формы новых значений нет.
Так это уже совсем другая проверка...
Вот если бы Вы проверили:
Код: plaintext
1.
2.
3.
IF TABLEUPDATE(.T.)
MESSAGEBOX('сохранено')
endif
тогда было бы совсем другое дело....

Да я и так проверил выскакивает ('сохранено') но значение после перезапуска не появляется
...
Рейтинг: 0 / 0
Сохранение
    #34111459
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выхожу на асфальт в лыжи обутая,
то ли лыжи не едут, то ли ....


= TABLEUPDATE(.T.)
IF TABLEUPDATE()=.T.


это че за тайное шаманство?

один разочек это делать нужно

да и что за тайный смысл отслеживать
количество нажатий ентера?
наверное азбука морзе пишется
...
Рейтинг: 0 / 0
Сохранение
    #34112469
Solmyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
= TABLEUPDATE(0,.F.,"Data_head").
Он вам изменения может не в той таблице сохраняет. Вот и все. Укажите алиас. И второй параметр тоже поставьте какой надо.
А вообще действительно, прямо в гриде редактировать не пробовали?
...
Рейтинг: 0 / 0
Сохранение
    #34114123
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Solmyr= TABLEUPDATE(0,.F.,"Data_head").
Он вам изменения может не в той таблице сохраняет. Вот и все. Укажите алиас. И второй параметр тоже поставьте какой надо.
А вообще действительно, прямо в гриде редактировать не пробовали?

Послушав советов написал я такое Grid1.Column2.Header1.text1.keypress=
LPARAMETERS nKeyCode, nShiftAltCtrl
SELECT disp1
ON ERROR *
IF nKeyCode = 13
NODEFAULT
IF this.ReadOnly = .T.
this.ReadOnly = .F.
this.BackColor= RGB(104,166,179)
this.ForeColor= RGB(128,0,128)
this.FontBold = .T.
ELSE
If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
= TABLEUPDATE(0,.T.,"disp1.name")

this.BackColor= RGB(255,255,255)
this.ForeColor= RGB(0,0,0)
ENDIF
this.ReadOnly = .T.
ENDIF
endif

Но вводимые данные то отображаются, то нет.
А насчет прямого обращения через Grid, я что-то не понял, а я как обращаюсь?
...
Рейтинг: 0 / 0
Сохранение
    #34114453
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читай посты внимательнее и синтаксис посмотри ф-ии TableUpdate

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
If MESSAGEBOX("Сохранить изменения?", 4 + 32 ,"Сохранение") =  6 
 IF TABLEUPDATE( 0 ,.T.,"disp1")
       MESSAGEBOX('OK')
 ELSE
       MESSAGEBOX('BAD')
 ENDID
.......
ENDIF
...
Рейтинг: 0 / 0
Сохранение
    #34117408
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWistЧитай посты внимательнее и синтаксис посмотри ф-ии TableUpdate

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
If MESSAGEBOX("Сохранить изменения?", 4 + 32 ,"Сохранение") =  6 
 IF TABLEUPDATE( 0 ,.T.,"disp1")
       MESSAGEBOX('OK')
 ELSE
       MESSAGEBOX('BAD')
 ENDID
.......
ENDIF

Спасибо , я переписал так
LPARAMETERS nKeyCode, nShiftAltCtrl
SELECT disp1
ON ERROR *
IF nKeyCode = 13
NODEFAULT
IF this.ReadOnly = .T.
this.ReadOnly = .F.
this.BackColor= RGB(104,166,179)
this.ForeColor= RGB(128,0,128)
this.FontBold = .T.
ELSE
If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
IF TABLEUPDATE(0,.T.,"disp1")
MESSAGEBOX('OK')
ELSE
MESSAGEBOX('BAD')
endif
this.BackColor= RGB(255,255,255)
this.ForeColor= RGB(0,0,0)
ENDIF
this.ReadOnly = .T.
ENDIF
endif
Не помогло, я просмотрел таблицу после закрытия формы данные в ней присутствуют, но если занова запустить форму то данных втаблице нет.
Если кому несложно посмотрите (создайте несколько строк и заполните их через enter)
...
Рейтинг: 0 / 0
Сохранение
    #34118360
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Восстановить ON ERROR без всяких звездочек

2. Сюда, результаты
Код: plaintext
?Cursorgetprop('Buffering','disp1')

3. Зачем эта конструкция
Код: plaintext
IF this.ReadOnly = .T.
...
Рейтинг: 0 / 0
Сохранение
    #34189275
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist1. Восстановить ON ERROR без всяких звездочек

2. Сюда, результаты
Код: plaintext
?Cursorgetprop('Buffering','disp1')

3. Зачем эта конструкция
Код: plaintext
IF this.ReadOnly = .T.


?Cursorgetprop('Buffering','disp1') возвращает 5 т.е таблица в режиме оптимистической буферизации. Может надо как-то по другому вводить данные.

IF this.ReadOnly = .T. это надо для проверки , чтобы пользователь не ввел случайный стмвол ляпая по клавиатуре.

Помогите очень срочно надо.
...
Рейтинг: 0 / 0
Сохранение
    #34189860
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У любого визуального объекта FoxPro есть собственный буфер. Т.е., хотя и кажется, что введенная информация сразу попадает в поле таблицы, но на самом деле это не так.

Сначала, ты набираешь текст в объекте на форме. Далее, по определенному событию, происходит сброс набранного текста из буфера объекта в связанное с этим объектом поле таблицы.

Применительно к ячейке Grid этим событием является, в том числе, и нажатие клавиши Enter.

Однако первой же командой NODEFAULT ты говоришь FoxPro: оставь этот буфер где он есть. В самой ячейке. Не надо его переписывать в поле таблицы.

Дальнейший TableUpdate() уже ничего не меняет. Просто потому, что в буфер таблицы содержимое экранной ячейки просто не попало. Нечего сбрасывать из буфера таблицы.

В данном случае тебе надо озаботится принудительной записью текста, введенного в экранной ячейке в поле таблицы. Это можно сделать прямой командой REPLACE примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
If MESSAGEBOX("Сохранить изменения?", 4 + 32 ,"Сохранение") =  6 

	select disp1
	REPLACE name with This.Value

	IF TABLEUPDATE( 0 ,.T.,"disp1")
		MESSAGEBOX('OK')
	ELSE
	MESSAGEBOX('BAD')
	endif
endif

А почему все-таки иногда информация попадала? Потому, что не только нажатие Enter приводит к записи информации из буфера экранной ячейки в поле таблицы. Собственно, любой способ выхода из ячейки (почти) приводит к подобному сбросу. Повторное нажатие Enter как раз и приводило к записи информации.

Хотя, сама концепция организации редактирования не очень хорошая. Слишком не очевидная.
...
Рейтинг: 0 / 0
Сохранение
    #34191958
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Хотя, сама концепция организации редактирования не очень хорошая. Слишком не очевидная.
Я полностью согласен . Но Программа пишется для диспетчира(женщина)45-50лет. И ей надо как было в старой DOS-программе , я чтобы ввести что-то новое более удобное полдня ей объясняю , показываю что-так лучше.
...
Рейтинг: 0 / 0
Сохранение
    #34192716
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МашкоБ.В. ВладимирМ
Хотя, сама концепция организации редактирования не очень хорошая. Слишком не очевидная.
Я полностью согласен . Но Программа пишется для диспетчира(женщина)45-50лет. И ей надо как было в старой DOS-программе , я чтобы ввести что-то новое более удобное полдня ей объясняю , показываю что-так лучше.
С моей точки зрения, простое решение для пользоватиеля - что ввел в Grid, то и записалось. Никаких "дурацких" вопросов и сообщений. Никаких "подсветок". Глупости это все. Никто на них внимания не обращает, особенно "45-50 лет".

С точки зрения пользователя, что он видит на экране, то и должно быть сохранено в таблице. Это логично и понятно. А когда начинается: нажмите эту клавишу, дождитесь сообщения, прочтите сообщение, примите решение - у пользователя голова кругом и он не знает что делать. Просто в ступор впадает.

Для этой логики все проще. В событии BeforRowColChange, если переход на другую строку (свойство InList(Grid.RowColChange,1,3)=.T. ), то просто предпринимаем попытку сброса буфера по TableUpdate() безо всяких "дурацких" вопросов. А вот если НЕ удалось сбросить буфер, то NODEFAULT и "плакат" с сообщением об ошибке.
...
Рейтинг: 0 / 0
Сохранение
    #34192950
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot ВладимирМС моей точки зрения, простое решение для пользоватиеля - что ввел в Grid, то и записалось. Никаких "дурацких" вопросов и сообщений. Никаких "подсветок". Глупости это все. Никто на них внимания не обращает, особенно "45-50 лет".
Для этой логики все проще. В событии BeforRowColChange, если переход на другую строку (свойство InList(Grid.RowColChange,1,3)=.T. ), то просто предпринимаем попытку сброса буфера по TableUpdate() безо всяких "дурацких" вопросов. А вот если НЕ удалось сбросить буфер, то NODEFAULT и "плакат" с сообщением об ошибке.[/quot]
Наверное вы правы, если я правильно понял
то код должен быть таким
Grid.BeforRowColChange
LPARAMETERS nColIndex
if INLIST(thisform.grid1.RowColChange,1,3)=.T.
= TABLEUPDATE(0,.T.,"disp1")
thisform.grid1.Refresh
ELSE
MESSAGEBOX("ошибка")
ENDIF
endif
но текст не сохраняется,т.е. из буфера он исчезает. Не согли бы рассказать как правильно обрабатывать такие случаи.
Буду очень признателен.
...
Рейтинг: 0 / 0
Сохранение
    #34193262
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь та же проблема, что и в начальном вопросе. В событии BeforRowColChange() содержимое ячейки еще не переписано в буфер поля таблицы. Поэтому надо сделать это явно. Перенести код в AftreRowColChange() нельзя, поскольку в случае проблем сохранения надо будет блокировать выход из записи, а в AfterRowColChange() это делать уже поздно.

Код будет примерно таким

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
* Событие Grid.BeforRowColChange()
LPARAMETERS nColIndex
if INLIST(This.RowColChange, 1 , 3 )=.T. 

	* Запись текста из объекта в поле таблицы
	LOCAL lcFieldName
	lcFieldName = This.Columns(nColIndex).ControlSource
	if NOT This.Value == EVALUATE(m.lcFieldName)
		select disp1
		replace &lcFieldName with this.Value
	endif

	* Попытка сохранения
	if TABLEUPDATE( 0 ,.T.,"disp1")=.F.
		NODEFAULT	&& запрет на выход из строки
		MessageBox('Ошибка')
	endif
endif

Разумеется, код достаточно условный, но, думаю, дальше доработаешь по месту.
...
Рейтинг: 0 / 0
Сохранение
    #34194049
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ , большое вам спасибо за разъяснения и помощь.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сохранение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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