Просмотр или изменение в форме

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Просмотр или изменение в форме

Сообщение NewUser »

Не подскажет ли кто, как узнать следующее.
Имеется:
1. С6.3 АВС
2. Form, вызванная из Browse
3. Пользователь жмет на OK
Как узнать, были внесены изменения или был просто просмотр данных?
Заранее благодарен.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сообщение Дед Пахом »

можно при входе в форму сохранить File:Record, а при OK сравнить с текущим.
С уважением, ДП
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Сообщение NewUser »

Это первое, что пришло в голову. Cохранить я пытался в структуру:
SaveRecord Like(PRE:Record)
SaveRecord :=: PRE:Record
И при выходе из формы по ОК:
IF SaveRecord <> PRE:Record then …. .
Не срабатывает.

Хэлп же поведал мне о следующем:
«…Если существующая метка представляет структуру QUEUE, то оператор LIKE не создает новую структуру QUEUE, поскольку новая метка рассматривается просто как структура GROUP. Это справедливо и для случая, когда существующая метка представляет структуру RECORD….»
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Сообщение lsgsoftware »

Я что-то не понял.При нажатии ОК мы же возвращаемся в бровз и ты увидишь изменения.Если тебя интересует, записались ли данные на диск или остались в кэше винды, то это та еще проблема, которая явного решения не имеет.На клашины средства принудительного сброса типа flush NT-подобные версии винды плюют. Такая чехарда иногда может приводить к очень серьезным ошибкам, что у меня было и выходить из положения пришлось путем муторного ручного кода.
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Сообщение NewUser »

Задача следующая:
При нажатии пользователем на ОК в форме, программный код должен анализировать, были ли произведены изменения в форме или просто пользователь нажал на ОК, не внося изменений в поля формы.
Вот как это реализовать, просто и надежно – я и спрашивал.
Ощущаются два варианта:
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
С уважением, ДП
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Сообщение NewUser »

Да, совсем вылетела из головы History-структура:
IF PRE:Record <> History::PRE:Record Then … . – работает!
Но! Для имеющихся уже записей, при ПЕРВОМ открытии по ним формы и закрытии ее без изменений по ОК, выше приведенное условие дает истину! Почему? Далее – все нормально. Истина – только при изменении в полях формы. Но при первом входе-выходе…
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Сообщение NewUser »

Что-то не нашел я даже похожий код в форме
Дед Пахом писал(а):

Код: Выделить всё

    UnChanged = SELF.Primary.Me.EqualBuffer(SELF.Saved)
    IF UnChanged
      Error = 0
    ELSE
      Error = SELF.Primary.Update(CHOOSE(SELF.HistoryKey))
    END
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сообщение Дед Пахом »

ABWINDOW.CLW
С уважением, ДП
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Сообщение NewUser »

Для решения данной задачи остановился на следующем:
1. При открытии окна: History::PRE:Record :=: PRE:Record
2. При нажании на ОК : IF PRE:Record <> History::PRE:Record Then ... .
Все работает.
Всем огромное спасибо!
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Сообщение NewUser »

Дед Пахом писал(а):ABWINDOW.CLW
Выше приведенный код, на сколько я понял, относится к
WindowManager.SaveOnChangeAction, который в свою очередь отноститься к EIP?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сообщение Дед Пахом »

а, не знаю, к чему он относится, просто я увидел, что там есть механизм проверки, изменилась запись или нет. У WM Self.Saved определяет сохранённый буфер записи, а File.EqualBuffer сравнивает его с текущим.
С уважением, ДП
Аватара пользователя
Олег
Ветеран движения
Сообщения: 122
Зарегистрирован: 16 Июль 2005, 2:35
Откуда: Москва
Контактная информация:

Сообщение Олег »

Что-ты вы, коллеги, долго спорите о простейших вещах!
Подобная проверка УЖЕ встроена в ЛЮБЫЕ шаблоны.
В частности, в ШВС, если изменений полей primary-файла не было, то при любом выходе из формы всегда будет LocalResponse = RequestCancelled.
В ABC, судя по всему, аналогичная ситуация.

Что до предложения сохранять буфер файла и проверять его перед выходом, то следует ПРАВИЛЬНО выбрать место сохранения буфера файла. Ведь поля могут дополнительно изменятся еще до открытия окна формы в точках вставки. Если сохранить буфер до этих точек, то при закрытии формы проверка может показать True, даже если сам оператор ничего не изменил!
NewUser писал(а):Хэлп же поведал мне о следующем:
«…Если существующая метка представляет структуру QUEUE, то оператор LIKE не создает новую структуру QUEUE, поскольку новая метка рассматривается просто как структура GROUP. Это справедливо и для случая, когда существующая метка представляет структуру RECORD….»
А это тут при чем?! Ты же берешь за основу обычную группу а не очередь. И сравниваешь поля групп а не записи очередей.
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

Сообщение NewUser »

Олег писал(а):... в ШВС, если изменений полей primary-файла не было, то при любом выходе из формы всегда будет LocalResponse = RequestCancelled.
В ABC, судя по всему, аналогичная ситуация.
Что-то я не нашел данную аналогию в АВС. Там (в форме), если я правильно понял, RequestCancelled возвращается в том случае, если пользователь нажал или на Cancel, или Esc или на крестик в правом верхнем углу окна.
А это тут при чем?! Ты же берешь за основу обычную группу а не очередь. И сравниваешь поля групп а не записи очередей.
Тогда прошу продолжить лекбез.
Что здесь не правильно:
SaveRecord Like(PRE:Record)
SaveRecord :=: PRE:Record
И при выходе из формы по ОК:
IF SaveRecord <> PRE:Record then …. .
Почему не заработала данная конструкция?
Аватара пользователя
Олег
Ветеран движения
Сообщения: 122
Зарегистрирован: 16 Июль 2005, 2:35
Откуда: Москва
Контактная информация:

Сообщение Олег »

А кто сказал сказал, что она не заработала?!
Я же писал: главное - правильно найти точку вставки оператора SaveRecord = PRE:Record! Кстати, делать в данном случае :=: не нужно - по определению структуры обеих групп идентичны. И "глубокое присваивание" лишь замедлит выполнение.
К тому-же, как я писал уже давно в рассылке ClaList, в алгоритме "глубокого присваивания" есть ошибка - оно не корректно обрабатывает случаи наличия в группе подгрупп с одинаковыми полями. Правда, в данном случае этого не может быть - файл имеет префикс, поэтому компилятор предупредит о дублировании имен полей.
А сохранять буфер файла лучше всего в конце кода инициализации, непосредственно перед входом в ACCEPT-цикл. Если, конечно, по событию EVENT:OpenWindow не производится инициализация полей файла.

Вообщем, имхо - ошибка не в самой технологии, а в неправильном ее использовании!
Ответить