Проблема сохранения информации в Blob

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Stalker
Активист
Сообщения: 128
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Поблагодарили: 1 раз
Контактная информация:

Проблема сохранения информации в Blob

Сообщение Stalker »

Привет всем!
Народ отзовись, необходима помощь. Поиск по форуму не дал необходимых результатов.
Имеется:
С 63 Tx text контрол 13
При редактировании формы в поле Блоб (OLE объект)различными способами заводится информация (через загрузку doc, RTF файлов в основном). При первом добавлении записи информация сохраняется и просматривается коректно. Но после редактирования ее иногда вылетает серое окно. То есть информация исчезает и вместо нее в Тx Text контроле ничего не остается, хотя информация в других полях , в том числе и ID записи сохраняется. Окно имеет серый цвет. Причем данное окно может появится после однократного редактирования, а может проявится после 3-4 редактирований информации в поле, либо просто при открытии формы и закрытии ее без редактирования при нажатии на кнопку Ок.
При нажатии на кнопку Ок прописано стандартное сохранение записи в поле Блоб контрола Тх Техт типа
класcSafe(поле блоб)
Если кто сталкивался с подобным помогите. Тх Техт только осваиваю опыта пока нет.
С уважением Stalker
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема сохранения информации в Blob

Сообщение Yufil »

Ты пользуешься классом или ручками делаешь?

Правильно делать так
Сохранение:
Blob{Prop:Size}=0
Blob{Prop:Handle}=TextControl{Prop:Blob}

Восстановление
TextControl{Prop:Blob}=Loc:Blob{Prop:Handle}

Вроде выкладывал на файлохранилище класс и шаблон... Если нет - пиши на yufil@mail.ru
Igor
Бывалый
Сообщения: 75
Зарегистрирован: 08 Июль 2005, 11:03
Откуда: Королев

Re: Проблема сохранения информации в Blob

Сообщение Igor »

Может быть при сохранении формы на рабочей станции не установлен TX Control?
(P.S. У меня такое бывает. Это полная ... )
Igor Vesnin
Посетитель
Сообщения: 49
Зарегистрирован: 30 Декабрь 2005, 0:06

Re: Проблема сохранения информации в Blob

Сообщение Igor Vesnin »

Igor писал(а):Может быть при сохранении формы на рабочей станции не установлен TX Control?
(P.S. У меня такое бывает. Это полная ... )
Есть простой способ обхождение этого.
При открытии ставить флажок в 0, скажем FlagChange=0
По событию Change устанавливаешь 1, FlagChange=1
Ну сохраняешься только когда 1.
В этом случае, и если не установлен контрол, и если пользователь только посмотрел ничего не сохраняется.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема сохранения информации в Blob

Сообщение Yufil »

Я обычно в начале работы программы регистрю контрол заново

UnlockThread()
Call('TX4OLE12.OCX','DllUnRegisterServer')
Call('TX4OLE12.OCX','DllRegisterServer')
LockThread()

Занимает 2-3 секунды, зато гарантирует ( ну, скажем так, слегка повышает) уверенность в том, что контрол заренистрирован....
Stalker
Активист
Сообщения: 128
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема сохранения информации в Blob

Сообщение Stalker »

Всем, кто ответил большое спасибо. Просто был в диких джунглях, где нетом и не пахнет.

Первое .
Ты пользуешься классом или ручками делаешь?

ответ:
Дописываю по событию Ок (Accepted) сохранение формы такую строку
if поле1 = 1 !условие на сохранение в блоб
TxClass.SaveBlob(поле блоб)
end

поле1 заполняется при первом добавлении значением 1 (short)
в дальнейшем оно не редактируется имеет значение 1 , а частично редактируется блоб поле

Второе!
Правильно делать так
Сохранение:
Blob{Prop:Size}=0
Blob{Prop:Handle}=TextControl{Prop:Blob}

Восстановление
TextControl{Prop:Blob}=Loc:Blob{Prop:Handle}

