cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход или Регистрация

 
 
  ГлавнаяСправкаПоискВходРегистрация  
 
Страниц: 1 2 
Послать Тему Печать
Вопрос по событию DataChanged (Прочитано 891 раз)
psv1904
Опытный пользователь
***
Вне Форума



Сообщений: 98
Самара
Вопрос по событию DataChanged
09.04.2020 :: 09:35:04
 
В форме ввода получаю запись для коррекции.
Проверяю Me.поле8_1.Text, что бы после изменения его значения оно не было =0.
Если =0, то должно вернуться первоначальное значение.

function поле8_1_DataChanged( control, data )
local rt= true
if Me.поле8_1.Text==0 then rt=false end
return rt
end

Изменяю значение на 0 , выхожу из поля и проверка проходит по первоначальному значению, а не по измененному !!!
Не понимаю, хотя в инструкции написано:
Событие DataChanged позволяет отслеживать изменения значения элемента ввода. Это событие происходит
при выходе фокуса из элемента, но только в том случае, если первоначальное значение элемента было изменено.
Под первоначальным понимается значение, содержавшееся в элементе до перевода на него фокуса ввода (активизации).
...
Если возвращается False, введенное значение считается неверным и восстанавливается первоначальное значение элемента.

Что не так делаю?
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 741
Санкт-Петербург
Re: Вопрос по событию DataChanged
Ответ #1 - 09.04.2020 :: 13:38:52
 
В поле находится текстовое значение, а Вы его пытаетесь сравнить с числовым.
Наверх
 
 
IP записан
 
psv1904
Опытный пользователь
***
Вне Форума



Сообщений: 98
Самара
Re: Вопрос по событию DataChanged
Ответ #2 - 09.04.2020 :: 15:24:05
 
приведение к одному типу ничего не дает!
Наверх
 
 
IP записан
 
psv1904
Опытный пользователь
***
Вне Форума



Сообщений: 98
Самара
Re: Вопрос по событию DataChanged
Ответ #3 - 09.04.2020 :: 16:03:12
 
что бы посмотреть,  что находится в поле после замены его первоначального на 0,
вставил в событие DataChanged сообщение MsgBox(Me.поле8_1.Text)
и что Вы думаете - там первоначальное, а не 0!
Пытался комбинировать с function поле8_1_FocusLeave( control ), так
сначала выполняется DataChanged, а потом FocusLeave
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 741
Санкт-Петербург
Re: Вопрос по событию DataChanged
Ответ #4 - 09.04.2020 :: 17:19:59
 
Можно попробовать так.
Код:
function поле8_1_DataChanged( control, data )
return tonumber(data)~=0
end 

Наверх
 
 
IP записан
 
psv1904
Опытный пользователь
***
Вне Форума



Сообщений: 98
Самара
Re: Вопрос по событию DataChanged
Ответ #5 - 09.04.2020 :: 18:30:16
 
спасибо, получилось.
но как быть в DataChanged с текстовым полем, если надо проверить (if...then, string.field и т.д.),
что бы в нём обязательно последними были 2-е цифры?
и, все-таки, почему написанный выше скрипт не работает?
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 741
Санкт-Петербург
Re: Вопрос по событию DataChanged
Ответ #6 - 09.04.2020 :: 19:27:20
 
Чтобы понять как правильно сделать, надо понять как работает.
1. Вы работаете с элементом FieldControl, поэтому получать значение лучше control.Value, а не Me.поле8_1.Text.
2. В событие DataChanged передаются control - элемент, data - измененное значение, а также объект event - событие. В функции обработки события можно получить control.Value - первоначальное значение и data - измененное, которое и нужно анализировать. Например,
Код:
if data:match("%d") then
		MsgBox("Измененное значение содержит цифры")
	else
		MsgBox("Измененное значение цифры не содержит")
	end 

Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 741
Санкт-Петербург
Re: Вопрос по событию DataChanged
Ответ #7 - 09.04.2020 :: 19:31:09
 
Ваш скрипт можно изменить так
Код:
local rt= true
if tonumber(data)==0 then rt=false end
return rt 

Наверх
 
 
IP записан
 
psv1904
Опытный пользователь
***
Вне Форума



Сообщений: 98
Самара
Re: Вопрос по событию DataChanged
Ответ #8 - 09.04.2020 :: 20:18:24
 
спасибо, вот теперь понятно. буду пробовать.

всё-таки хотелось бы иметь хороший учебник с примерами и пояснениями.
вся документация от Cronos написана так себе, без вдохновения.
хоть бы видео курсы сделали.
на форуме много примеров и ответов, но найти....
только не говорите, что только упорный труд сделал из юзера программиста
Наверх
 
 
IP записан
 
psv1904
Опытный пользователь
***
Вне Форума



