Отправлено: 19.09.21 11:57. Заголовок: Петр пишет возможные..
Петр пишет
цитата:
возможные проблемы с реализацией класса
В TKeyData это сделано специально, ключи как написано. Надо ли это в THmgData, по мне так не помешает, но может и не прав. Пример Скрытый текст
#define _HMG_OUTLOG #include "hmg.ch"
Function Main()
Local o := oHmgData(), h, e, a
o:Set(hb_readini("demo.ini")) for each e in o:GetAll() IF e[1] == [COM] h := oHmgData() h:Set(e[2]) for each a in h:GetAll() ? a:__enumIndex(), hb_valtoexp(a) next ENDIF next Return
demo.ini [COM] DiskArc = D:\eAlarm\BACKUP ; Archives storage location (files *.7z) PathArc = .\BAKS ; Archived copies daemon_*.7z for timing PathXml = .\XML ; directory for excel reporting PathBAK = .\BAK ; Auto loading files *.fdb from files *.bak ModeBAK = 1 ; 1 - delete fdb after loading fdb, 0 - no delete LoadBAK = 1 ; loaded: 0 - last bak, 1 - all bak files from directoy ModeFDB = 1 ; 1 - delete all dbf after loading fdb, 0 - no delete User = sysdba ; FDB user Password = masterkey ; FDB password TimerSek = 30 ; usage: 60*60 = 1 hour or 60*60*3 = 3 hours TimeLoad = 17:15:00 ; , 23:00:00-23:59:59 ; time load *.7z => *.bak Host = 127.0.0.1 ; Language = RU
результат 1 {"DiskArc", "D:\eAlarm\BACKUP ; Archives storage location (files *.7z)"} 2 {"PathArc", ".\BAKS ; Archived copies daemon_*.7z for timing"} 3 {"PathXml", ".\XML ; directory for excel reporting"} 4 {"PathBAK", ".\BAK ; Auto loading files *.fdb from files *.bak"} 5 {"ModeBAK", "1 ; 1 - delete fdb after loading fdb, 0 - no delete"} 6 {"LoadBAK", "1 ; loaded: 0 - last bak, 1 - all bak files from directoy"} 7 {"ModeFDB", "1 ; 1 - delete all dbf after loading fdb, 0 - no delete"} 8 {"User", "sysdba ; FDB user"} 9 {"Password", "masterkey ; FDB password"} 10 {"TimerSek", "30 ; usage: 60*60 = 1 hour or 60*60*3 = 3 hours"} 11 {"TimeLoad", "17:15:00 ; , 23:00:00-23:59:59 ; time load *.7z => *.bak"} 12 {"Host", "127.0.0.1 ;"} 13 {"Language", "RU"}
Отправлено: 19.09.21 12:48. Заголовок: Петр пишет Что именн..
Петр пишет
цитата:
Что именно не помешает?
Например сохранить с такими же ключами, т.е. работаем в больших ключах (доп. oHmgData()), а сохраняем по представленному выше в связке на дополнительный. Есть или нет такой вариант в THmgData большого значения не имеет, по мне.
цитата:
FUNCTION hb_iniReadStr( cData, lKeyCaseSens, cSplitters, lAutoMain )
LOCAL hIni := { => }
/* Default case sensitiveness for keys */ hb_default( @lKeyCaseSens, .T. ) hb_default( @lAutoMain, .T. )
hb_HCaseMatch( hIni, lKeyCaseSens )
не очень понял что хотели сказать. В моем примере имеем ключи, как написано, т.е. они не доступны ? h:Host, h:Port Но если есть oHmgData() в upper, то в связке можно сохранить ini в таком же виде (ключи) с новыми значениями т.е. ваш пример
o := YATHmgData():New( .f. ) o:Set( h )
? "YATHmgData() ***",o:_FormMain
s_ObjTest( o )
даст YATHmgData() *** NIL вариант o := YATHmgData():New( .t. ) o:Set( h )
Отправлено: 19.09.21 13:20. Заголовок: SergKis пишет: В мо..
SergKis пишет:
цитата:
В моем примере имеем ключи, как написано, т.е. они не доступны ? h:Host, h:Port Но если есть oHmgData() в upper, то в связке можно сохранить ini в таком же виде (ключи) с новыми значениями
Port конечно, его нет в ini. Если хотите получить h:Host просто оформите вызов hb_readini как hb_readini("demo.ini", .f.)
Отправлено: 19.09.21 13:26. Заголовок: Петр пишет Port коне..
Петр пишет
цитата:
Port конечно, его нет в ini.
Это да, но Host есть. Основная методика работать не :Set(), :Get(), а o:<char имя ключа>, hb_readini() просто для примера, показать ключи, как написано.
Отправлено: 19.09.21 13:54. Заголовок: Петр пишет: Это да,..
Петр пишет:
цитата:
Это да, но Host есть.
Петр пишет:
цитата:
Если хотите получить h:Host просто оформите вызов hb_readini как hb_readini("demo.ini", .f.)
? h:Host, h:Port 127.0.0.1 ; NIL
SergKis пишет:
цитата:
Основная методика работать не :Set(), :Get(), а o:<char имя ключа>
Это ваша методика и вам ее никто не запрещает использовать. Но я ее не обязан использовать, как и не обязан запоминать в каком регистре у меня описаны секции в ini файле.
Вы можете писать классы, методы которых дублируют друг друга, вы можете писать код заточенный под ваши нужды. Но, поскольку все это находится в общедоступной открытой библиотеке, я могу задавать вопросы, а вы можете не отвечать на них или давать уклончивые ответы
Вы можете объяснить поведение класса THmgData в моем примере, я решил использовать регистронезависимый поиск - установил lUpp в .T., почему я не могу получить ожидаемый результат?
Извините. Я же не знаю для каких целей так делаете o:Set( hb_Hash( "_FormMain", 1, "_FormAbout", 200 ) ) может так и надо, как с hb_readini() я проделал
Отправлено: 21.09.21 00:18. Заголовок: Петр пишет Версия TH..
Петр пишет
цитата:
Версия THmgData для выпуска 21.09.
Наверно надо сказать, что закладывал. 1. oHmgData(.F.) - работа по строгим именам переменных, т.е. как написано 2. oHmgData(.T.) - аналог public\private переменных имена\ключи в больших буквах сразу Метод Set, сначала, ловил Hash и Array и проделывал все с учетом :lUpp, потом это убрал, так как можно все проделать внешними AEval или FOR. Основная работа :Set(), :Get(), :Del(), :CloneHash(), :GetAll(), + o:<имя_переменной> :Set( hb_Hash(...) ) надо давать с использованием hb_hCaseMatch(), при .f. строгие имена, ::lUpp := .F. Для oHmgData(.T.) o:Set( hb_Hash( "_FormMain", 1, "_FormAbout", 200 ) ) и мой hb_readini() нормальная ситуация создания защищенных данных, т.е. не доступны :Set(), :Get(), :Del(), но доступны :GetAll(), :CloheHash(). Из защищенных данных можно создать другой :lUpp := .T. или писать в o h := oHmgData(.t.) for ech a in o:GetAll() ; h:Set(a[1], a[2]) next потом менять в h и в конце связать o и h по ключам, что то проделав с данными из o и h, ключ из o Мне, например, такие варианты были нужны. PS Основное это :CloneHash(), а :Set( hb_Hash(...) ) это побочка, т.е. (вся ответственность на человеке) h := o:CloneHash() меняем в o значения, что то делаем на их основе возвращаем o:Set( h )
цитата:
Мало что даст
Согласен, но подумал, что может никому, кроме меня, не нужна работа по строгим именам
цитата:
o:Set( hb_Hash( "_FormMain", 1, "_FormAbout", 200 ) ) Просто тестировал класс
Самый первый пример отработал как надо и я не мог врубиться в суть вопроса
Не уверен, что это надо, т.к. для внешнего Hash можно использовать весь набор ф-й для работы с Hash. o:Set( hb_HSort( o:CloneHash() ) ) o:Set( hb_HFill( o:CloneHash(), "" ) ) или пополнять методами THmgData, так только недавно их убирал, в TKeyData они есть PS Всегда можно сделать свой класс с расширенными возможностями CLASS TVarData INHERIT THmgData
Все даты в формате GMT
3 час. Хитов сегодня: 2084
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет