Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

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

gfilatov2002: Выложил 2-е обновление сборки 22.07 с учетом последних исправлений и дополнений click here

gfilatov2002: Выложил 3-е обновление сборки 22.07 с учетом последних исправлений и дополнений click here

gfilatov2002: Завершена подготовка новой сборки 22.09, которая планируется к выпуску на следующей неделе Если у вас есть какие-либо предложения или дополнения кода, то еще не поздно сообщить мне об этом с целью включения в эту сентябрьскую сборку. Благодарю за внимание к этому проекту


gfilatov2002: Как и обещал, выложил финальную сборку 22.09 Нажмите здесь, чтобы скачать

SergKis: gfilatov2002 unicode версия живет или нет ?

gfilatov2002: SergKis пишет: unicode версия живет Только что обновил архив для этой сборки по старому адресу

SergKis: gfilatov2002 пишет обновил архив для этой сборки по старому адресу Спасибо

SergKis: gfilatov2002 Сборка версии unicode файлом MakeAllMiniguiLibs.bat выдает протокол с бяками Протокол [pre2] MiniGui.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland h_scrsaver.c: h_edit.c: h_edit_ex.c: h_error.c: h_ipaddress.c: c_ipaddress.c: h_monthcal.c: c_monthcal.c: h_help.c: c_help.c: h_crypt.c: c_crypt.c: h_status.c: c_status.c: h_tree.c: c_tree.c: c_toolbar.c: h_toolbar.c: errorsys.c: h_init.c: h_media.c: c_media.c: h_winapimisc.c: h_slider.c: c_button.c: c_checkbox.c: c_combo.c: c_controlmisc.c: c_datepicker.c: c_resource.c: c_cursor.c: c_ini.c: h_ini.c: h_report.c: h_savepdf.c: h_registry.c: Warning W8075 h_registry.prg 340: Suspicious pointer conversion in function HB_FUN_ISWOW64 h_font.c: c_font.c: h_hyperlink.c: h_richeditbox.c: c_richeditbox.c: h_richeditex.c: c_richeditex.c: c_bitmap.c: c_dialog.c: c_imagelist.c: h_imagelist.c: c_windowsAPI.c: c_windowsCLS.c: c_nonclient.c: Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland c_winxp.c: c_editbox.c: c_dialogs.c: c_grid.c: c_windows.c: c_windowsMDI.c: c_image.c: c_label.c: c_listbox.c: c_menu.c: c_msgbox.c: c_frame.c: c_progressbar.c: c_radio.c: c_registry.c: Warning W8075 c_registry.c 66: Suspicious pointer conversion in function HB_FUN_REGOPENKEYEXA Warning W8075 c_registry.c 70: Suspicious pointer conversion in function HB_FUN_REGOPENKEYEXA Warning W8075 c_registry.c 87: Suspicious pointer conversion in function HB_FUN_REGQUERYVALUEEXA Warning W8075 c_registry.c 94: Suspicious pointer conversion in function HB_FUN_REGQUERYVALUEEXA Warning W8075 c_registry.c 128: Suspicious pointer conversion in function HB_FUN_REGENUMKEYEXA Warning W8075 c_registry.c 130: Suspicious pointer conversion in function HB_FUN_REGENUMKEYEXA Warning W8075 c_registry.c 162: Suspicious pointer conversion in function HB_FUN_REGCREATEKEY Warning W8075 c_registry.c 179: Suspicious pointer conversion in function HB_FUN_REGENUMVALUEA Warning W8075 c_registry.c 185: Suspicious pointer conversion in function HB_FUN_REGENUMVALUEA Warning W8075 c_registry.c 196: Suspicious pointer conversion in function HB_FUN_REGDELETEKEY Warning W8075 c_registry.c 209: Suspicious pointer conversion in function HB_FUN_REGCONNECTREGISTRY c_slider.c: c_spinner.c: c_tab.c: c_textbox.c: c_timer.c: h_webcam.c: c_winapimisc.c: h_button.c: h_checkbox.c: h_combo.c: h_controlmisc.c: h_datepicker.c: h_editbox.c: h_dialogs.c: h_grid.c: h_windows.c: h_windowsmdi.c: h_image.c: h_label.c: h_listbox.c: h_menu.c: h_msgbox.c: h_frame.c: h_progressbar.c: h_radio.c: h_spinner.c: h_tab.c: h_textbox.c: h_timer.c: c_scrsaver.c: h_hotkey.c: h_events.c: Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland c_hotkey.c: h_draw.c: c_draw.c: h_graph.c: c_graph.c: h_activex.c: h_animate.c: h_browse.c: c_browse.c: h_socket.c: h_dialog.c: h_winprop.c: c_winprop.c: h_getbox.c: c_getbox.c: h_btntextbox.c: c_btntextbox.c: h_hotkeybox.c: c_hotkeybox.c: h_wbrush.c: h_gradient.c: h_mru.c: h_folder.c: c_folder.c: h_pager.c: c_pager.c: h_chklabel.c: c_chklabel.c: h_chklistbox.c: c_chklistbox.c: h_clbutton.c: h_splitbutton.c: h_Gif89.c: h_taskdlg.c: c_taskdlgs.c: c_tooltip.c: c_cuebanner.c: c_hmgapp.c: hbgdiplus.c: c_icon.c: c_monitors.c: c_error.c: h_objects.c: h_objmisc.c: h_misc.c: h_rptgen.c: Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland h_alert.c: h_GraphBitmap.c: h_buttonex.c: h_comboex.c: h_dbf_aux.c: h_filename.c: h_owntab.c: dbinsert.c: h_checkres.c: h_progresswheel.c: h_rating.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International TLIB 4.5 Copyright (c) 1987, 1998 Borland International TLIB 4.5 Copyright (c) 1987, 1998 Borland International Warning: public '_HB_FUN_ISREGISTRYKEY' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_CREATEREGISTRYKEY' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_GETREGISTRYVALUE' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_SETREGISTRYVALUE' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_DELETEREGISTRYVAR' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_DELETEREGISTRYKEY' in module 'h_registry' clashes with prior module 'h_init' TLIB 4.5 Copyright (c) 1987, 1998 Borland International Warning: public '_HB_FUN_ISREGISTRYKEY' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_CREATEREGISTRYKEY' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_GETREGISTRYVALUE' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_SETREGISTRYVALUE' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_DELETEREGISTRYVAR' in module 'h_registry' clashes with prior module 'h_init' Warning: public '_HB_FUN_DELETEREGISTRYKEY' in module 'h_registry' clashes with prior module 'h_init' dbginit.obj Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland dbginit.c: Debugger.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland dbgGUI.c: dbgHB.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International PropGrid.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland h_propgrid.c: h_pglang.c: Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland c_PropGrid.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International PropSheet.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland h_propsheet.c: Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland c_PropSheet.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International TsBrowse.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland c_TBrowse.c: h_tbrowse.c: TControl.c: TSColumn.c: scrllbar.c: SbMsg.c: c_controlmisc1.c: h_controlmisc1.c: h_controlmisc2.c: TComboBox.c: TDatePicker.c: TBtnBox.c: TGetBox.c: TSMulti.c: TCursor.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International MiniPrint2.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland miniprint2.c: localize.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International HMG_QHTM.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland h_qhtm.c: Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland c_qhtm.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International WinReport.lib Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland h_wrepint.c: h_wremix.c: h_WrePdf.c: hmg_hpdf.c: fncMyError.c: TLIB 4.5 Copyright (c) 1987, 1998 Borland International [/pre2] После этого сборка примеров дает [pre2] Harbour 3.2.0dev (r2104281802) Copyright (c) 1999-2021, https://harbour.github.io/ OBJ\demo.c: OBJ\_hbmkaut_demo.c: Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland Error: Unresolved external '_WideToAnsi' referenced from C:\MINIGUIUNICODE\LIB\MINIGUI.LIB|c_windowsAPI Error: Unresolved external '_AnsiToWide' referenced from C:\MINIGUIUNICODE\LIB\MINIGUI.LIB|c_windowsAPI Error: Unresolved external '_HB_FUN_HMG_CREATEFILE_UTF16LE_BOM' referenced from C:\MINIGUIUNICODE\LIB\MINIGUI.LIB|h_ini hbmk2[demo]: Error: Running linker. 2 [/pre2] minigui.cfg имеет вид [pre2] # Basic configuration for Compile.bat MG_CMP=harbour MG_BCC=c:\borland\bcc58 MG_ROOT=c:\miniguiUnicode [/pre2]