Сообщений: 98
Самара
Re: Вопрос по событию DataChanged
Ответ #9 - 12.04.2020 :: 17:02:46
 
здесь для проверки правильности ввода (из моей практики) лучше использовать одну конструкцию: if then ...elseif ... end
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 741
Санкт-Петербург
Re: Вопрос по событию DataChanged
Ответ #10 - 12.04.2020 :: 21:20:06
 
Конструкцию if then ...elseif ... end если и использовать, то в виде if then ...elseif ... then ... else... end и в случаях многовариантности анализируемого значения. В Вашем случае нужно проверить только одно значение 0 или не 0, поэтому смысла использовать более сложные конструкции нет. Если 0, то   ложь, в любом другом случае истина.
Наверх
 
 
IP записан
 
Mit
Опытный пользователь
***
Вне Форума


Περσεύς

Сообщений: 62
Re: Вопрос по событию DataChanged
Ответ #11 - 03.07.2020 :: 12:10:42
 
Дальнейший вопрос по событию DataChanged( control, data ).
Условие:
есть поле11 базы  типа файл и список (List_files) на одной форме.
список заполняется наименованиями файлов из поля базы:
     Me.List_files:Clear()
     local  t_file=Me.Record:GetValue(6,0,"fullname")
     for k,v in ipairs(t_file) do Me.List_files:Add(k..". "..v) end

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

Так вот, любой код в
function поле11_DataChanged( control, data )
              return true;
end
сначала исполняется, а после этого значение добавляется в поле.
т.е. если, например добавить код MsgBox(data),
то при выполнении - добавлении файла путем перетаскивания сначала появится уведомление с названием файла, а только потом в поле будут внесены изменения.
В этом то и вопрос, как сделать так. что бы возможно было обновить список файлов в List_files после того, как изменится поле базы? Озадачен

пысы:
планировал так
function updatelistfile() -- обновление списка файлов
     Me.List_files:Clear()
     local  t_file=Me.Record:GetValue(6,0,"fullname")
     for k,v in ipairs(t_file) do Me.List_files:Add(k..". "..v) end
end
function поле11_DataChanged( control, data )
     updatelistfile()
     return true;
end
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 741
Санкт-Петербург
Re: Вопрос по событию DataChanged
Ответ #12 - 03.07.2020 :: 16:40:09
 
Почитайте материалы:
1.
2..
Вы смешиваете работу с основным банком и виртуальным в виде форм ввода.
Наверх
 
 
IP записан
 
Mit
Опытный пользователь
***
Вне Форума


Περσεύς

Сообщений: 62
Re: Вопрос по событию DataChanged
Ответ #13 - 08.07.2020 :: 07:52:50
 
Спасибо, наставник, уяснил))
Но, все равно не все
сделал так:

function updflaftchng() -- обновление списка файлов после изменения в поле файлов
     Me:SaveRecord()
     Me.Record:Update()
     updatelistfile() -- обновление списка файлов
end
function updatelistfile() -- обновление списка файлов
     Me.List_files:Clear()
     local  t_file=Me.Record:GetValue(6,0,"fullname")
     for k,v in ipairs(t_file) do Me.List_files:Add(k..". "..v) end
end
function кнопка17_Click( control )
  updflaftchng()
end

По нажатию кнопки все океюшки, список файлов обновлен. А вот как сделать эту же процедуру без нажатия.

Заложил выполнение updflaftchng() в function поле11_DataChanged( control, data ) и все равно вернулся к тому, от чего начал. Обновления не происходит.
Нашел только одну причину этого всего. Скажу словами преподавателя в одном институте, где обучался кроносу - надо чаще программировать )
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 741
Санкт-Петербург
Re: Вопрос по событию DataChanged
Ответ #14 - 08.07.2020 :: 21:30:23
 
А у Вас список файлов только в элементе Me.List_files или ещё и в другом? Как он формируется при открытии формы и переходе по записям? Как осуществляется выбор и добавление файлов?
Так или иначе Вы не поняли (не уяснили) работу.
Вот Ваш код без использования отдельных функций:
Код:
 Me:SaveRecord() -- здесь Вы сохраняете данные виртуального банка (формы ввода) в основной
     Me.Record:Update() -- здесь обращаетесь к только что модернизированной записи основного банка для обновления. А обновлять то нечего. Да и запись должна быть заблокирована, пока она привязана к форме
     local  t_file=Me.Record:GetValue(6,0,"fullname") -- получаете имена файлов из записи основного банка
     for k,v in ipairs(t_file) do Me.List_files:Add(k..". "..v) end -- заполняете именами файлов список 


Обновлять запись основного банка и список виртуального лучше после выбора и результативного добавления/удаления файлов по кнопке.
Наверх
 
 
IP записан
 
Страниц: 1 2 
Послать Тему Печать