Просмотр или изменение в форме
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Просмотр или изменение в форме
Не подскажет ли кто, как узнать следующее.
Имеется:
1. С6.3 АВС
2. Form, вызванная из Browse
3. Пользователь жмет на OK
Как узнать, были внесены изменения или был просто просмотр данных?
Заранее благодарен.
Имеется:
1. С6.3 АВС
2. Form, вызванная из Browse
3. Пользователь жмет на OK
Как узнать, были внесены изменения или был просто просмотр данных?
Заранее благодарен.
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Это первое, что пришло в голову. Cохранить я пытался в структуру:
SaveRecord Like(PRE:Record)
SaveRecord :=: PRE:Record
И при выходе из формы по ОК:
IF SaveRecord <> PRE:Record then …. .
Не срабатывает.
Хэлп же поведал мне о следующем:
«…Если существующая метка представляет структуру QUEUE, то оператор LIKE не создает новую структуру QUEUE, поскольку новая метка рассматривается просто как структура GROUP. Это справедливо и для случая, когда существующая метка представляет структуру RECORD….»
SaveRecord Like(PRE:Record)
SaveRecord :=: PRE:Record
И при выходе из формы по ОК:
IF SaveRecord <> PRE:Record then …. .
Не срабатывает.
Хэлп же поведал мне о следующем:
«…Если существующая метка представляет структуру QUEUE, то оператор LIKE не создает новую структуру QUEUE, поскольку новая метка рассматривается просто как структура GROUP. Это справедливо и для случая, когда существующая метка представляет структуру RECORD….»
-
- Ветеран
- Сообщения: 311
- Зарегистрирован: 08 Июль 2005, 22:04
Я что-то не понял.При нажатии ОК мы же возвращаемся в бровз и ты увидишь изменения.Если тебя интересует, записались ли данные на диск или остались в кэше винды, то это та еще проблема, которая явного решения не имеет.На клашины средства принудительного сброса типа flush NT-подобные версии винды плюют. Такая чехарда иногда может приводить к очень серьезным ошибкам, что у меня было и выходить из положения пришлось путем муторного ручного кода.
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Задача следующая:
При нажатии пользователем на ОК в форме, программный код должен анализировать, были ли произведены изменения в форме или просто пользователь нажал на ОК, не внося изменений в поля формы.
Вот как это реализовать, просто и надежно – я и спрашивал.
Ощущаются два варианта:
1. Сохранить при входе в форму значение PRE:Record а при нажатии на ОК – проанализировать изменения.
2. Воспользоваться стандартными (если таковы имеются в АВС) средствами отслеживания данного события.
При нажатии пользователем на ОК в форме, программный код должен анализировать, были ли произведены изменения в форме или просто пользователь нажал на ОК, не внося изменений в поля формы.
Вот как это реализовать, просто и надежно – я и спрашивал.
Ощущаются два варианта:
1. Сохранить при входе в форму значение PRE:Record а при нажатии на ОК – проанализировать изменения.
2. Воспользоваться стандартными (если таковы имеются в АВС) средствами отслеживания данного события.
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
А в ABC вроде уже такой код проверки есть, по крайней мере похоже:
Код: Выделить всё
UnChanged = SELF.Primary.Me.EqualBuffer(SELF.Saved)
IF UnChanged
Error = 0
ELSE
Error = SELF.Primary.Update(CHOOSE(SELF.HistoryKey))
END
С уважением, ДП
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Да, совсем вылетела из головы History-структура:
IF PRE:Record <> History::PRE:Record Then … . – работает!
Но! Для имеющихся уже записей, при ПЕРВОМ открытии по ним формы и закрытии ее без изменений по ОК, выше приведенное условие дает истину! Почему? Далее – все нормально. Истина – только при изменении в полях формы. Но при первом входе-выходе…
IF PRE:Record <> History::PRE:Record Then … . – работает!
Но! Для имеющихся уже записей, при ПЕРВОМ открытии по ним формы и закрытии ее без изменений по ОК, выше приведенное условие дает истину! Почему? Далее – все нормально. Истина – только при изменении в полях формы. Но при первом входе-выходе…
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Что-то не нашел я даже похожий код в форме
Дед Пахом писал(а):Код: Выделить всё
UnChanged = SELF.Primary.Me.EqualBuffer(SELF.Saved) IF UnChanged Error = 0 ELSE Error = SELF.Primary.Update(CHOOSE(SELF.HistoryKey)) END
- Олег
- Ветеран движения
- Сообщения: 122
- Зарегистрирован: 16 Июль 2005, 2:35
- Откуда: Москва
- Контактная информация:
Что-ты вы, коллеги, долго спорите о простейших вещах!
Подобная проверка УЖЕ встроена в ЛЮБЫЕ шаблоны.
В частности, в ШВС, если изменений полей primary-файла не было, то при любом выходе из формы всегда будет LocalResponse = RequestCancelled.
В ABC, судя по всему, аналогичная ситуация.
Что до предложения сохранять буфер файла и проверять его перед выходом, то следует ПРАВИЛЬНО выбрать место сохранения буфера файла. Ведь поля могут дополнительно изменятся еще до открытия окна формы в точках вставки. Если сохранить буфер до этих точек, то при закрытии формы проверка может показать True, даже если сам оператор ничего не изменил!
Подобная проверка УЖЕ встроена в ЛЮБЫЕ шаблоны.
В частности, в ШВС, если изменений полей primary-файла не было, то при любом выходе из формы всегда будет LocalResponse = RequestCancelled.
В ABC, судя по всему, аналогичная ситуация.
Что до предложения сохранять буфер файла и проверять его перед выходом, то следует ПРАВИЛЬНО выбрать место сохранения буфера файла. Ведь поля могут дополнительно изменятся еще до открытия окна формы в точках вставки. Если сохранить буфер до этих точек, то при закрытии формы проверка может показать True, даже если сам оператор ничего не изменил!
А это тут при чем?! Ты же берешь за основу обычную группу а не очередь. И сравниваешь поля групп а не записи очередей.NewUser писал(а):Хэлп же поведал мне о следующем:
«…Если существующая метка представляет структуру QUEUE, то оператор LIKE не создает новую структуру QUEUE, поскольку новая метка рассматривается просто как структура GROUP. Это справедливо и для случая, когда существующая метка представляет структуру RECORD….»
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Что-то я не нашел данную аналогию в АВС. Там (в форме), если я правильно понял, RequestCancelled возвращается в том случае, если пользователь нажал или на Cancel, или Esc или на крестик в правом верхнем углу окна.Олег писал(а):... в ШВС, если изменений полей primary-файла не было, то при любом выходе из формы всегда будет LocalResponse = RequestCancelled.
В ABC, судя по всему, аналогичная ситуация.
Тогда прошу продолжить лекбез.А это тут при чем?! Ты же берешь за основу обычную группу а не очередь. И сравниваешь поля групп а не записи очередей.
Что здесь не правильно:
SaveRecord Like(PRE:Record)
SaveRecord :=: PRE:Record
И при выходе из формы по ОК:
IF SaveRecord <> PRE:Record then …. .
Почему не заработала данная конструкция?
- Олег
- Ветеран движения
- Сообщения: 122
- Зарегистрирован: 16 Июль 2005, 2:35
- Откуда: Москва
- Контактная информация:
А кто сказал сказал, что она не заработала?!
Я же писал: главное - правильно найти точку вставки оператора SaveRecord = PRE:Record! Кстати, делать в данном случае :=: не нужно - по определению структуры обеих групп идентичны. И "глубокое присваивание" лишь замедлит выполнение.
К тому-же, как я писал уже давно в рассылке ClaList, в алгоритме "глубокого присваивания" есть ошибка - оно не корректно обрабатывает случаи наличия в группе подгрупп с одинаковыми полями. Правда, в данном случае этого не может быть - файл имеет префикс, поэтому компилятор предупредит о дублировании имен полей.
А сохранять буфер файла лучше всего в конце кода инициализации, непосредственно перед входом в ACCEPT-цикл. Если, конечно, по событию EVENT:OpenWindow не производится инициализация полей файла.
Вообщем, имхо - ошибка не в самой технологии, а в неправильном ее использовании!
Я же писал: главное - правильно найти точку вставки оператора SaveRecord = PRE:Record! Кстати, делать в данном случае :=: не нужно - по определению структуры обеих групп идентичны. И "глубокое присваивание" лишь замедлит выполнение.
К тому-же, как я писал уже давно в рассылке ClaList, в алгоритме "глубокого присваивания" есть ошибка - оно не корректно обрабатывает случаи наличия в группе подгрупп с одинаковыми полями. Правда, в данном случае этого не может быть - файл имеет префикс, поэтому компилятор предупредит о дублировании имен полей.
А сохранять буфер файла лучше всего в конце кода инициализации, непосредственно перед входом в ACCEPT-цикл. Если, конечно, по событию EVENT:OpenWindow не производится инициализация полей файла.
Вообщем, имхо - ошибка не в самой технологии, а в неправильном ее использовании!