С этим проверю, примерно так делаю когда копирую информацию в промежуточный файл для копиррования учебников, там информация вся сохраняется коректно.
примерно так
if поле1 =1
Get(kat_bak,Kat1:Key_katalog)
blob1{PROP:HANDLE}=blob2{PROP:HANDLE}
if errorcode()=80
MESSAGE('ОШИБКА БЛОБ')
BREAK
END
blob1{PROP:SIZE}=blob2{PROP:SIZE}
END !if поле1 =1

ТРЕТЬЕ:
Может быть при сохранении формы на рабочей станции не установлен TX Control?
(P.S. У меня такое бывает. Это полная ... )

Вероятность почти нулевая , так как другие записи просматриваются, и работаю на одном компе.Хотя некоректное сохранение может и что то на определенное время и выбивает в Тх контроле, пока и не перейду к другой записи где ОСХ объкт (tx4ole13.ocx)как бы восстанавливается.Для просмотра используется MultiReltree объект, записи выводятся в виде дерева.

ЧЕТВЕРТОЕ:

Есть простой способ обхождение этого.
При открытии ставить флажок в 0, скажем FlagChange=0
По событию Change устанавливаешь 1, FlagChange=1
Ну сохраняешься только когда 1.
В этом случае, и если не установлен контрол, и если пользователь только посмотрел ничего не сохраняется.

Нужно проверить.


ПЯТОЕ:
Я обычно в начале работы программы регистрю контрол заново

UnlockThread()
Call('TX4OLE12.OCX','DllUnRegisterServer')
Call('TX4OLE12.OCX','DllRegisterServer')
LockThread()

Занимает 2-3 секунды, зато гарантирует ( ну, скажем так, слегка повышает) уверенность в том, что контрол заренистрирован....


Тоже надо поэкперементировать

ШЕСТОЕ.
Большое спасибо всем кто откликнулся. С уважением Stalker.
Специализация - программы для образования, делопроизводство, складской учет
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема сохранения информации в Blob

Сообщение Yufil »

В Кларионе есть одна неприятная вещь. Дело в том, что при обновлении записи шаблон ABC проверяет - вдруг эта запись не изменялась и её не стоит перезаписывать. Причём блобы в эту проверку не входят. Поэтому если мы должны перезаписывать только блобполя, надо обновить что-то ещё. Обычно приходится добавлять в список полей дату-время последнего обновления...
Stalker
Активист
Сообщения: 128
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема сохранения информации в Blob

Сообщение Stalker »

Спасибо Бальшой Гуру за помощь!

В Кларионе есть одна неприятная вещь. Дело в том, что при обновлении записи шаблон ABC проверяет - вдруг эта запись не изменялась и её не стоит перезаписывать. Причём блобы в эту проверку не входят. Поэтому если мы должны перезаписывать только блобполя, надо обновить что-то ещё. Обычно приходится добавлять в список полей дату-время последнего обновления...

В форму ввел поле , которое заполняется через датчик случайных чисел и меняется при открытии формы. В файле где было одно поле Блоб глюки прекратились.

В другом файле в записи имеется четыре поля Блоб, которые заполняются и редактируются .
Глюки уменьшились , но все же остались. Такое впечатление, что где-то имеется недоработка (может в классе) при сохранении и сжатии Блоб, если этих Блоб в записи несколько.

Stalker.
Специализация - программы для образования, делопроизводство, складской учет
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема сохранения информации в Blob

Сообщение Yufil »

1. Ну, я неоднократно сталкивался с неверной передачей в процедуру параметров *Blob. И с разрушением Blob-полей при выполнении Access:File.Open() - Access:File.Close() притом, что буфер записи не менялся.

2. Недавно натолкнулся на проблему (раньше всё работало) - при нулевой длине блоба конструкция
BlobField[0 : BlobField{Prop:Size}-1] начала давать сбои :(

3. Иметь 4 блоба в одной записи - я бы не рискнул, пожалуй, для TPS-файла это чересчур...

4. Класс и шаблоны в исходниках, всегда можно посмотреть, что там и где.
Ответить