gfilatov2002: Выложил 1-е обновление сборки 22.09 с учетом последних дополнений click here Желаю всем удачи

gfilatov2002: SergKis пишет: Сборка версии unicode файлом MakeAllMiniguiLibs.bat выдает протокол с бяками Поправил и обновил архив для этой сборки по старому адресу

SergKis: gfilatov2002 Поправил класс TIniData. Добавил чтение ini из строки буфера (для работы из ресурсов, ini в CUSTOM собираем). Почему то нет ф-ии получение ресурса в строку буфер (может не увидел), нашел только RCDataToFile(...) Весь текст [pre2] /////////////////////////////////////////////////////////////////////////////// CLASS TIniData INHERIT THmgData /////////////////////////////////////////////////////////////////////////////// VAR oIni VAR hKeys INIT { => } VAR hLens INIT { => } VAR cBOM AS STRING INIT hb_utf8Chr( 0xFEFF ) VAR cData AS STRING INIT "" VAR lData AS LOGICAL INIT .F. 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, cData ) INLINE ( ::Super:New( .T. ), ; ::Def( cIni, lMacro, lUtf8, cChar, cData ), Self ) CONSTRUCTOR _METHOD Def( cIni, lMacro, lUtf8, cChar, cData ) _METHOD Read( cIniNew ) _METHOD Write( cFile, lUtf8 ) _METHOD ToValue( cStr ) _METHOD ToString( xVal ) END CLASS METHOD Def( cIni, lMacro, lUtf8, cChar, cData ) CLASS TIniData ::cData := hb_defaultValue( cData, ::cData ) ::lData := ! Empty( ::cData ) .and. HB_ISCHAR( ::cData ) ::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 ) .and. ! ::lData IF ! hb_FileExists( ::cIni ) hb_memoWrit( ::cIni, iif( ::lUtf8, ::cBOM, "" ) + CRLF ) ENDIF ::lIni := hb_FileExists( ::cIni ) ENDIF RETURN Self METHOD Read( cIniNew ) CLASS TIniData LOCAL hIni, cStr, cBuf, aBuf, nBuf, cSec, hSec, oSec, nLen := 1024 LOCAL cChr := ::cCommentChar, xVal, hKey, nKey, cNote, hHash LOCAL cIni := ::cIni, lIni := ::lIni LOCAL lIniNew := .F. IF HB_ISCHAR( cIniNew ) IF ( lIniNew := hb_FileExists( cIniNew ) ) cIni := cIniNew lIni := lIniNew ELSE RETURN Self ENDIF ENDIF IF ::lData .and. ! lIniNew ::lUtf8 := Left( ::cData, Len( ::cBOM ) ) == ::cBOM cBuf := Left( ::cData, nLen ) 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 := Right( ::cData, 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 hHash := hb_hSetCaseMatch( hb_iniReadStr( ::cData, , , ::lAutoMain ), .T. ) ELSEIF 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. ) ENDIF 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 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, 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] Пример для версии unicode https://TransFiles.ru/85dt8 Пример для версии НЕ unicode https://TransFiles.ru/eviz8 В примере строки использования [pre2] // oIni := TIniData():New( cIni, .T. ):Read() cBuf := hb_memoread( cIni ) oIni := TIniData():New( , .T., , , cBuf ):Read() oCom := oIni:COM oIni:Read( ".\demo_new.ini" ) [/pre2] .\demo_new.ini - это заменяющие\добавляющие значения ключей по секциям, т.е. если базовый ini лежит в ресурсах, то доп. ini задаем текущие (для этого клиента) новые значения

