Форум » GUI » Работа с ini файлами в MiniGui ? » Ответить

Работа с ini файлами в MiniGui ?

Andrey: Решил сделать отдельную ветку, искал и не нашел аналогичные темы. Для работы с ини-файлами использую функции: *--------------------------------------------------------* STATIC Function GetIni( cSection, cEntry, cDefault, cFile ) RETURN GetPrivateProfileString(cSection, cEntry, cDefault, cFile ) *--------------------------------------------------------* STATIC Function WriteIni( cSection, cEntry, cValue, cFile ) RETURN( WritePrivateProfileString( cSection, cEntry, cValue, cFile ) ) Для записи/чтения в ини для числа nNumeric использую: WriteIni( cSection, cVal , HB_NToS(nNumeric), cFileIni ) nNumeric := VAL( GetIni( cSection , cVal , "0", cFileIni ) ) Для записи/чтения массива в ини - Григорий советует использовать: WriteIni( cSection, cVal , ATOC(aDim), cFileIni ) aDim := CTOA( GetIni( cSection , cVal , '{}', cFileIni ) ) Нужны еще функции: 1) Определения есть ли секция [MySection] в ини файле ? Григорий посоветовал: Function IsINISection(cIniFile, cName) Return ( cName $ _GetSectionNames(cIniFile) ) Что то не работает - выдает ошибку Error BASE/1109 Неверный аргумент: $ 2) Определения, есть ли переменная в этой секции ?

Ответов - 25, стр: 1 2 All

gfilatov2002: Andrey пишет: Что то не работает - выдает ошибку Проверьте другой вариант этой функции: Function IsINISection(cIniFile, cName) Return ( aScan( _GetSectionNames(cIniFile), cName ) > 0)

Haz: Andrey пишет: Определения есть ли секция возьми с оазиса исходник старого клипперовского IniFile.prg там есть все * IniIni() * IniSave() * IniPut() * IniGet() * IniDel() * IniExists() * IniCount()

Andrey: Haz пишет: возьми с оазиса исходник старого клипперовского IniFile.prg там есть все Да у меня есть работа с ини, включая блоки кода, массывы и т.д. - работающий и с русским языком. Просто хотелось бы для небольших программ на МиниГуи использовать стандартные функции. gfilatov2002 пишет: Проверьте другой вариант этой функции: Это заработало ! Спасибо ! А как насчет такой функции: 2) Определения, есть ли переменная в этой секции ?


Dima: [pre2] ret := hb_IniRead("TEST.INI" ) if hb_HHasKey(ret,'ТВОЯ СЕКЦИЯ') aHeader := ret['ТВОЯ СЕКЦИЯ'] if hb_hHaskey(aHeader, 'ТВОЯ ПЕРЕМЕННАЯ') ret1:=aHeader['ТВОЯ ПЕРЕМЕННАЯ'] endif endif [/pre2]

gfilatov2002: Andrey пишет: есть ли переменная в этой секции ? [pre2] Function IsVarINISection(cIniFile, cSecName, cName) Return ( aScan( _GetSection(cSecName, cIniFile), {|x| UPPER(x[1]) == UPPER(cName)} ) > 0 ) [/pre2]

Andrey: Функции есть, но не совсем то !!! Нужно жестко заданное условие. Например: Есть секция в ини-файле [Form_04], ищем секцию "Form_0" - существующая функция вернет .T. так как действительно есть такое вхождение. Есть переменная в ини: TbrColor_11=A 76C 58Цвет текста неа...... Переменную "TbrColor_1" переименовал в "TbrColor_" Ищем TbrColor_1 - существующая функция вернет тоже .T.

Dima: Andrey Давай разберем простой INI и простой пример к нему. Ждем. PS Похоже ты не разобрался.

Andrey: Dima пишет: Похоже ты не разобрался. Да, есть такое.... Функция IsVarINISection(cIniFile, cSecName, cName) - работает правильно ! А вот IsINISection(cIniFile, cName) - неправильно ! Пример здесь - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample

gfilatov2002: Andrey пишет: А вот IsINISection(cIniFile, cName) - неправильно ! Измените ее следующим образом Function IsINISection(cIniFile, cName) Return ( aScan( _GetSectionNames(cIniFile), {|x| UPPER(x) == UPPER(cName)} ) > 0 ) либо используйте в этом модуле команду SET EXACT ON

Andrey: gfilatov2002 пишет: Измените ее следующим образом То что надо. Спасибо БОЛЬШОЕ ! Теперь можно полностью пользоваться функциями работы с ини-файлами из МиниГуи !

Andrey: Пример работы с ини-файлами из МиниГуи отправил Григорию. Надеюсь он включит его в свою библиотеку. Подскажите до кучи, как кодовый блок записать в ини-файл ? Хотя бы в виде текстовой переменной....

Andrey: В программе использую кодировку HB_CODEPAGE_RU1251. При записи в ини-файл пишу значения на русском. При считывании с ини-файла на экране кракозябы !!! Как лечить ?

SergKis: Andrey пишет:Подскажите до кучи, как кодовый блок записать в ини-файл ? ini: MyBlock = {|a,b,c| MyFunc(a,b,c) } prg: cBlock := GetIni...., 'MyBlock' ) If left(cBlock, 1) == '{' .and. right(cBlock, 1) == '}' If '|' $ cBlock bBlock := &( cBlock ) Else aArray := &( cBlock ) EndIf EndIf

