:: Visual Foxpro, Foxpro for DOS
Re: Сохранить переменную типа Object в файл
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
покажи промежуточные результаты?

На четвертой странице, PUBLIC goEmpty.
Года три-четыре назад на этот объект он с полуоборота завелся, эрудицию у него не отнимешь
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> эрудицию у него него

() к кого "него" ) Живая вобщем
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
У ИК конечно.
Повоевал я с ним знатно.
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Ты тоже редко заглядываешь.
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
ИК надо не забыть (но придется). Но Лулгу вечнее )))
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
lulgu
У ИК конечно.
Повоевал я с ним знатно.
Прям "повоевал"? ) Самоуверенное такое мнение... )
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
Но Лулгу вечнее )))

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

Ладно, пока.



Исправлено 1 раз(а). Последнее : lulgu, 30.08.22 23:27
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
покажи

))



Исправлено 1 раз(а). Последнее : of63, 30.08.22 23:47
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
Taran

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
lulgu
У ИК конечно.
Повоевал я с ним знатно.

Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
lemenev
Таблицу Settings можно открывать в Init, а закрывать в Destroy, а вот как быть с SET-ами? Их приходится «дергать туда/сюда»
Непонятно.
Ведь в первом варианте ничего особенного с SETами делать не приходилось - устанавливались в Init, восстанавливались в Destroy.
Зачем надо дергать туда/сюда SETы в каждом методе?

lemenev
Эта таблица открывается монопольно исключительно из-за наличия PACK. Как красиво это обойти я пока не придумал. Вообще отказаться от сжатия и оставлять удалённые записи в таблице «навсегда»? Тогда во всех методах работы с таблицей нужно будет обходить удалённые записи. Можно выставить SET DELETED ON, но опять возвращаемся к проблеме настроек.
Не только PACK, но и INDEX.
Но PACK, конечно, не нужен (обычно такие команды выполняются "в особом режиме").
А после создания и индексации таблицы её надо сразу же закрыть и открыть как SHARE.

Что же касается SET DELETED ON, то я пока не встречал никого, кто бы писал свои приложения для режима DELETED OFF. Интересно было бы послушать их доводы в пользу OFF.

lemenev
Можно выставить SET DELETED ON, но опять возвращаемся к проблеме настроек.
А что за "проблема настроек" при режиме DELETED ON?



Исправлено 1 раз(а). Последнее : akvvohinc, 31.08.22 00:19
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
проблемы нет, просто в фоксе ( и в взрослых БД тоже) записи не уничтожаются сразу, безвозвратно. В фогксе они живут штатно, в БД друглго пошиба - считаются не существенными, после факта "удаления"
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
lemenev
Эта таблица открывается монопольно исключительно из-за наличия PACK. Как красиво это обойти я пока не придумал. Вообще отказаться от сжатия и оставлять удалённые записи в таблице «навсегда»? Тогда во всех методах работы с таблицей нужно будет обходить удалённые записи. Можно выставить SET DELETED ON, но опять возвращаемся к проблеме настроек.
Не только PACK, но и INDEX.
Но PACK, конечно, не нужен (обычно такие команды выполняются "в особом режиме").
А после создания и индексации таблицы её надо сразу же закрыть и открыть как SHARE.

Что же касается SET DELETED ON, то я пока не встречал никого, кто бы писал свои приложения для режима DELETED OFF. Интересно было бы послушать их доводы в пользу OFF.

lemenev
Можно выставить SET DELETED ON, но опять возвращаемся к проблеме настроек.
А что за "проблема настроек" при режиме DELETED ON?
А не пробовали так:
* где-то в начале
seleсt * from таблица_с_настройками_и_как_угодно_обозванная into cursor settings readwrite
use in таблица_с_настройками_и_как_угодно_обозванная
* где-то в конце
select * from settings into table таблица_с_настройками_и_как_угодно_обозванная
Какие еще сложности с Pack, Index, Exclusive, Create table?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
akvvohinc
lemenev
Таблицу Settings можно открывать в Init, а закрывать в Destroy, а вот как быть с SET-ами? Их приходится «дергать туда/сюда»
Непонятно.
Ведь в первом варианте ничего особенного с SETами делать не приходилось - устанавливались в Init, восстанавливались в Destroy.

Init, Destroy это события. Зачем нужно пихать методы в события?
Например, создайте метод DO, где и запускайте ваши процедуры.
И что у вас за проблемы с SET-настройками? Они и ведь и так глобальны.
Вроде я уже объяснял Тарану пример того, как можно с ними работать.
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
_vit

Сообщений: 5176
Дата регистрации: 29.07.2002
lemenev
Хочу подвести итог крайне интересной и поучительной для меня дискуссии.
...

Я бы сделал подругому.

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

Кроме того не вижу смысла и кроме того это создает дополнительные риски, создавать свойства/настройки динамически во время исполнения программы на основании данных хранилища.

Я бы сделал где-то так

Базовый класс:
******************************************
* Class Settings
******************************************
Define Class Settings As Custom
Protected settingsProvider
Procedure Init(toSettingsProvider As Object)
This.settingsProvider = toSettingsProvider
This.Reload()
Endproc
Procedure Destroy()
This.Save()
Endproc
Procedure Reload
Local laItem, laProperty(1), luValue
= Amembers(laProperty, This, 0, 'U')
For Each laItem In laProperty
If(This.settingsProvider.Deserialize(laItem, @luValue) = ERROR_SUCCESS)
This.AddProperty(laItem, luValue)
Endif
Endfor
Endproc
Procedure Save
Local laItem, laProperty(1)
= Amembers(laProperty, This, 0, 'U')
For Each laItem In laProperty
If(laItem != "SETTINGSPROVIDER")
This.settingsProvider.Serialize(laItem, Getpem(This, laItem))
Endif
Endfor
Endproc
Enddefine

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