SergKis: PS Используем, у себя, такую ф-ю для работы с ресурсом CUSTOM (VC2019) [pre2] #include "cons2.h" // bkLoadCustom( "Name", ["xx.dll"]) -> "..." NAME CUSTOM .\....\file.xxx HB_FUNC( BKLOADCUSTOM ) { HINSTANCE hLib, hInstance; HRSRC hSource; HGLOBAL hRes, lpVoid; char * Buf; WCHAR cFile[MAX_PATH]; WCHAR cName[33]; // +1 for '0' DWORD i, k, nSize; PHB_CODEPAGE s_cdpHost = hb_vmCDP(); if( ! HB_ISCHAR(1) ){ hb_retclen("", 0); return; } hLib = NULL; if( HB_ISCHAR(2) ){ Buf = (char *) hb_parc(2); k = hb_parclen(2); ZeroMemory( cFile, MAX_PATH * 2 ); for(i=0;i<k;i++) cFile[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, Buf[ i ] ); hLib = LoadLibraryExW( cFile, NULL, LOAD_LIBRARY_AS_DATAFILE ); hInstance = hLib; // GetModuleHandleW( NULL ); } else hInstance = GetModuleHandleW( NULL ); if( hInstance == NULL ){ if( hLib != NULL ) FreeLibrary( hLib ); hb_retclen("", 0); return; } Buf = ( char * ) hb_parc(1); k = hb_parclen(1); k = ( k > 32) ? 32 : k; ZeroMemory( cName, 33 * 2 ); for(i=0;i<k;i++) cName[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, Buf[ i ] ); hSource = FindResourceW( hInstance, cName, L"CUSTOM" ); if( hSource==NULL){ if( hLib != NULL ) FreeLibrary( hLib ); hb_retclen("", 0); return; } hRes = LoadResource( hInstance, hSource); if( hRes==NULL){ if( hLib != NULL ) FreeLibrary( hLib ); hb_retclen( "", 0); return; } lpVoid = LockResource ( hRes ); // UnLock в Win32 - не нужно из MSDN // Использовать hSource это ошибка if( lpVoid==NULL ){ hb_retclen("", 0); } else { // -------- Получить ------ nSize = SizeofResource ( hInstance, hSource ); hb_retclen( lpVoid, nSize); // ---------- } FreeResource ( hRes ); if( hLib != NULL ) FreeLibrary( hLib ); } // *** Buf = ( char * ) hb_xgrab( nSize + 1 ); // *** CopyMemory( Buf, lpVoid, nSize ); // *** hb_retclen( Buf, nSize); // *** hb_xfree( Buf ); cons2.h #ifndef __CONS2_H #define __CONS2_H #define _WIN32_WINNT 0x0600 #define HB_OS_WIN_USED #define UNICODE 1 #define _UNICODE 1 // #include "hwingui.h" from hwggui\include #include "hbgtcore.h" #include "hbapi.h" #include "hbapiitm.h" #include "hbapifs.h" #include "hbapierr.h" #include "hbapigt.h" #include "hbstack.h" #include "hbset.h" #include "hb_io.h" #include "hbvm.h" #include "hbwinuni.h" #include "hbapirdd.h" #include "hbrdddbf.h" #include "hbdbf.h" #include "hbdate.h" #include "hbapicls.h" #include <tchar.h> #include <windows.h> #include <shlobj.h> #include <shellapi.h> #include <shlwapi.h> #include <winnls.h> #include <shobjidl.h> #include <objbase.h> #include <objidl.h> #include <shlguid.h> #include <commdlg.h> #define _CHECKSUM2 0 #if ! defined( _MAX_PATH ) #define _MAX_PATH 260 #endif #if ( HB_VER_MAJOR == 3 ) #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, ch) #else #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, fCtrl, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, fCtrl, ch) #endif int MultiByteToWideChar2( UINT CodePage, // code page DWORD dwFlags, // character-type options LPCSTR lpMultiByteStr, // address of string to map int cchMultiByte, // number of characters in string LPWSTR lpWideCharStr, // address of wide-character buffer int cchWideChar // size of buffer ); int WideCharToMultiByte2( UINT CodePage, // code page DWORD dwFlags, // performance and mapping flags LPCWSTR lpWideCharStr, // address of wide-character string int cchWideChar, // number of characters in string LPSTR lpMultiByteStr, // address of buffer for new string int cchMultiByte, // size of buffer LPCSTR lpDefaultChar, // address of default for unmappable characters LPBOOL lpUsedDefaultChar // address of flag set when default char. used ); BOOL ba_IsClassName( HWND hWnd, TCHAR *Name ); typedef unsigned char uchar; #define HB_PARNI( n, x ) hb_parvni( n, x ) #define HB_PARNL( n, x ) hb_parvnl( n, x ) #define HB_STORNI( n, x, y ) hb_storvni( n, x, y ) #define HB_STORNL( n, x, y ) hb_storvnl( n, x, y ) #define HB_STORC( n, x, y ) hb_storvc_t( n, x, y ) #define HB_STORCT( n, x, y ) hb_storvc( n, x, y ) #define HB_STORCLEN( n, x, y, len) hb_storvclen( n, len, x, y) #define HB_STORL( n, x, y ) hb_storvl( n, x, y ) // Использовать для функций HWG_ #define HB_RETHANDLE( h ) hb_retptr( ( void * ) ( h ) ) #define HB_PARHANDLE( n ) hb_parptr( n ) #define HB_STOREHANDLE( h, n ) hb_storptr( ( void * ) ( h ), n ) #define HB_PUTHANDLE( i, h ) hb_itemPutPtr( i, ( void * ) ( h ) ) #define HB_GETHANDLE( i ) hb_itemGetPtr( i ) #define _HB_PARSTR( n, h, len ) wvt_wstrget( hb_param( n, HB_IT_ANY ), h, len ) #define _HB_PARSTRDEF( n, h, len ) wvt_wstrnull( hwg_wstrget( hb_param( n, HB_IT_ANY ), h, len ) ) #define _HB_RETSTR( str ) wvt_wstrset( hb_param( -1, HB_IT_ANY ), str ) #define _HB_RETSTRLEN( str, len ) wvt_wstrlenset( hb_param( -1, HB_IT_ANY ), str, len ) #define _HB_STORSTR( str, n ) wvt_wstrset( hb_param( n, HB_IT_BYREF ), str ) #define _HB_STORSTRLEN( str, len, n ) wvt_wstrlenset( hb_param( n, HB_IT_BYREF ), str, len ) #define _HB_ARRAYGETSTR( arr, n, h, len ) wvt_wstrget( hb_arrayGetItemPtr( arr, n ), h, len ) #define _HB_ARRAYSETSTR( arr, n, str ) wvt_wstrset( hb_arrayGetItemPtr( arr, n ), str ) #define _HB_ARRAYSETSTRLEN( arr, n, str, len ) wvt_wstrlenset( hb_arrayGetItemPtr( arr, n ), str, len ) #define _HB_ITEMCOPYSTR( itm, str, len ) wvt_wstrcopy( itm, str, len ) #define _HB_ITEMGETSTR( itm, h, len ) wvt_wstrget( itm, h, len ) #define _HB_ITEMPUTSTR( itm, str ) wvt_wstrput( itm, str ) #define _HB_ITEMPUTSTRLEN( itm, str, len ) wvt_wstrlenput( itm, str, len ) #define _HB_STRUNSHARE( h, str, len ) wvt_wstrunshare( h, str, len ) #define _hb_strfree( h ) wvt_wstrfree( h ) extern const char * wvt_strnull( const char * str ); extern const char * wvt_strget( PHB_ITEM pItem, void ** phStr, HB_SIZE * pulLen ); extern HB_SIZE wvt_strcopy( PHB_ITEM pItem, char * pStr, HB_SIZE ulLen ); extern char * wvt_strunshare( void ** phStr, const char * pStr, HB_SIZE ulLen ); extern void wvt_strfree( void * hString ); extern const wchar_t * wvt_wstrnull( const wchar_t * str ); extern const wchar_t * wvt_wstrget( PHB_ITEM pItem, void ** phStr, HB_SIZE * pulLen ); extern PHB_ITEM wvt_wstrput( PHB_ITEM pItem, const wchar_t * pStr ); extern void wvt_wstrset( PHB_ITEM pItem, const wchar_t * pStr ); extern PHB_ITEM wvt_wstrlenput( PHB_ITEM pItem, const wchar_t * pStr, HB_SIZE ulLen ); extern void wvt_wstrlenset( PHB_ITEM pItem, const wchar_t * pStr, HB_SIZE ulLen ); extern HB_SIZE wvt_wstrcopy( PHB_ITEM pItem, wchar_t * pStr, HB_SIZE ulLen ); extern wchar_t * wvt_wstrunshare( void ** phStr, const wchar_t * pStr, HB_SIZE ulLen ); extern void wvt_wstrfree( void * hString ); void _DbViewLogW(LPCWSTR cFormat, ... ); void _DbViewLogA(LPCSTR cFormat, ... ); #define _LA _DbViewLogA #define _LW _DbViewLogW #endif /* __CONS2_H */ [/pre2]