Andrey: SergKis пишет: cBlock := GetIni...., 'MyBlock' ) Самое трудное - WriteIni(..... ????

SergKis: Andrey пишет:Самое трудное - WriteIni(..... ???? в чем ? блок задаешь в prg строкой полюбому, вот и сохраняй ..., типа Func Def() массив преременных для работы - default Return если нет ini или секции - пишешь\создаешь в ini из Def() потом в нужных местах читаешь из ini если ini рабочий (у клиента) и ini из проекта (new версия) - при установке (смене) версии делаешь слияние и получаешь новый рабочий ini

Andrey: //////////////////////////////////////////////////////////////////////////////////////// // Цвет текста/фона по условию для отображения строки таблицы STATIC FUNCTION ListLinesColor(nText,nBack) LOCAL nI, cPoleOne, cPoleTwo LOCAL nBlack := MyRGB( BLACK ), nGray := MyRGB( GRAY ) LOCAL nRed := MyRGB( RED ), nBlue := MyRGB( BLUE ) LOCAL nYell := MyRGB( YELLOW), nWhit := MyRGB( WHITE ) LOCAL nRed2 := MyRGB( {235, 117, 123} ) // ярко красный nWhit := IIF(nBack == nWhit, MyRGB(PURPLE), nWhit ) cPoleOne := ALIAS()+"->NEVENT" cPoleTwo := ALIAS()+"->EVENT" // -------------------------- условия показа строк ------------------------------------ AADD(aClr2Usl, { { || DELETED() } , { nBlack, nGray } } ) // black/gray AADD(aClr2Usl, { { || &(cPoleOne) == 0 } , { nRed2, 255 } } ) // bright red/red AADD(aClr2Usl, { { || &(cPoleOne) == 1 } , { nBack, nWhit } } ) // background/White AADD(aClr2Usl, { { || &(cPoleOne) == 2 } , { nBack, nYell } } ) // background/yellow AADD(aClr2Usl, { { || &(cPoleOne) == 3 } , { nBack, nRed } } ) // background/red - error! AADD(aClr2Usl, { { || &(cPoleOne) == 4 } , { nBack, nGray } } ) // background/gray - removal! AADD(aClr2Usl, { { || &(cPoleOne) == 5 } , { nBack, nBlue } } ) // background/blue AADD(aClr2Usl, { { || LEN(ALLTRIM(&(cPoleTwo))) == 0 } , { nRed2, 128 } } ) // bright red/red AADD(aClr2Usl, { { || 1 == 1 } , { nBack, nText } } ) // background/text - other records Да вот хотел из prg держать в ини, чтобы измененять можно было. А при старте программы считывать (инициализировать) из ини-файла.

SergKis: Andrey пишет:Да вот хотел из prg так измени немного (можно др. массив): AADD(aClr2Usl, { "{ || DELETED() } , { nBlack, nGray }" } ) // black/gray AADD(aClr2Usl, { "{ || &(cPoleOne) == 0 } , { nRed2, 255 }" } ) // bright red/red ... AADD(aClr2Usl, { "{ || 1 == 1 } , { nBack, nText }" } ) // background/text - other records WriteIni(..,..., 'aClr2Usl', hb_valtoexp(aClr2Usl)) aClr2UclBlok := array(len(aClr2Usl)) или aClr2Usl := &( GetIni(...,..., 'aClr2Usl') ) и aeval(aClr2Usl, {|cV,nV| aClr2UclB[nV] := &( cV ) }) или наоборот имена массивов

SergKis: PS. это схема - не прими за рабочий текст слишком много буков в ночи

Andrey: SergKis пишет: так измени немного (можно др. массив): AADD(aClr2Usl, { "{ || DELETED() } , { nBlack, nGray }" } ) // black/gray Понял. Но не хотелось отходить от стандарта. Григорий тоже предлагал так, а я долблюсь в закрытые ворота.

SergKis: Andrey пишет:Но не хотелось отходить от стандарта не понял о чем ты ..., и не понял цель записи в ini: { { || DELETED() } , { nBlack, nGray } } или { { || LEN(ALLTRIM(&(cPoleTwo))) == 0 } , { nRed2, 128 } } через полгода, год будешь помнить что это ... и блок кода вряд ли будет меняться в выражении в ini надо выносить настройки, которые править редактором или с окна настроек: Black := {..., ..., ...} Gray := {..., ..., ...} Red := {..., ..., ...} Red2 := {..., ..., ...} ...

Haz: SergKis пишет: , и не понял цель записи в ini: согласен, а еще в открытый INI пользователь ткнет букву в этом блоке и поседеешь пока поймешь что случились вдруг с рабочей прогой

Andrey: SergKis пишет: не понял о чем ты Да хотел тупо в ини файл записать типа: { { || LEN(ALLTRIM(&(cPoleTwo))) == 0 } , { nRed2, 128 } } Нельзя так нельзя... Не особо страшно. Haz пишет: а еще в открытый INI пользователь ткнет букву в этом блоке У меня это отдельная настройка... И я вообще то свои ини-файлы кодирую, т.е. запрещаю юзерам там лазить. SergKis пишет: в ini надо выносить настройки, которые править редактором или с окна настроек: Согласен полностью. Да вот захотелось видно экстрима... А как насчет этого вопроса: В программе использую кодировку HB_CODEPAGE_RU1251. При записи в ини-файл пишу значения на русском. При считывании с ини-файла на экране кракозябы !!! Как лечить ?

Haz: Andrey пишет: В программе использую кодировку HB_CODEPAGE_RU1251. При записи в ини-файл пишу значения на русском. При считывании с ини-файла на экране кракозябы !!! Как лечить ? проверь в какой кодировке записано в INI hb_OemToAnsi() hb_AnsiToOem()

SergKis: Andrey пишет:И я вообще то свои ини-файлы кодирую, т.е. запрещаю юзерам там лазить. может тебе лучше тогда использовать hrb, как настройку, а не ini. Вынес в prg файл функцию получил hrb и пользуйся ...

SergKis: Andrey пишет:Как лечить ? я использую отдельные языковые ini в utf8 с BOM: prog1.lv [TXT] Kod = Kods Name = Nosaukums NameMat = Materiāli Kolvo = Daudzums Adr = Adrese prog1,ru [TXT] Kod = Код Name = Наименование NameMat = Материалы Kolvo = Кол-во Adr = Дом, адрес City = Город prog1.en ...



полная версия страницы