******************************************
* Class mySettings
******************************************
Define Class mySettings As Settings
myProperty = "default"
appPath = "C:"
Procedure Error(tnError As Long, tcMethod As String, tnLine As Long)
? tnError, tcMethod, tnLine
*
*THROW eSettingsException
Endproc
Procedure Show
Local laItem, laProperty(1)
= Amembers(laProperty, This, 0, 'U')
For Each laItem In laProperty
If(laItem != "SETTINGSPROVIDER")
? laItem, Getpem(This, laItem)
Endif
Endfor
Endproc
Enddefine

Описываю провайдера хранилища в моем случае ini файл

******************************************
* Class SettingsProvider
******************************************
Define Class SettingsProvider As oldinireg
iniFile = "C:\temp\ini.ini"
iniSection = "Common"
Procedure Serialize(tcProperty As String, tuValue As Variant @) As Long
Return This.WriteIniEntry(tuValue, This.iniSection, tcProperty, This.iniFile)
Endproc
Procedure Deserialize(tcProperty As String, tuValue As Variant @) As Long
Return This.GetIniEntry(@tuValue, This.iniSection, tcProperty, This.iniFile)
Endproc
Enddefine


Или реестр

******************************************
* Class SettingsProviderReg
******************************************
Define Class SettingsProviderReg As registry
lookUpKey = "Software\MyApp\"
regKey = HKEY_CURRENT_USER
Procedure Serialize(tcProperty As String, tuValue As Variant @) As Long
Local retVal
This.OpenKey(This.lookUpKey,This.regKey, .T.)
retVal = This.SetKeyValue(tcProperty, @tuValue)
This.CloseKey()
Return retVal
Endproc
Procedure Deserialize(tcProperty As String, tuValue As Variant @) As Long
Local retVal
This.OpenKey(This.lookUpKey,This.regKey)
retVal = This.GetKeyValue(tcProperty, @tuValue)
This.CloseKey()
Return retVal
Endproc
Enddefine

Ну и обращение:
Настройки загружаются сразу при создании объекта класса и сохраняются при разрушении.

oProvider = Createobject("SettingsProvider")
oProvider.iniFile = "C:\temp\ini.ini"
oSettings = Createobject("mySettings", oProvider)
oSettings.Show()
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
_vit

Сообщений: 5176
Дата регистрации: 29.07.2002
Ну или аналогично с реестром.

oProvider = Createobject("SettingsProviderReg")
oProvider.lookUpKey = "Software\MyApp\"
oProvider.regKey = HKEY_CURRENT_USER
oSettings = Createobject("mySettings", oProvider)
oSettings.Show()

PS.
Приведение типов кстати я бы тоже вынес в отдельный класс или процедуру так как это задача общая не специфичная только для класса настроек.



Исправлено 1 раз(а). Последнее : _vit, 31.08.22 19:30
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
_vit
Я бы сделал подругому.

Извините, вы сами написали эти коды или откуда скопировали?
Дело в том, что этим громоздким классом Registry из FFC давно уже не пользуются - проще напрямую
использовать Winapi-функции и записать процедуры из ваших классов в Settins.
Нужные коды вы легко можете найти поиском.
Тогда они превратятся в аналоги вышеописанных процедур от ИК и сильно украсят решение от ТС.



Исправлено 2 раз(а). Последнее : lulgu, 31.08.22 21:15
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
_vit

Сообщений: 5176
Дата регистрации: 29.07.2002
Я использовал класс Registry из FFC и если потребуется буду использовать и
не вижу ни одной причины почему бы это не делать вновь.
Тема данного обсуждения не способ хранения, класс Registry указан у меня в качестве примера и для разнообразия.
(Хотя если честно я не могу придумать ни одного достоинства использования dbf в качестве места хранения настроек, скорее наоборот)
Я выразил свое мнение как раз в том что не надо "записать процедуры из ваших классов в Settins" а использовать объект класса провайдера хранилища
поскольку это придает гибкость.
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Попробуйте предъявить работу ваших провайдеров на примере какого-нибудь приложения.

ЗЫ. ini-файлы, реестр - вроде давно уже не экзотика.
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Например, когда у юзера нет прав на запись в реестр.

На мой взгляд, ini-шник нужен только, что бы знать куда ломиться за метаданными.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Сохранить переменную типа Object в файл
_vit

Сообщений: 5176
Дата регистрации: 29.07.2002
PaulWist
Например, когда у юзера нет прав на запись в реестр.

Это не совсем корректно. У юзера всегда есть права для записи в улей HKEY_CURRENT_USER.
Иначе бы винда не могла работать.
Да, на остальные ульи по умолчанию нет прав на запись но можно можно дать такие права на необходимую ветвь.
И в этом реестр не отличается от файловый системы.
Папка куда устанавливаются программы и где обычно хранятся файлы настроек тоже по умолчанию не имеет прав на запись для юзера без прав админа.
Вот где будет хранится таблица с настройками приложения?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 29 (Гостей: 29)

© 2000-2024 Fox Club 
Яндекс.Метрика