gfilatov2002: SergKis пишет: Поправил класс TIniData. Добавил чтение ini из строки буфера Большое спасибо за дополнение Обязательно использую эти изменения для следующей сборки (после изучения, конечно ).

gfilatov2002: SergKis пишет: Почему то нет ф-ии получение ресурса в строку буфер (может не увидел), нашел только RCDataToFile(...) Добавил новую функцию RCDataToMem() Синтаксис: RCDataToMem( <cResName>|<nResID>, [<cResType>|<nResType>], ; [<hModule>] ) => cResult Благодарю за ваш запрос

gfilatov2002: Завершена подготовка 2-го обновления сборки 22.09, которое планируется к выпуску на этой неделе Кратко, что нового: [pre2] * New: Added the useful C-function RCDataToMem(). Syntax: RCDataToMem( <cResName>|<nResID>, [<cResType>|<nResType>], ; [<hModule>] ) => cResult Requested by Sergej Kiselev on the Russian HMG forum. Contributed by Grigory Filatov <gfilatov@gmail.com> (see demo3.prg in folder \samples\Advanced\RCDataToFile) * Enhanced: OOP class TIniData supports loading the values from memory variable instead of ini file. Suggested and contributed by Sergej Kiselev (see demo2.prg in folder \samples\Advanced\Tsb_Ini2Tbrowse) * Updated: ComboBox control message APIs were used in some C-code instead the direct calling the function SendMessage(). Contributed by Grigory Filatov <gfilatov@gmail.com> (see demo in folder \samples\Advanced\AutoFill_2) * Updated: Finished replacement of LONG_PTR with HB_PTRUINT in the kernel C-code casting. Contributed by Grigory Filatov <gfilatov@gmail.com> * Updated: MySql library source code (see in folder \Source\HbMySql): - added the support for SSL options in the class TMySQLServer; - added support for TIMESTAMP and DATETIME types in the method TMySQLQuery():GetRow(). Based upon a contribution of Viktor Szakats (borrowed from 3.4 fork). Adapted for Minigui Extended by Grigory Filatov * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.39.4 (from 3.39.3). Contributed by Grigory Filatov <gfilatov@gmail.com> * Updated: 'How to add, edit, delete and browse data into an object in an MDI-child window' sample. Contributed by Grigory Filatov <gfilatov@gmail.com> (see test04.prg in folder \samples\Advanced\TDatabase) [/pre2] Благодарю за внимание к этому проекту

gfilatov2002: Выложил 2-е обновление сборки 22.09 с учетом последних исправлений и дополнений click here

Alex_Cher: Мужики ... в общем ответ на вопрос очевиден, все же хочу проконсультироваться у спецов. Руководство в конторе переводит все компы на Astra Linux, у меня все софты на Harbor - возможны ли какие-либо проблемы ..?

