Форум » GUI » Примеры из Минигуи -ошибки, вопросы..... (продолжение) » Ответить

Примеры из Минигуи -ошибки, вопросы..... (продолжение)

Andrey: Всем привет. Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые.... Очень красочный пример: \MiniGUI\SAMPLES\Advanced\AVI_Animation - не работает под Win7 (наверно AVI-шки нет в ресурсах) Предложение Григорию: Можно ли добавить еще один пример с отдельным AVI-файлом в ресурсах проекта и показом такого же бегунка ? Пример: \MiniGUI\SAMPLES\Advanced\DisplayMode - не работает под ХР и далее.... Пример: \MiniGUI\SAMPLES\Advanced\Tsb_filter - вылетает на ХР -------------------------------------------------------------------------------- Harbour MiniGUI Errorlog File Harbour MiniGUI Extended Edition 2.0.1 - 2011.09.21 -------------------------------------------------------------------------------- Date: 11/15/2011 Time: 22:13:24 Error BASE/1124 Argument error: LEFT Called from LEFT(0) Called from SCANSOFT(195) Called from MAIN(84) Пример: \MiniGUI\SAMPLES\BASIC\MsgEdit - не собирается... Z:\MiniGUI\SAMPLES\BASIC\MsgEdit>call ..\..\..\batch\compile.bat demo /L shell32 Harbour 3.1.0dev (Rev. 17042) Copyright (c) 1999-2011, http://harbour-project.org/ Compiling 'demo.prg'... Lines 20133, Functions/Procedures 30 Generating C source output to 'demo.c'... Done. Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland demo.c: Error E2141 demo.prg 993: Declaration syntax error *** 1 errors in Compile *** C compile error.

Ответов - 230, стр: 1 2 3 4 5 6 7 8 9 10 11 12 All

Andrey: Haz пишет: Там же написано single flag . т.е. один параметр одной строкой. Спасибо ! Блин, год назад делал так же, нашёл у себя. Да уж, памяти совсем нет...