SergKis: gfilatov2002 Предложение вкл. ф-ии работы с txt файлами как образы в память, оч. быстрая работа. Описание ф-ий [pre2] fmp_Open( cFile, [nMapArea], [ nRO ] ) -> nMapArea | -1 cFile Имя файла в режиме только чтение. nMapArea номер области ( 1 - 10 ) или -1 ( F_ERROR ) nRO в каком режиме открывать файл == 0 fmp_Count( [nMapArea] ) -> nCount количество строк файла "...Chr(13)+Chr(10)" nMapArea - номер области ( 1 - 10 ) [ nMapArea == 1 ] учитывается что в последней строке может и не быть Chr(10) ? но текст есть Скорость на тесте : (200 файлов и 1 500 000 строк всего) время 0.2 ~ 0.3 сек fmp_Line( [nMapArea], [nLine], [lCheckUTF8] ) -> "Line..." | "" получить строку по номеру nMapArea - номер области ( 1 - 10 ) [ nMapArea == 1 ] nLine - номер строки от 1 до fmp_Count( nMapArea ) эта запись становится текущей, ее можно получить fmp_RecNo( [ nMapArea ] ) если опущена то следующая за текущей если это была последняя то fmp_EOF( nMapArea ) -> .T. lCheckUTF8 - нужно ли учитывать кодировку файла Def == .T. fmp_RecNo( [nMapArea] ) -> nRecord | 0 fmp_Close( nMapArea ) -> .T. | .F. закрыть файлы ( nMp : 1 - 10 ) nMapArea - номер области ( 1 - 10 ) [ nMapArea == 1 ] fmp_IsUtf8( nMapArea ) -> .T. | .F. кодировка ? nMapArea - номер области ( 1 - 10 ) [ nMapArea == 1 ] fmp_Eof( nMp ) -> .T. | .F. nMapArea - номер области ( 1 - 10 ) [ nMapArea == 1 ] fmp_ATokenCSV( [nMapArea], nLine, [lDel], [lCheckUTF8] ) -> {"Line..." | "", ...} получить массив токенов для файла CSV nMapArea - номер области ( 1 - 10 ) [ nMapArea == 1 ] lDel == .T. ковычки удаляет ( если есть одновременно обе ) .F. ничего не удаляет [ lDel == .T. ] lCheckUTF8 == .T. - проверять наличие utf-8 и перекодировать .F. - как есть [ lCheckUTF8 == .T. ] разделитель Chr(9) и проверяет начало и конец как '"' [/pre2] Функции [pre2] #include "cons2.h" // extern void _DbViewLogA(char *cFormat, ...); // lstrcpynA( ( LPSTR ) &MF, ( LPCSTR ) hb_parc(1), MF_SIZE ); typedef struct _hb_MapFile { HANDLE hFile; HANDLE hMap; LARGE_INTEGER nFileSize; unsigned char * pData; DWORD dwSize; /* Размер файла == 0 не открыт */ unsigned char * pLine; /* Текущая запись */ DWORD nLen; DWORD nLine; BOOL fUTF8; BOOL fUNI; BOOL fEOF; int res; } hb_MapFile; #define MF_SIZE sizeof( hb_MapFile ) #define AMF_SIZE 10 #define MF ( amf[mf_index] ) static int mf_index = 0; static hb_MapFile amf[ AMF_SIZE ] = { 0 }; static int _GetIndex( int nPar ) { int i=0; if( HB_ISNUM(nPar) ) i = hb_parnl(nPar); mf_index = (i > 0 && i <= AMF_SIZE )? i-1 : mf_index; return mf_index; } static BOOL _CodeParam( int nPar, WCHAR *cFile ) { BOOL lResult=FALSE; int k; unsigned char *s; PHB_CODEPAGE s_cdpHost = hb_vmCDP(); cFile[0] = 0; if( HB_ISCHAR(1) ) /* ZeroMemory( cFile, (MAX_PATH+1)*2); */ { k = hb_parclen( nPar ); if( k > 0) { s = (unsigned char *) hb_parc( nPar ); while( k-- > 0) *cFile++ = _hb_cdpGetU16(s_cdpHost,TRUE, *s++ ); *cFile = 0; lResult = TRUE; } } return lResult; } static BOOL __CloseFile() { if( MF.pData ) UnmapViewOfFile( MF.pData ); if( MF.hMap ) CloseHandle( MF.hMap ); if( MF.hFile != INVALID_HANDLE_VALUE) CloseHandle( MF.hFile ); ZeroMemory( &MF, MF_SIZE); return FALSE; } static BOOL __OpenFile( WCHAR * cFile, int ind, int nRO ) { int i=0,n; while( amf[ i ].dwSize > 0 && i < AMF_SIZE) i++; if(i == AMF_SIZE) return FALSE; mf_index = i; ZeroMemory( &MF, MF_SIZE); MF.res ++ ; MF.hFile = CreateFileW( cFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( MF.hFile == INVALID_HANDLE_VALUE) return __CloseFile(); MF.res ++ ; if( ! GetFileSizeEx(MF.hFile, &MF.nFileSize) ) return __CloseFile(); MF.dwSize = MF.nFileSize.u.LowPart; /* MF.nFileSize.QuadPart; */ /* Контроль 0 ! */ if( MF.dwSize==0 ) return __CloseFile(); MF.res ++ ; MF.hMap = CreateFileMappingW( MF.hFile, NULL, PAGE_READONLY, MF.nFileSize.u.HighPart, MF.nFileSize.u.LowPart, NULL); if( ! MF.hMap ) return __CloseFile(); MF.res ++ ; MF.pData = ( char *) MapViewOfFile( MF.hMap, FILE_MAP_READ, 0, 0, MF.dwSize); if( ! MF.pData ) return __CloseFile(); MF.fUTF8 = MF.pData[0]==0xEF && MF.pData[1]==0xBB && MF.pData[2]==0xBF; MF.fUNI = MF.pData[0]==0xFE && MF.pData[1]==0xFF; i = ( MF.fUTF8 )? 3 : 0; i = ( MF.fUNI ) ? 2 : 0; MF.pLine = MF.pData + i; n = 0; /* while( ( DWORD ) i < MF.dwSize && MF.pData[ i ] != 10) { i++; n++; } MF.nLine = 1; MF.nLen = ( n>0 && (MF.pData[i-1]==13) )? (n-1) : n; */ return TRUE; } /* fmp_Open( cFile, [nMp], [ nRO == 0] ) -> nMp | -1 cFile Имя файла в режиме только чтение. nMp номер области ( 1 - 10 ) или -1 ( F_ERROR ) nRO в каком режиме открывать файл */ HB_FUNC( FMP_OPEN ) { WCHAR cFile[ MAX_PATH+1 ]; int nRO=0; if( _CodeParam( 1, cFile ) ) { nRO = ( HB_ISNUM(3) )? hb_parnl(3) : nRO; if( __OpenFile( cFile, _GetIndex(2), nRO ) ) { MF.pLine = MF.pData; hb_retnl( mf_index + 1 ); return ; } } hb_retnl(-1); } /* fmp_Count( [nMp] ) -> nCount количество строк файла "...Chr(13)+Chr(10)" учитывается что в последней строке может и не быть Chr(10) ? но текст есть Скорость на тесте : (200 файлов и 1 500 000 строк всего) время 0.2 ~ 0.3 сек */ HB_FUNC( FMP_COUNT ) { unsigned char *p; DWORD nCount=0, i=0, n=0; _GetIndex( 1 ); if( ! (p = MF.pData) ) { hb_retnl(0); return; } while( i++ < MF.dwSize) { if( *p++ == 10 ) { n = 0; nCount++;} /* Новая строка */ else n ++; } hb_retnl( nCount + ((n > 0)? 1 : 0) ); } static void __RetDeCode( unsigned char *utf, int Ln, BOOL lCheck, int y) { PHB_CODEPAGE cdp; int n=0; unsigned char *s; if( lCheck ) { while(n < Ln && utf[n] < 0x80) n++; if( n < Ln) /* Нужно кодировать */ { cdp = hb_vmCDP(); n = hb_cdpUTF8AsStrLen( cdp, utf, Ln, 0 ); /* Нужная длинна */ if(n > 0) { if( (s = hb_xgrab(n + 1)) ) { hb_cdpUTF8ToStr( cdp, utf, Ln, s, n + 1 ); if(y > 0) hb_storvclen_buffer( s, n, -1, y); else hb_retclen_buffer( s, n ); return ; } } } } if( y > 0 ) hb_storvclen( utf, Ln, -1, y); else hb_retclen( utf, Ln ); } /* Найти запись по номеру Вернет количество символов в строке или -1 если не найдена */ static int _findNextRec( DWORD nPar,int nSkip, BOOL lCheckUTF8) /* Найти запись номер */ { unsigned char *p; DWORD n=0, nCount, nLine; DWORD i; if( HB_ISNUM(nPar) ) /* Ищем от начала */ { p = MF.pData; if( MF.fUTF8 && lCheckUTF8 ) p += 3; /* Пропустить BOM */ nCount = 0; /* Текущий внутренний */ MF.pLine = p; nLine = hb_parnl( nPar ); } else { nLine = MF.nLine + nSkip; /* Skip 1 */ p = MF.pLine + MF.nLen; nCount = MF.nLine; } // p = MF.pLine; /* Исходные не меняем если не найдено */ // nCount = MF.nLine; i = p - MF.pData; while( i++ < MF.dwSize) { if( *p++ == 10 ) { nCount++; if( nCount == nLine ) { MF.pLine = (p - n - 1); /* Начало возвращаемой строки */ MF.nLine = nLine; /* Номер возвращаемой строки */ MF.nLen = n + 1; MF.fEOF = FALSE; return (n-1); } n = 0; } /* Новая строка */ else n ++; /* Кол-во символов в стрке */ } if( n > 0 && (nCount+1)==nLine ) { MF.pLine = p - n; /* Начало возвращаемой строки */ MF.nLine = nLine; /* Номер возвращаемой строки */ MF.nLen = n; MF.fEOF = FALSE; return n; } MF.fEOF = TRUE; return -1; } /* stores a fixed length string on a variable by reference hb_storclen( const char * szText, HB_SIZE nLength, int iParam ); */ /* fmp_Line( [nMp], [nLine], [lCheckUTF8] ) -> "Line..." | "" получить строку по номеру nLine номер строки от 1 до hb_CountFileMap(cMp) lCheckUTF8 - нужно ли учитывать кодировку файла Def == .T. */ // lstrcpynA( ( LPSTR ) &MF, ( LPCSTR ) hb_parc(1), MF_SIZE ); // hb_storclen( (char * ) &MF, MF_SIZE, 1); /* Обновить параметр */ HB_FUNC( FMP_LINE ) { long n=0; BOOL lCheckUTF8=TRUE; _GetIndex( 1 ); lCheckUTF8 = ( HB_ISLOG(3) )? hb_parl(3) : lCheckUTF8; n = _findNextRec( 2, 1, lCheckUTF8); // if( HB_ISNUM(2) ) n = _findNextRec( 2, 1, lCheckUTF8); // else n = MF.nLen; if( n >= 0) __RetDeCode( MF.pLine, n, MF.fUTF8 && lCheckUTF8, 0); else hb_retclen( "", 0); } static void __Token( unsigned char *cLine, int nLen, BOOL lDel, BOOL lCheckUTF8) { int i=0,k=0, n, y; unsigned char *p; while(i < nLen) { if(cLine[ i ]==9){ n=0; k++; } else n ++; i ++; } hb_reta( k + ( (n > 0)? 1 : 0) ); i = 0; y = 0; n = 0; while(i < nLen) { if( cLine[ i ]==9 ) { y ++; p = &cLine[i-n]; /* Начало токена */ if( lDel && n > 1 && p[0]==0x22 && p[n-1]==0x22) __RetDeCode( p+1, n-2, MF.fUTF8 && lCheckUTF8, y); /* hb_storvclen( p+1, n-2, -1, y); */ else __RetDeCode( p, n, MF.fUTF8 && lCheckUTF8, y); /* hb_storvclen( p, n, -1, y); */ n=0; } else n ++; i ++; } if( n > 0) { p = &cLine[i-n]; /* Начало токена */ if( lDel && n > 1 && p[0]==0x22 && p[n-1]==0x22) __RetDeCode( p+1, n-2, MF.fUTF8 && lCheckUTF8, y+1); /* hb_storvclen( p+1, n-2, -1, y+1); */ else __RetDeCode( p, n, MF.fUTF8 && lCheckUTF8, y+1); /* hb_storvclen( p, n, -1, y+1); */ } } /* fmp_ATokenCSV( [nMp], nLine,[lDel=.T.],[lCheckUTF8:=.T.] ) -> {"Line..." | "", ...} получить массив токенов для файла CSV разделитель Chr(9) и проверяет начало и конец как '"' lDel == .T. ковычки удаляет ( если есть одновременно обе ) .F. ничего не удаляет lCheckUTF8 == .T. - проверять наличие utf-8 и перекодировать .F. - как есть */ HB_FUNC( FMP_ATOKENCSV ) { long n; BOOL lDel=FALSE; BOOL lCheckUTF8=TRUE; _GetIndex( 1 ); lDel = ( HB_ISLOG(3) )? hb_parl(3) : lDel; lCheckUTF8 = ( HB_ISLOG(4) )? hb_parl(4) : lCheckUTF8; if( HB_ISNUM(2) ) n = _findNextRec( 2, 1, lCheckUTF8); else n = MF.nLine; if( n >= 0) __Token( MF.pLine, n, lDel, lCheckUTF8); else hb_reta( 0 ); } /* fmp_Close( nMp ) -> .T. | .F. закрыть файлы ( nMp : 1 - 10 ) */ HB_FUNC( FMP_CLOSE ) { _GetIndex( 1 ); __CloseFile(); } /* fmp_IsUtf8( nMp ) -> .T. | .F. кодировка ( nMp : 1 - 10 ) */ HB_FUNC( FMP_ISUTF8 ) { _GetIndex( 1 ); hb_retl( MF.fUTF8 ); } /* fmp_Eof( nMp ) -> .T. | .F. кодировка ( nMp : 1 - 10 ) */ HB_FUNC( FMP_EOF ) { _GetIndex( 1 ); hb_retl( MF.fEOF ); } /* fmp_RecNo( nMp ) -> nRecord | 0 кодировка ( nMp : 1 - 10 ) */ HB_FUNC( FMP_RECNO ) { _GetIndex( 1 ); if( MF.hFile==INVALID_HANDLE_VALUE || MF.hFile==NULL) hb_retnl( 0 ); else hb_retnl( MF.nLine ); } cons2.h #ifndef __CONS2_H #define __CONS2_H #define _WIN32_WINNT 0x0600 #define HB_OS_WIN_USED #define UNICODE 1 #define _UNICODE 1 // #include "hwingui.h" from hwggui\include #include "hbgtcore.h" #include "hbapi.h" #include "hbapiitm.h" #include "hbapifs.h" #include "hbapierr.h" #include "hbapigt.h" #include "hbstack.h" #include "hbset.h" #include "hb_io.h" #include "hbvm.h" #include "hbwinuni.h" #include "hbapirdd.h" #include "hbrdddbf.h" #include "hbdbf.h" #include "hbdate.h" #include "hbapicls.h" #include <tchar.h> #include <windows.h> #include <shlobj.h> #include <shellapi.h> #include <shlwapi.h> #include <winnls.h> #include <shobjidl.h> #include <objbase.h> #include <objidl.h> #include <shlguid.h> #include <commdlg.h> #define _CHECKSUM2 0 #if ! defined( _MAX_PATH ) #define _MAX_PATH 260 #endif #if ( HB_VER_MAJOR == 3 ) #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, ch) #else #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, fCtrl, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, fCtrl, ch) #endif int MultiByteToWideChar2( UINT CodePage, // code page DWORD dwFlags, // character-type options LPCSTR lpMultiByteStr, // address of string to map int cchMultiByte, // number of characters in string LPWSTR lpWideCharStr, // address of wide-character buffer int cchWideChar // size of buffer ); int WideCharToMultiByte2( UINT CodePage, // code page DWORD dwFlags, // performance and mapping flags LPCWSTR lpWideCharStr, // address of wide-character string int cchWideChar, // number of characters in string LPSTR lpMultiByteStr, // address of buffer for new string int cchMultiByte, // size of buffer LPCSTR lpDefaultChar, // address of default for unmappable characters LPBOOL lpUsedDefaultChar // address of flag set when default char. used ); BOOL ba_IsClassName( HWND hWnd, TCHAR *Name ); typedef unsigned char uchar; #define HB_PARNI( n, x ) hb_parvni( n, x ) #define HB_PARNL( n, x ) hb_parvnl( n, x ) #define HB_STORNI( n, x, y ) hb_storvni( n, x, y ) #define HB_STORNL( n, x, y ) hb_storvnl( n, x, y ) #define HB_STORC( n, x, y ) hb_storvc_t( n, x, y ) #define HB_STORCT( n, x, y ) hb_storvc( n, x, y ) #define HB_STORCLEN( n, x, y, len) hb_storvclen( n, len, x, y) #define HB_STORL( n, x, y ) hb_storvl( n, x, y ) // Использовать для функций HWG_ #define HB_RETHANDLE( h ) hb_retptr( ( void * ) ( h ) ) #define HB_PARHANDLE( n ) hb_parptr( n ) #define HB_STOREHANDLE( h, n ) hb_storptr( ( void * ) ( h ), n ) #define HB_PUTHANDLE( i, h ) hb_itemPutPtr( i, ( void * ) ( h ) ) #define HB_GETHANDLE( i ) hb_itemGetPtr( i ) #define _HB_PARSTR( n, h, len ) wvt_wstrget( hb_param( n, HB_IT_ANY ), h, len ) #define _HB_PARSTRDEF( n, h, len ) wvt_wstrnull( hwg_wstrget( hb_param( n, HB_IT_ANY ), h, len ) ) #define _HB_RETSTR( str ) wvt_wstrset( hb_param( -1, HB_IT_ANY ), str ) #define _HB_RETSTRLEN( str, len ) wvt_wstrlenset( hb_param( -1, HB_IT_ANY ), str, len ) #define _HB_STORSTR( str, n ) wvt_wstrset( hb_param( n, HB_IT_BYREF ), str ) #define _HB_STORSTRLEN( str, len, n ) wvt_wstrlenset( hb_param( n, HB_IT_BYREF ), str, len ) #define _HB_ARRAYGETSTR( arr, n, h, len ) wvt_wstrget( hb_arrayGetItemPtr( arr, n ), h, len ) #define _HB_ARRAYSETSTR( arr, n, str ) wvt_wstrset( hb_arrayGetItemPtr( arr, n ), str ) #define _HB_ARRAYSETSTRLEN( arr, n, str, len ) wvt_wstrlenset( hb_arrayGetItemPtr( arr, n ), str, len ) #define _HB_ITEMCOPYSTR( itm, str, len ) wvt_wstrcopy( itm, str, len ) #define _HB_ITEMGETSTR( itm, h, len ) wvt_wstrget( itm, h, len ) #define _HB_ITEMPUTSTR( itm, str ) wvt_wstrput( itm, str ) #define _HB_ITEMPUTSTRLEN( itm, str, len ) wvt_wstrlenput( itm, str, len ) #define _HB_STRUNSHARE( h, str, len ) wvt_wstrunshare( h, str, len ) #define _hb_strfree( h ) wvt_wstrfree( h ) extern const char * wvt_strnull( const char * str ); extern const char * wvt_strget( PHB_ITEM pItem, void ** phStr, HB_SIZE * pulLen ); extern HB_SIZE wvt_strcopy( PHB_ITEM pItem, char * pStr, HB_SIZE ulLen ); extern char * wvt_strunshare( void ** phStr, const char * pStr, HB_SIZE ulLen ); extern void wvt_strfree( void * hString ); extern const wchar_t * wvt_wstrnull( const wchar_t * str ); extern const wchar_t * wvt_wstrget( PHB_ITEM pItem, void ** phStr, HB_SIZE * pulLen ); extern PHB_ITEM wvt_wstrput( PHB_ITEM pItem, const wchar_t * pStr ); extern void wvt_wstrset( PHB_ITEM pItem, const wchar_t * pStr ); extern PHB_ITEM wvt_wstrlenput( PHB_ITEM pItem, const wchar_t * pStr, HB_SIZE ulLen ); extern void wvt_wstrlenset( PHB_ITEM pItem, const wchar_t * pStr, HB_SIZE ulLen ); extern HB_SIZE wvt_wstrcopy( PHB_ITEM pItem, wchar_t * pStr, HB_SIZE ulLen ); extern wchar_t * wvt_wstrunshare( void ** phStr, const wchar_t * pStr, HB_SIZE ulLen ); extern void wvt_wstrfree( void * hString ); void _DbViewLogW(LPCWSTR cFormat, ... ); void _DbViewLogA(LPCSTR cFormat, ... ); #define _LA _DbViewLogA #define _LW _DbViewLogW #endif /* __CONS2_H */ [/pre2] Пример использования [pre2] *----------------------------------------------------------------------------* STATIC FUNCTION TxtToDbf( cTxt, cDbf ) *----------------------------------------------------------------------------* LOCAL nMp, cTx, cDt, cKy LOCAL cNm := lower(hb_FNameName(cDbf)) LOCAL nRec := 0 IF ( nMp := fmp_Open( cTxt ) ) > 0 IF ! fmp_Eof( nMp ) fmp_Line ( nMp ) // пустая fmp_Line ( nMp ) // header fmp_Line ( nMp ) // ====== lIn := .T. ENDIF IF mDbUse( cDbf, "TMP", .F. ) // USE ( cDbf ) ALIAS TMP NEW ; IF Used() IF "e_row" $ cNm DO WHILE ! fmp_Eof( nMp ) cTx := fmp_Line( nMp ) // нет текстов utf8 в файле IF Right(( cKy := left(cTx, 12) ), 1) $ "0123456789" IF chr(0) $ cTx ; cTx := StrTran(cTx, chr(0), "") ENDIF cDt := subs( cTx,14, 12) APPEND BLANK FieldPut( 1, cKy ) FieldPut( 2, cDt ) FieldPut( 3, subs(cTx, 27, 12) ) FieldPut( 4, nUx2cDts( Val(cDt) ) ) ENDIF ENDDO ELSEIF "o_nam" $ cNm // объекты name DO WHILE ! fmp_Eof( nMp ) cTx := fmp_Line( nMp ) IF Right(( cKy := left(cTx, 12) ), 1) $ "0123456789" APPEND BLANK FieldPut( 1, cKy ) FieldPut( 2, subs( cTx, 14, 12) ) FieldPut( 3, subs( cTx, 27, 12) ) FieldPut( 4, subs( cTx, 40, 12) ) FieldPut( 5, subs( cTx, 53, 12) ) FieldPut( 6, subs( cTx, 61, 12) ) FieldPut( 7, subs( cTx, 79, 12) ) FieldPut( 8, subs( cTx, 92, 6) ) cTx := Dos4W5( alltrim(subs( cTx, 99 )), 8) IF chr(0) $ cTx ; cTx := StrTran(cTx, chr(0), "") ENDIF FieldPut( 9, cTx ) ENDIF ENDDO ELSEIF "o_" $ cNm .or. "e_nam" $ cNm .or. "e_adr" $ cNm // объекты ... DO WHILE ! fmp_Eof( nMp ) cTx := fmp_Line( nMp ) IF Right(( cKy := left(cTx, 12) ), 1) $ "0123456789" APPEND BLANK FieldPut( 1, cKy ) FieldPut( 2, subs( cTx, 14, 12) ) cTx := Dos4W5( alltrim(subs( cTx, 27 )), 8) IF chr(0) $ cTx ; cTx := StrTran(cTx, chr(0), "") ENDIF FieldPut( 3, cTx ) ENDIF ENDDO ELSE DO WHILE ! fmp_Eof( nMp ) cTx := fmp_Line( nMp ) IF Right(( cKy := left(cTx, 12) ), 1) $ "0123456789" APPEND BLANK FieldPut( 1, cKy ) cTx := Dos4W5( alltrim(subs( cTx, 14 )), 8) IF chr(0) $ cTx ; cTx := StrTran(cTx, chr(0), "") ENDIF FieldPut( 2, cTx ) ENDIF ENDDO ENDIF nRec := LastRec() USE ENDIF fmp_Close( nMp ) ENDIF fErase(cTxt) RETURN nRec [/pre2]

Andrey: Что то не совсем понятен пример использования ? Там просто функция чтения файла и всё. А как вытаскивать нужные значения в тексте программы ?

SergKis: Andrey пишет Что то не совсем понятен пример использования ? [pre2] IF ( nMp := fmp_Open( cTxt ) ) > 0 DO WHILE ! fmp_Eof( nMp ) cTx := fmp_Line( nMp ) ... ENDDO fmp_Close( nMp ) ENDIF или IF ( nMp := fmp_Open( cTxt ) ) > 0 nK := fmp_Count( nMp ) FOR nI := 1 TO nK cTx := fmp_Line( nMp, nI ) ... NEXT fmp_Close( nMp ) ENDIF ... [/pre2] Там просто функция чтения файла и всё Так это и есть ф-ии чтения файла, который мапируется средствами windows в память. Если у тебя есть журналы большие лог и их много за период, то можно организовать на этих ф-ях просмотр журналов или съесть их в dbf (данные зависят от структуры лога в каждом конкретном случае). Пример показан для выборки из файлов txt до ~10 000 000 записей каждый (выдаваемые отчеты в txt из системы sql сервера) данных в dbf для дальнейшей индексации и реализации получения отчетов, которых нет в системе (а их там практически нет - все в ручном режиме через задание sql команд select ...) А как вытаскивать нужные значения в тексте программы ? Как из полученной строки. В примере это так [pre2] cTx := fmp_Line( nMp ) IF Right(( cKy := left(cTx, 12) ), 1) $ "0123456789" APPEND BLANK FieldPut( 1, cKy ) FieldPut( 2, subs( cTx, 14, 12) ) FieldPut( 3, subs( cTx, 27, 12) ) FieldPut( 4, subs( cTx, 40, 12) ) FieldPut( 5, subs( cTx, 53, 12) ) FieldPut( 6, subs( cTx, 61, 12) ) FieldPut( 7, subs( cTx, 79, 12) ) FieldPut( 8, subs( cTx, 92, 6) ) cTx := Dos4W5( alltrim(subs( cTx, 99 )), 8) // перекодировка utf8 -> LV866 IF chr(0) $ cTx ; cTx := StrTran(cTx, chr(0), "") ENDIF FieldPut( 9, cTx ) [/pre2] ф-я ниже разбирает строку полей, отделенных Chr(9) на массив значений полей fmp_ATokenCSV( [nMapArea], nLine, [lDel], [lCheckUTF8] ) -> {"Line..." | "", ...} // получить массив токенов для файла CSV где lDel == .T. кавычки удаляет ( если есть одновременно обе ) или .F. ничего не удаляет [ lDel == .T. default ] т.е.[pre2] aVal := fmp_ATokenCSV( nMp, nI ) (cAls)->( AEval(aVal, {|c,n| FieldPut(n, c) }) ) [/pre2] Одновременно можно открыть до 10 областей (файлов) для обработки, т.е. nMp1 := fmp_Open( cTxt1 ) nMp2 := fmp_Open( cTxt2 ) ... nMp10 := fmp_Open( cTxt10 )



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