SergKis: Пример demo5.prg [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Sergej Kiselev <bilance@bilance.lv> * Copyright 2021 Verchenko Andrey <verchenkoag@gmail.com> Dmitrov, Moscow region * * Пример работы с ини-файлом через контейнер oHmgData() и Class TIniData * Преобразование строки ини-файла в нужные типы * An example of working with an ini file through a container oHmgData() and Class TIniData * Converting an ini file string to desired types */ #define _HMG_OUTLOG #include "hmg.ch" #include "hbclass.ch" ANNOUNCE RDDSYS Function Main() LOCAL oApp, oIni, oCom, aSec, cSec, oSec, nI, cFile, hIni, oTmp LOCAL cIni := GetStartUpFolder() + "\demo5-utf8.ini" // кодировка Utf-8 LOCAL cIni2 := GetStartUpFolder() + "\demo5-utf8.2-ini" // новый файл LOCAL cFileLog := GetStartUpFolder() + "\_5Msg.log" //SET CODEPAGE TO UNICODE // for Unicode version SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN SET DATE TO GERMAN App.Cargo := oHmgData() ; oApp := App.Cargo oApp:cLog := cFileLog ; fErase( oApp:cLog ) oApp:cIni := cIni oApp:cIni2 := cIni2 SET LOGFILE TO (oApp:cLog) // отладочный log файл oApp:oIni := oIniData( cIni, .T. ):Read() //oApp:oIni := oIniData( cIni, .T. ) ; oIni:Read() //oApp:oIni := oIniRead( cIni, .T. ) // в качестве примера чтение нескольких ини-файлов //oApp:oIni1 := oIniRead( ".\demo1.ini", .T. ) // .T. - lMacro //oApp:oIni2 := oIniRead( ".\demo2.ini", .T. ) ? Repl("-",20) + " example log file: " + cFileNoPath( App.ExeName ) + Repl("-",20) ; ? // oIni := App.Cargo:oIni oIni := oApp:oIni // берем адрес объекта oIni и от него работаем aSec := oIni:Keys() // все секции ини-файла ? "все секции ини-файла " + cIni+" =", aSec, hb_valtoexp(aSec) ; ? FOR EACH cSec IN oIni:Keys() // перебираем секции oSec := oIni:Get(cSec) ? cSec, oSec:GetAll() ; ?v oSec:GetAll() ; ? NEXT cSec := [COM] //[COMMON] /* нет такой секции */ oCom := oIni:Get(cSec, oIniData()) // секция [COM], параметр 2, если нет [COM] ? cSec+" =", oCom:GetAll() ; ?v oCom:GetAll() ; ? aSec := oCom:GetAll() // вытаскиваем все из секции FOR nI := 1 TO LEN(aSec) aVal := aSec[ nI ] cKey := aVal[1] xVal := aVal[2] ? nI, cKey, VALTYPE(xVal) , xVal NEXT // или так IF Len(aSec) > 0 FOR EACH aVal IN aSec cKey := aVal[1] xVal := aVal[2] ? hb_enumindex(aVal), cKey, VALTYPE(xVal) , xVal NEXT ENDIF // Проверка наличия ключа oApp:lLanguage := oCom:Pos("Language") > 0 // позиция ключа в контейнере IF oApp:lLanguage ? "["+cSec+"] Есть ключ Language=", oCom:Language ELSE ? "["+cSec+"] НЕТ ключа Language = !" ENDIF Test( oIni ) // проверка переменных из ини // записать новый ини-файл cFile := oApp:cIni2 ? "New file ini =", cFile //oIni:cCommentBegin := "# my Start !" //oIni:cCommentEnd := "# my Stop !" //oIni:lYesNo := .T. // Yes или No в логических значениях при создании ini используем //oIni:aYesNo := {"Да", "Нет"} // Yes или No в логических значениях при создании ini //oIni:Write( cFile, .F. ) // НЕ UTF8, т.е. нет BOM на выходе (на входе был с BOM) oIni:Write( cFile ) // как оригинальный файл UTF8 с BOM ? ; ? "--- End ---" DO EVENTS // показать отладочный файл cStr := HB_MemoRead(App.Cargo:cLog) cFileLog := GetStartUpFolder() + "\_"+Set( _SET_CODEPAGE )+".log" HB_MemoWrit( cFileLog, cStr ) ShellExecute(0,"Open",cFileLog,,,SW_SHOWNORMAL) Return /////////////////////////////////////////////////////////////////////// FUNCTION Test( oIni ) LOCAL nMode, lLog, cPath, aLang, bClr1, xTest, cBtn5, xVal LOCAL oCom, cSec := [COM], Dtm1, Dtm2, Dtm3, Bufer, Buf2 ? "------------- проверка переменных из ини ---------" // читать переменные - секция [RU] переменная "Btn_05" cBtn5 := oIni:RU:Btn_05 ; Default cBtn5 := "none" ? "oIni:RU:Btn_05 = ", cBtn5 // читать переменные - секция [COM] переменная "ModeBAK" nMode := oIni:Com:ModeBAK ; Default nMode := 0 // или так oCom := oIni:Get( cSec, oIniData() ) // это просто адрес в oCom nMode := oCom:ModeBAK ; Default nMode := 0 // можно в отдельной ф-ии проверить все ключи и добавить их в oIni в // нужную секцию, что бы потом просто работать без Default nMode := 0 nMode := oCom:Get("ModeBAK", 0) // это функция-метод nMode := oCom:ModeBAK ; Default nMode := 0 // это удобно нет кавычек // писать\устанавливать в oIni:COM nMode := 21 oCom:ModeBAK := nMode oCom:Set("ModeBAK", nMode) // это функция-метод nMode := oCom:Get("ModeBAK" , 0 ) lLog := oCom:Get("lLangLog", .F. ) cPath := oCom:Get("PathXml" , "" ) aLang := oCom:Get("aLangName", {} ) bClr1 := oCom:Get("Color_1" , {||Nil} ) xTest := oCom:Get("PathXXX" , "not" ) Dtm1 := oCom:Dtm1 Dtm2 := oCom:Dtm2 Dtm3 := oCom:Dtm3 Bufer := oCom:Buffer Buf2 := oCom:Buffer2 xVal := oCom:None // такой переменной нет ? "nMode=", ValType(nMode) , nMode ? "lLog =", ValType(lLog ) , lLog ? "cPath=", ValType(cPath) , cPath ? "aLang=", ValType(aLang) , aLang, HB_ValToExp(aLang) ? "bClr1=", ValType(bClr1) , bClr1 ? "xTest=", ValType(xTest) , xTest ? "Dtm1 =", ValType(Dtm1 ) , Dtm1 ? "Dtm2 =", ValType(Dtm2 ) , Dtm2 ? "Dtm3 =", ValType(Dtm3 ) , Dtm3 ? "Bufer=", ValType(Bufer) , Bufer ? "Buf2 =", ValType(Buf2) , Buf2 ? "xVal =", ValType(xVal) , xVal ? "------- через свою функцию GetHmgData() ------" ? "ModeBAK" , GetIniData( oIni, [COM], "ModeBAK" , 0 ) ? "ModeNone", GetIniData( oIni, [COM], "ModeNone" , -1 ) ? Return Nil /////////////////////////////////////////////////////////////////////// FUNCTION GetIniData(oIni, cSection, cKey, xDefault) LOCAL oSect, cSect, cErr, cIni := App.Cargo:cIni oSect := oIni:Get(cSection, oIniData()) // Проверка наличия ключа IF oSect:Pos(cKey) > 0 // позиция ключа в контейнере xRet := oSect:Get(cKey) // xRet := oSect:&(cKey) // можно и так ELSE cErr := 'Ошибка ! Секция [' + cSection + ']' + CRLF cErr += 'Нет ключа "' + cKey + '" = ...' + CRLF cErr += 'Исправьте ключ в ини-файле !' + CRLF + CRLF cErr += 'Чтение ини-файла ' + cIni + CRLF + CRLF cErr += 'Error! Section ['+ cSection +'] '+ CRLF cErr += 'No key "' + cKey + '" = ...' + CRLF cErr += 'Correct the key in the ini file!' + CRLF + CRLF cErr += 'Reading ini-file' + cIni + CRLF + CRLF cErr += ProcName(0) + "(" + HB_NtoS(ProcLine(0)) + ")" + CRLF cErr += ProcName(1) + "(" + HB_NtoS(ProcLine(1)) + ")" + CRLF cErr += ProcName(2) + "(" + HB_NtoS(ProcLine(2)) + ")" + CRLF MsgStop(cErr, "Error ini-files" ) xRet := xDefault ENDIF Return xRet FUNCTION oIniData( cIni, lMacro, lUtf8, cRazd ) RETURN TIniData():New( cIni, lMacro, lUtf8, cRazd ) FUNCTION oIniRead( cIni, lMacro, lUtf8, cRazd ) RETURN oIniData( cIni, lMacro, lUtf8, cRazd ):Read() #define _METHOD METHOD CLASS TIniData INHERIT THmgData VAR oIni VAR hHash INIT { => } VAR hKeys INIT { => } VAR hLens INIT { => } VAR cBOM AS STRING INIT hb_utf8Chr( 0xFEFF ) VAR cIni AS STRING INIT "" VAR lIni AS LOGICAL INIT .F. VAR lUtf AS LOGICAL INIT .F. VAR lUtf8 AS LOGICAL INIT .F. VAR cCommentChar AS STRING INIT ";" VAR cCommentBegin AS STRING INIT "" VAR cCommentEnd AS STRING INIT "" VAR lAutoMain AS LOGICAL INIT .F. VAR lMacro AS LOGICAL INIT .F. VAR lYesNo AS LOGICAL INIT .F. VAR aYesNo AS ARRAY INIT { "Yes", "No" } METHOD New( cIni, lMacro, lUtf8, cChar ) INLINE ( ::Super:New( .T. ), ; ::Def( cIni, lMacro, lUtf8, cChar ), Self ) CONSTRUCTOR _METHOD Def( cIni, lMacro, lUtf8, cChar ) _METHOD Read() _METHOD Write( cFile, lUtf8 ) _METHOD ToValue( cStr ) _METHOD ToString( xVal ) END CLASS METHOD Def( cIni, lMacro, lUtf8, cChar ) CLASS TIniData ::cIni := hb_DefaultValue( cIni, ::cIni ) ::lMacro := hb_DefaultValue( lMacro, ::lMacro ) ::lUtf8 := ! Empty( lUtf8 ) ::lUtf := Set( _SET_CODEPAGE ) == "UTF8" ::cCommentChar := hb_DefaultValue( cChar, ::cCommentChar ) IF ! Empty( ::cIni ) IF ! hb_FileExists( ::cIni ) hb_memoWrit( ::cIni, iif( ::lUtf8, ::cBOM, "" ) + CRLF ) ENDIF ::lIni := hb_FileExists( ::cIni ) ENDIF RETURN Self METHOD Read() CLASS TIniData LOCAL hIni, cStr, cBuf, aBuf, nBuf, cSec, hSec, oSec, nLen := 1024 LOCAL cChr := ::cCommentChar, xVal, hKey, nKey, cNote IF ::lIni .and. ( hIni := FOpen( ::cIni, 2 ) ) > 0 cStr := space( Len(::cBOM) ) cBuf := space( nLen ) FRead( hIni, @cStr, Len(::cBOM) ) FSeek( hIni, 0, 0 ) FRead( hIni, @cBuf, nLen ) ::lUtf8 := ( cStr == ::cBOM ) aBuf := hb_ATokens( cBuf, CRLF ) FOR EACH cBuf IN aBuf IF left( cBuf, 1 ) == "#" IF ! ::lUtf .and. ::lUtf8 ::cCommentBegin := hb_Utf8ToStr( cBuf ) ELSE ::cCommentBegin := cBuf ENDIF EXIT ENDIF NEXT cBuf := space( nLen ) FSeek( hIni, -nLen, 2 ) FRead( hIni, @cBuf, nLen ) aBuf := hb_ATokens( cBuf, CRLF ) FOR nBuf := Len(aBuf) TO 1 STEP -1 cBuf := aBuf[ nBuf ] IF left( cBuf, 1 ) == "#" IF ! ::lUtf .and. ::lUtf8 ::cCommentEnd := hb_Utf8ToStr( cBuf ) ELSE ::cCommentEnd := cBuf ENDIF EXIT ENDIF NEXT FClose( hIni ) ::hHash := hb_hSetCaseMatch( hb_IniRead( ::cIni, , , ::lAutoMain ), .T. ) FOR EACH cSec, hSec IN hb_HKeys( ::hHash ), hb_HValues( ::hHash ) IF ! ::lUtf .and. ::lUtf8 cSec := hb_Utf8ToStr( cSec ) ENDIF oSec := oHmgData() nKey := 0 hKey := { => } FOR EACH cStr, cBuf IN hb_HKeys( hSec ), hb_HValues( hSec ) cNote := "" IF ! ::lUtf .and. ::lUtf8 cStr := hb_Utf8ToStr( cStr ) cBuf := hb_Utf8ToStr( cBuf ) ENDIF IF left(cBuf, 2) == "{|" .or. left(cBuf, 3) == "{ |" cNote := cBuf ENDIF IF ! Empty( cChr ) .and. ( nBuf := At( cChr, cBuf ) ) > 0 IF ! ( left(cBuf, 2) == "{|" .or. left(cBuf, 3) == "{ |" ) cNote := subs( cBuf, nBuf ) ENDIF cBuf := Alltrim( Left( cBuf, nBuf - 1 ) ) ENDIF nKey := Max( nKey, Len( cStr ) ) hb_HSet( hKey, upper(cStr), { cStr, cNote } ) IF ::lMacro .and. ! HB_ISNIL( xVal := ::ToValue( cBuf ) ) oSec:Set( cStr, xVal ) ELSE oSec:Set( cStr, cBuf ) ENDIF NEXT ::Set( cSec, oSec ) hb_HSet( ::hKeys, cSec, hKey ) hb_HSet( ::hLens, cSec, nKey ) NEXT ::hHash := NIL DO EVENTS hb_gcAll() DO EVENTS ENDIF RETURN Self METHOD ToValue( cStr ) CLASS TIniData LOCAL xVal IF Empty( cStr ) ; RETURN cStr ENDIF IF left(cStr, 1) == "{" .and. right(cStr, 1) == "}" .or. ; left(cStr, 1) == "'" .and. right(cStr, 1) == "'" .or. ; left(cStr, 1) == '"' .and. right(cStr, 1) == '"' .or. ; left(cStr, 2) == 'e"' .and. right(cStr, 1) == '"' .or. ; left(cStr, 2) == 't"' .and. right(cStr, 1) == '"' .or. ; left(cStr, 4) == '0d20' .and. Len(cStr) == 10 BEGIN SEQUENCE WITH { |e|break(e) } xVal := &(cStr) END SEQUENCE IF left(cStr, 2) == 't"' .and. right(cStr, 1) == '"' .and. ; Valtype(xVal) == "T" .and. Len( subs(cStr, 3) ) == 11 xVal := hb_TtoD( xVal ) ENDIF ELSEIF hb_ntos(Val(cStr)) == cStr xVal := Val(cStr) ELSEIF cStr == "T" .or. cStr == ".T." .or. cStr == ".t." .or. ; cStr == "Y" .or. cStr == ::aYesNo[1] // "Yes" xVal := .T. ELSEIF cStr == "F" .or. cStr == ".F." .or. cStr == ".f." .or. ; cStr == "N" .or. cStr == ::aYesNo[2] // "No" xVal := .F. ELSE xVal := cStr ENDIF RETURN xVal METHOD ToString( xVal ) CLASS TIniData LOCAL cStr := "", lE := .F. IF HB_ISCHAR( xVal ) cStr := Alltrim( xVal ) IF ! Empty(cStr) IF CRLF $ cStr lE := .T. cStr := StrTran( cStr, CRLF, "\r\n" ) ENDIF IF chr(9) $ cStr lE := .T. cStr := StrTran( cStr, chr(9), "\t" ) ENDIF IF lE IF left ( cStr, 1 ) == '"' ; cStr := subs( cStr, 2 ) ENDIF IF right( cStr, 1 ) == '"' ; cStr := left( cStr, Len(cStr) - 1 ) ENDIF cStr := 'e"' + cStr + '"' ENDIF ENDIF ELSEIF HB_ISLOGICAL( xVal ) .and. ::lYesNo cStr := ::aYesNo[ iif( xVal, 1, 2 ) ] ELSE cStr := hb_valtoexp( xVal ) ENDIF RETURN cStr METHOD Write( cFile, lUtf8 ) CLASS TIniData LOCAL lRet := .F., aSec, cSec, oSec, hSec, hKey, nLen LOCAL hIni := { => }, cKey, cVal, xVal, cStr, lBlk LOCAL cIni := "_"+DtoS(Date())+"_"+StrTran(hb_ntos(Seconds()), ".", "" )+"_"+".ini" LOCAL cBegin := "", cEnd := "" DEFAULT cFile := ::cIni, lUtf8 := ::lUtf8 FOR EACH cSec IN ::Keys() // перебираем секции oSec := ::Get( cSec ) hSec := { => } hKey := hb_hSetCaseMatch( hb_HGetDef( ::hKeys, cSec, { => } ), .T. ) nLen := hb_HGetDef( hb_hSetCaseMatch( ::hLens, .T. ), cSec, 11 ) + 1 FOR EACH aSec IN oSec:GetAll() cKey := aSec[1] xVal := aSec[2] lBlk := HB_ISBLOCK( xVal ) cVal := ::ToString( xVal ) IF ! ::lUtf .and. lUtf8 cKey := hb_StrToUtf8( cKey ) cVal := hb_StrToUtf8( cVal ) ENDIF cStr := hb_HGetDef( hKey, cKey, Nil ) IF HB_ISARRAY( cStr ) .and. Len( cStr ) > 1 cKey := cStr[1] IF ! Empty( cStr[2] ) IF lBlk cVal := iif( ! ::lUtf .and. lUtf8, hb_StrToUtf8( cStr[2] ), cStr[2] ) ELSE cVal += space(3) + iif( ! ::lUtf .and. lUtf8, hb_StrToUtf8( cStr[2] ), cStr[2] ) ENDIF ENDIF ENDIF IF nLen > Len( cKey ) ; cKey := left( cKey + space( nLen ), nLen ) ENDIF hb_HSet( hSec, cKey, " " + cVal ) NEXT hb_HSet( hIni, cSec, hSec ) NEXT IF ! Empty( ::cCommentBegin ) cBegin += iif( left(::cCommentBegin, 1) == "#", "", "#" ) + ::cCommentBegin IF ! ::lUtf .and. lUtf8 cBegin := hb_StrToUtf8( cBegin ) ENDIF ENDIF cBegin := iif( lUtf8, ::cBOM + CRLF, "" ) + cBegin IF ! Empty( ::cCommentEnd ) cEnd += CRLF + iif( left(::cCommentEnd, 1) == "#", "", "#" ) + ::cCommentEnd IF ! ::lUtf .and. lUtf8 cEnd := hb_StrToUtf8( cEnd ) ENDIF ENDIF IF Empty( cBegin ) ; cBegin := Nil ENDIF IF Empty( cEnd ) ; cEnd := Nil ENDIF hb_iniWrite( cIni, hIni, cBegin, cEnd, ::lAutoMain ) IF hb_vfExists( cFile ) lRet := Empty( hb_vfErase( cFile ) ) IF lRet lRet := Empty( hb_vfRename( cIni, cFile ) ) ENDIF ELSE lRet := Empty( hb_vfRename( cIni, cFile ) ) ENDIF RETURN lRet [/pre2] ini к нему demo5-utf8.ini (utf8 с BOM) [pre2] # Hello - Start ! [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 aLangName = { 'Русский', 'Белорусский', 'Украинский', 'Латышский' } ; список языков aLangList = { 'RU' , 'BE' , 'UA' , 'LV' } aLangNum = { 1, 2, 3, 4 } ; список кодов языков aLangLog = { .T., .F., .F., .F. } ; логический список lLangLog = .t. ; логическая переменная cVersion = 22.09.21 ; текстовая дата Dtm1 = t"2021-09-01 17:10:11" ; переменная времени Dtm2 = 0d20210902 ; переменная дата Dtm3 = t"2021-09-02" ; переменная времени - дата Buffer = e" aaaaa bbbbb cccc " ; переменная буфера Buffer2 = e". \r\n \t line: \r\n \t 1. aaaaa \r\n \t 2. bbbbb \r\n \t 3. cccc " ; переменная буфера 4 строки Color_0 = "--------- условия показа ----------" Color_1 = {|| DELETED() } Color_2 = {|| (ALIAS())->KVipZa == 0 } Color_3 = {|| (ALIAS())->KVipZa == 1 } Color_4 = {|| (ALIAS())->KVipZa == 2 } [RU] Title = Демонстрация меню и нескольких языков у себя в проекте Label_0 = Демо для своего проекта МойПроект5 Label_1 = (©) Copyright by Andrey Verchenko <verchenkoag@gmail.com> 2021. All rights reserved. Dmitrov, Russia Btn_01 = Помощь Btn_02 = Настройки Btn_03 = Проверка Btn_04 = Резерв Btn_05 = Выход [BE] Title = 222 Демонстрация меню и нескольких языков у себя в проекте Label_0 = 222 Демо для своего проекта МойПроект5 Label_1 = ---игнорировать Btn_01 = 222 Помощь Btn_02 = 222 Настройки Btn_03 = 222 Проверка Btn_04 = 222 Резерв Btn_05 = 222 Выход [UA] Title = 333 Демонстрация меню и нескольких языков у себя в проекте Label_0 = 333 Демо для своего проекта МойПроект5 Label_1 = ---игнорировать Btn_01 = 333 Помощь Btn_02 = 333 Настройки Btn_03 = 333 Проверка Btn_04 = 333 Резерв Btn_05 = 333 Выход [LV] Title = 444 Демонстрация меню и нескольких языков у себя в проекте Label_0 = 444 Демо для своего проекта МойПроект5 Label_1 = ---игнорировать Btn_01 = 444 Помощь Btn_02 = 444 Настройки Btn_03 = 444 Проверка Btn_04 = 444 Резерв Btn_05 = 444 Выход # Hello - Stop ! [/pre2]

SergKis: Пример demo4.prg (более простой вариант работы с ini) [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Sergej Kiselev <bilance@bilance.lv> * Copyright 2021 Verchenko Andrey <verchenkoag@gmail.com> Dmitrov, Moscow region * * Пример работы с ини-файлом через контейнер oHmgData() * An example of working with an ini file through a container oHmgData() */ #define _HMG_OUTLOG #include "minigui.ch" ANNOUNCE RDDSYS Function Main() Local o := oHmgData() // oIni Local c := oHmgData() // oSection Local a := oHmgData() // oLanguage Local cIni := "demo4.ini", s, aDim Local cLog := GetStartUpFolder() + "\_4Msg.log" SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN SET LOGFILE TO (cLog) // отладочный log файл SET DATE TO GERMAN fErase( cLog ) IsIniFile(cIni) // проверка на наличие ini-файла ? "--------------- example log file: " + cFileNoPath( App.ExeName ) o:Set(hb_IniRead(cIni, .F.)) // ключи в upper (секция MAIN дбавляется, если нет ее) // все секции ини-файла ? "File " + cIni,"=", o:Keys(), HB_ValToExp(o:Keys()) ; ? ? "INI =", o:GetAll() ; ?v o:GetAll() ; ? c:Set(o:Com) // секция [COM] ? "COM =", c:GetAll() ; ?v c:GetAll() ; ? "---- выборочные значения -----" ? " Number = ", ValType(c:Number ) , c:Number ? " String = ", ValType(c:String ) , c:String ? " Logical = ", ValType(c:Logical ) , c:Logical ? " Date = ", ValType(c:Date ) , c:Date ? " Host = ", ValType(c:Host ) , c:Host ? " aLangName = ", ValType(c:aLangName) , c:aLangName ? " aLangList = ", ValType(c:aLangList) , c:aLangList aDim := hb_Atokens( c:aLangName, "," ) ? " aLangName = ",aDim,ValType(aDim), hb_ValToExp(aDim) aDim := hb_Atokens( c:aLangList, "," ) ? " aLangList = ",aDim,ValType(aDim), hb_ValToExp(aDim) ? "------------------------------" s := c:Language // язык IF ! s $ "RU,EN" s := iif( Set( _SET_CODEPAGE ) == 'RU1251', [RU], [EN] ) ENDIF ? "Language =", s a:Set(o:Get(s)) // секция [RU] или [EN] ? "Text =", a:GetAll() ; ?v a:GetAll() ; ? ? a:Title ? a:Btn_01 ? a:Btn_02 ? a:Btn_03 ? a:Btn_04 ? "---- End ----" ShellExecute(0,"Open",cLog,,,SW_SHOWNORMAL) // показать отладочный файл Return Nil ///////////////////////////////////////////////////////////////////// Function IsIniFile(cIni) LOCAL cText, lUtf := Set( _SET_CODEPAGE ) == "UTF8" IF !File( cIni) cText := "[Information]" + CRLF cText += "Program = " + Application.ExeName + CRLF cText += "Free Open Source Software = " + Version() + CRLF cText += "Free Compiler = " + hb_compiler() + CRLF cText += "Free Library = " + MiniGUIVersion() + CRLF cText += CRLF cText += "[Main]" + CRLF cText += "cIni = " + cIni + CRLF cText += "cCode = " + Set( _SET_CODEPAGE ) + CRLF cText += "lUtf8 = " + cValToChar(lUtf) + CRLF cText += CRLF cText += "[COM]" + CRLF cText += "Number = 13" + CRLF cText += "String = Строка пример / Example string" + CRLF cText += "Logical = " + cValToChar(lUtf) + CRLF cText += "Date = " + DtoC(Date()) + CRLF cText += "Host = 127.0.0.1" + CRLF cText += "aLangName = Русский,Белорусский,Украинский,Латышский" + CRLF cText += "aLangList = RU,BE,UA,LV" + CRLF cText += "Language = RU" + CRLF cText += CRLF cText += "[RU]" + CRLF cText += "Title = Демонстрация работы с ини-файлом через контейнер oHmgData()" + CRLF cText += "Btn_01 = Помощь" + CRLF cText += "Btn_02 = Настройки" + CRLF cText += "Btn_03 = Проверка" + CRLF cText += "Btn_04 = Выход" + CRLF cText += CRLF cText += "[EN]" + CRLF cText += "Title = Demonstration of working with ini-file through the oHmgData() container" + CRLF cText += "Btn_01 = Help" + CRLF cText += "Btn_02 = Settings" + CRLF cText += "Btn_03 = Check" + CRLF cText += "Btn_04 = Exit" + CRLF hb_MemoWrit( cIni, cText ) ENDIF Return Nil [/pre2]


Haz: SergKis пишет: читай их, без ограничений в кол-ве и качестве кроме как приведение типов. Давно перешел на json. Вот где без ограничений, да и hash гонится элементарно.

SergKis: Haz пишет Вот где без ограничений Формат даты в json не понимается никак, имеется ввиду обратно, только конкретное имя, типа dMyDate, по первому символу, да и не встроен json в hb как продолжение языка, синтаксис (hb_H... ф-ии не совсем то в процессе работы, по мне+с xhb это "две большие разницы"). В demo5 все по типам туда и обратно + встроились в hb, как объект, но ... удобно, если работаешь с объектами. Запись для команд hmg для работы (препроцессор) и запись работы с oHmgData() (oIniData()) практически идентичны, т.е. Form_1.Btn_01.Value и oIni:RU:Btn_01 и т.д. ... hash гонится элементарно. Если много hash - это как с alias(), работать DbSelectArea(...) и работать (cAls := alias(), ..., (cAls)->.... защита данных по алиасу), или с hash всегда "правильно" иметь нужный hash (имя переменной правильно, не ошибившись таскать с собой) hb_HGet(<hHash>, .....), или объект, где все на hash внутри и оперируешь только переменной объекта

Haz: SergKis пишет: Формат даты в json не понимается никак, имеется ввиду обратно, не приходилось пока использовать формат даты, не проверял, верю. При старте программы считываю локальные настройки пользователя из папки его профиля. К примеру видимости и порядок колонок бровсов, ширину этих колонок, цветовые настройки и пр. Раньше писал в INI, каких только изввратов не придумал. Бровсов много, параметров бровсов много в INI реализация вложенности на нуле.. А если еще и шифровать, так вообще пляски иначе продвинутые юзера туда лезли. Перешел на json и выдохнул., все структуры данных разложены как надо, вложенность и ветвления без ограничений. От дурака защита реализуется легко. В общем каждому своё 👍

SergKis: Haz пишет Бровсов много, параметров бровсов много в INI реализация вложенности на нуле.. Не соглашусь, т.к. еще со времен VO вариант ini для реализации окон и контролов работает на ура[pre2] [MAIN] Start = Form_1 ... [Form_1] Control_1 = [Label_1] Control_2 = [GetBox_1] Control_3 = [Browse_1] ... [Label_1] Row = .. Col = ... Width = ... Height = ... Value = ... ... [GetBox_1] .... [Browse_1] ... [/pre2] дерево строится практически как в xml Если исп. механизм LayOut (авто компоновка контролов на окне), то еще проще [MAIN] ... [Form_1] 01 = [Label_1], [GetBox_1] 02 = [Label_2], [GetBox_3], [Label_3], [GetBox_4] ... NN = [Browse_1] ...

Haz: SergKis пишет: дерево строится практически как в xml в том и дело , что нет желания строительством занимается.. Тут собрал структуру в хеш, и выплюнул в джсон и все. Обратно так же. С alias() работать для меня не вариант, база в ads на словарях, все под SQL. Сторонние таблицы явно проигрывают в удобстве хранения данных , так как требуют унификации полей. Мне в работе json проще и понятнее чем XML, компактнее , современнее и универсальное. Более торо , обмен в этом формате между разными системами реализуется проще, хоть через диск, хоть через порт , хоть через pipe и пр. Плюс для работы внешних редакторов полно любых. Так что не убедил 😎. Просто для себя взял стандартом. Конфигурации храню в json, обмен с 1с в json, коммуникации с Битрикс в json. Даже выгрузку из конструкторского по в кривом CSV , сначала гоню в json ( hash) а потом только разбираю. В общем дело привычки 🧐

Haz: SergKis пишет: Не соглашусь, т.к. еще со времен VO вариант ini для реализации окон и контролов работает на ура работает, но в json это проще делать тк вложенность ключей прямая а не косвенная

SergKis: Haz пишет Так что не убедил Особо не собираюсь, но ~ 20 справочников (до 20 строк, которые практически не меняются, типа пол: мужской, женский) подчитанных в 20 hash переменных и потом работа с ними и работа с 20 переменными объектов-контейнеров ... , она практически одинакова, только тебе надо оперировать hb_HSet\GetDef(<имя спр.>, ...), а мне <имя спр.>:имя ключа, т.е. мнемоника, или <имя спр.>:Get\Set(...), если это работа с html и js, то вариантов нет, json и при обратной обработке, дата - это проблема, т.е. полная привязка к именам json, не факт, что это совпадает с полями dbf-базы, т.е. строим какие то перекодировки. В общем дело привычки Это да, привычки в нашей жизни, РУЛЯТ. Мы как собаки Павлова, к чему привыкли, так и делаем,в др. случаях надо напрягаться, организм сопротивляется

SergKis: PS Разговор, вообще то шел о параметрах для программы, т.е. Там же написано single flag . т.е. один параметр одной строкой. На мой взгляд, параметры для программы проще передать, через ini, чем строкой, которую потом надо парсить. Т.е. для прогр. создаем ini (руками или программой не важно) и в запускаемой программе обрабатываем. Сделать Local oIni := oIniRead( ".\Start.ini", .T. ):COM ? oIni:nMode, oIni:... проще, чем что то другое, даже, если этого ini нет

SergKis: Haz пишет Тут собрал структуру в хеш, и выплюнул в джсон и все Тут, немного ты, скрыл алгоритм, для вложенных jcon, как секции в ini, т.е. надо построить примерно (как в demo4, в demo5 это скрыто внутри) такое по hash [pre2] 1 {"MAIN", {"CINI"=>"demo4.ini", "CCODE"=>"RU1251", "LUTF8"=>"F"}} 2 {"INFORMATION", {"PROGRAM"=>"C:\MiniGuiBcc58\SAMPLES\_Test\_2\demo4.exe", "FREE OPEN SOURCE SOFTWARE"=>"Harbour 3.2.0dev (r2104281802)", "FREE COMPILER"=>"Borland C++ 5.8.2 (32-bit)", "FREE LIBRARY"=>"Harbour MiniGUI Extended Edition 21.09.0 (32-bit) ANSI"}} 3 {"COM", {"NUMBER"=>"13", "STRING"=>"Строка пример / Example string", "LOGICAL"=>"F", "DATE"=>"29.09.21", "HOST"=>"127.0.0.1", "ALANGNAME"=>"Русский,Белорусский,Украинский,Латышский", "ALANGLIST"=>"RU,BE,UA,LV", "LANGUAGE"=>"RU"}} 4 {"RU", {"TITLE"=>"Демонстрация работы с ини-файлом через контейнер oHmgData()", "BTN_01"=>"Помощь", "BTN_02"=>"Настройки", "BTN_03"=>"Проверка", "BTN_04"=>"Выход"}} 5 {"EN", {"TITLE"=>"Demonstration of working with ini-file through the oHmgData() container", "BTN_01"=>"Help", "BTN_02"=>"Settings", "BTN_03"=>"Check", "BTN_04"=>"Exit"}} [/pre2] в примере это подается в объект, но можно подать это и json, перебрав секции и превратив ее в json, в целом, "хрен редьки не слаще", вопрос для каких целей делаем. Наглядности в сравнении с json5, json (hb ф-ии) мало дает, делая ключи в кавычках и как не крути json в hb слабоват, на мой взгляд, т.е. json в js (html) уже практически отсутствует, применяется json5, т.е. к тебе приходят данные в json5 их надо превратить в hash

Haz: SergKis пишет: Тут, немного ты, скрыл алгоритм, для вложенных jcon Да , утаил. Но он элементарный. Json5 проблем и пока не доставлял. Плюс автоматом экранирует служебные символы. К примеру заголовок с разделителями CRLF не нужно обрабатывать перед чтением или записью. Пользую давно, функционала хватает. И главное, как уже писал, могу сохранить на диск и 1С 7.7 спокойно эта прочтет и разберет своими штатными средствами (компонент под json полно). С навороченным INI в 1С придется попотеть, тк. нет там никаких объектов и oKeyData и логику разбора из харбур не перенести. Зачем мне две одинаковые по смыслу сущности , одну из которых не поднять в 1С ? Обмен с 1С через dbf только с виду прост, на деле проблем множество и тут пока только текстом через диск. Порт слушать 1С 7.7 не умеет, сообщения окну обрабатывать не чем, остается только pipe , а это тот же файловый обмен. Зато спасибо микрософту , элементарно из 1С шлется json в порт программы приемника. Вот и пришел к выводу, что мне удобнее json т.к он везде поддерживается и везде одинаков.

Haz: SergKis пишет: На мой взгляд, параметры для программы проще передать, через ini, чем строкой, которую потом надо парсить. Т.е. для прогр. создаем ini (руками или программой не важно) и в запускаемой программе обрабатываем тогда уж проще прям в коде забить. Хотя соглашусь, параметром может быть файл, где все разложено. так проще но не нужно. Андрею при отладке лень каждый раз эти параметры руками бить. Иначе при чем тут .hbp ? поэтому проще всего в коде

SergKis: Игорь, мы немного о разном. Ты об обмене данными со сторонними программами (тут от их правил не отпрыгнешь), а я о внутреннем употреблении в prg hmg с учетом языковых данных. 1C с 8-ой версии стала unicode, вроде, да и у вас редко стоит вопрос разных языковых текстов в prg (для Gui). А у нас язык на 1-м месте, Формы для России, ЕС, Латвии разные + тексты языковые к ним (клиент сам может правильно править перевод), так что приходится организовывать хранилища и ini простой и удобный вариант

Haz: SergKis пишет: мы немного о разном. Сергей, конечно о разном. Базовая реализация INI просто убогая. Твой пример погоняю раньше не натыкался на него и такую реализацию INI. Да, для ситуации когда (клиент сам может правильно править перевод) от незаменим.

SergKis: Haz пишет Андрею при отладке лень каждый раз эти параметры руками бить. Иначе при чем тут .hbp ? Как он написал параметры (назначение), то это 1-текст, 2-режим базы, 3-текст кнопки "ok" т.е. все может быть разным, в hbp он меняя набирает и отлаживает режимы prg, потом будет для них запуск ShellExecute с кнопок и меню, т.е. вид параметров my.exe {"bla bla bla",2021,"ok"} и потом внутри aParam := &cParam

Andrey: Сделайте пожалуйста пример на jcon в библиотеку МиниГуи ! Хотя я его 2-3 раза всего использовал, мне он не понравился, может и не распробовал.

SergKis: Andrey пишет Сделайте пожалуйста пример на jcon в библиотеку МиниГуи ! Поищи в SAMPLES "json" Нашел у себя еще и пример от 01.08.2020 на твоем массиве [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2019 Verchenko Andrey <verchenkoag@gmail.com> */ ANNOUNCE RDDSYS #define _HMG_OUTLOG #include "hmg.ch" REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 ///////////////////////////////////////////////////////////////////////// Function Main SET EPOCH TO ( Year(Date()) - 50 ) SET LANGUAGE TO RUSSIAN SET CODEPAGE TO RUSSIAN SET Date TO GERMAN SET MULTIPLE OFF WARNING SET FONT TO "Tahona", 16 SET OOP ON _SetGetLogFile( ChangeFileExt( Application.ExeName, ".log" ) ) fErase( _SetGetLogFile() ) ? "======================= Запуск программы - "+TIME() + " =======================" ? MiniGuiVersion() SET WINDOW MAIN OFF Test_Dim_json() SET WINDOW MAIN ON Return Nil ///////////////////////////////////////////////////////////////////// FUNCTION Test_Dim_json() LOCAL nI, aDim, tTime, cStr LOCAL cFileLog := ChangeFileExt( Application.ExeName, ".log" ) LOCAL cFileDim := ChangeFileExt( Application.ExeName, ".dim" ) LOCAL cFileJson := ChangeFileExt( Application.ExeName, ".json" ) LOCAL a,h,i,j,k,v,o, hDim aDim := {{13, "% Сбора", "=RC[-4]*100/RC[-5]", DATE()}, {14, "ЗП за;подъезд", '=ЕСЛИ(RC[-3]="общ";R1C3;ЕСЛИ(RC[-8]=0;R1C1;ЕСЛИ(И(1<=RC[-4];RC[-4]<9);R1C1;R1C2)))', DATE()}, {15, "####", "", DATE()}, {16, "% от;начисл.1", "=RC[-8]/100*R1C9", DATE()}, {17, "##", "", DATE()}, {18, "% от;начисл.2", "=RC[-10]/100*R2C9", DATE()}, {19, "##", "", DATE()}, {20, "% от;начисл.3", "=RC[-12]/100*R3C9", DATE()}, {21, "% Выплаты", "=100*RC[-8]/R2C9", DATE()}, {22, "ЗП мастеру;за п от %", "=RC[-8]/100*RC[-1]", DATE()}, {23, "ЗП мастеру", '=ЕСЛИ(RC[-12]="юл";RC[-9];ЕСЛИ(RC[-14]<RC[-7];0;ЕСЛИ(RC[-14]>RC[-3];RC[-9]/100*R3C7;RC[-9]/100*RC[-2])))', DATE()}} ? "------------------ пример массив -----------" ? "массив aDim=", aDim ; ?v aDim tTime := HB_DATETIME() // массив в файл HB_MemoWrit( cFileDim, HB_ValToExp(aDim) ) // строка из файла cStr := HB_MemoRead(cFileDim) cStr := ALLTRIM( cStr ) // чтобы было без ошибки IF AT( "{", cStr ) > 0 .AND. AT( "}", cStr ) > 0 aDim := &cStr ELSE aDim := {} // пустой массив ENDIF ? ; ? "------------------ пример json 1 ----------------" h := hb_hash() For i := 1 To Len(aDim) h[ StrZero(i,2) ] := aDim[ i ] Next cStr := hb_jsonEncode(h,.F.) ? "hb_jsonEncode(h,.F.) =", cStr HB_MemoWrit( ".\_h_.json", cStr) ? ; ? "------------------ пример json 2 ----------------" h := hb_hash() h["columnY"] := 5 h["color"] := { 251,250,174 } h["columns"] := aDim cStr := hb_jsonEncode(h,.F.) // json в файл hb_MemoWrit( cFileJson, cStr) ? "hb_jsonEncode(h,.F.) =", cStr // json из файла cStr := hb_MemoRead(cFileJson) a := hb_hash() hb_jsonDecode(cStr, @a) ? "json из файла ! кол-во элементов:", len(a) For i :=1 to len(a) ? hb_hKeyAt(a,i),"=>", v:= hb_hValueAt(a,i), valtype(v) Next ? x1 := a["columnY"] ; ? 'a["columnY"]'; ? x1 x2 := a["color"] ; ? 'a["color"] '; ? x2 ; ?v x2 x3 := a["columns"] ; ? 'a["columns"]'; ? x3 ; ?v x3 ? ; ? "------------------ пример json 3 ----------------" a:=hb_hash() a['dat'] := date() a['0'] := 222 a['TYP'] := "text" a['1'] := "text2" a['kod'] := 7777 ? "длинна массива:",len(a) ? "кодируем:" ? j:=hb_jsonEncode(a,.T.) ? k:=hb_jsonEncode(a,.F.) ? HB_MemoWrit( ".\_j_.json", j) HB_MemoWrit( ".\_k_.json", k) o := oKeyData() o:Set(a) hb_MemoWrit( "_o_.json", o:Json(.F.)) ? "декодируем обратно:" J := hb_memoread(".\_j_.json") ; h := J J := SubS( J, At ("{", J) ) J := Left( J, RAt("}", J) ) hb_jsonDecode(J,@a) ? "получена длинна массива:",len(a) for i:=1 to len(a) ? hb_hKeyAt(a,i),"=>",v:=hb_hValueAt(a,i),valtype(v) next ? a := oKeyData() ? "a = ", a:Json(h) ?v a:GetAll(.F.) ? "." ? "--- End test ----", HMG_TimeMS( tTime ) ShellExecute( 0, "Open", cFileLog,,, 1 ) RETURN NIL [/pre2]

Andrey: SergKis пишет: Нашел у себя еще и пример от 01.08.2020 на твоем массиве Это простой слишком пример. И только у меня. Это до ковида своего делал ещё. По поиску в библиотеке 3 примера всего, и непонятные. Что-нибудь интересней нужно в качестве примера.



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