Harbour для начинающих

Александр Кресин
2003 - 2016

4. Дополнительные библиотеки

4.1 Обзор

Благодаря наличию так называемой "Системы расширения" (Extend system) к prg-модулю, написанному на Harbour, можно подключать модули, написанные на C, что делает возможным использовать большое количество самых разных инструментов программирования через C API. Многие такие модули находятся в Harbour/contrib, многие доступны с сайтов производителей и Open source репозитариев как так называемые 3-rd party библиотеки. Собственно, значительная часть функций, модулей самого Harbour написана на C и использует ту же "Систему расширения". Отличие дополнительных библиотек только в том, что их по тем или иным причинам не сочли возможным или нужным включить в ядро Harbour.

Ниже приведен список того, что включено в Harbour/contrib на момент написания этой статьи:

Хочу отметить, что не все из перечисленных модулей полностью готовы к использованию, некоторые представляют собой просто пробу пера, рассчитанную на то, что общими усилиями их удастся довести до более высокой степени готовности.


hbbz2

Эта библиотека содержит набор функций-оболочек для BZip2, она реализует компрессию / декомпрессию текстовых строк.

При сборке программ с hbbz2 помимо основного набора вам потребуется библиотека bz2 и, конечно сама hbbz2.

Список функций:

cCompressed := hb_bz2_Compress( cData, [nDstBufLen|@cBuffer], [@nResult], [nLevel] )Сжимает текстовую строку cData с уровнем сжатия nLevel (0 - 9, по умолчанию - 6).
cUnCompressed := hb_bz2_UnCompress( cCompressed, [nDstBufLen|@cBuffer], [@nResul>] )Распаковывает сжатую текстовую строку cCompressed.

hbbz2io

Эта библиотека представляет собой потоковый драйвер ввода/вывода для BZip2, который может быть использован в функциях файлового ввода/вывода hb_vf*() и в таких RDD, как SDF и DELIM.

При сборке программ с hbbz2io помимо основного набора вам потребуются библиотеки hbbz2, bz2 и, конечно сама hbbz2io. В программе надо прописать строчку

      REQUEST HB_BZ2IO

Теперь, если перед именем файла поставить "bz:" или "bgz[0-9]:" (0 - 9 - требуемый уровень компрессии), будет использоваться bz2io драйвер, например:

      REQUEST HB_GZIO, HB_BZ2IO

      FUNCTION GZip2Bz2( cFile )
         RETURN hb_vfCopy( "gz:" + cFile + ".gz", "bz:" + cFile + ".bz2" )

hbgzio

Эта библиотека представляет собой потоковый драйвер ввода/вывода для GZip, который может быть использован в функциях файлового ввода/вывода hb_vf*() и в таких RDD, как SDF и DELIM.

При сборке программ с hbgzio помимо основного набора вам потребуется библиотека hbzlib и, конечно сама hbgzio. В программе надо прописать строчку

      REQUEST HB_GZIO

Теперь, если перед именем файла поставить "gz:" или "gz[0-9]:" (0 - 9 - требуемый уровень компрессии), будет использоваться gzio драйвер, например:

       REQUEST HB_GZIO

       USE test
       COPY TO gz:test.txt.gz DELIMITED WITH TAB
или
       REQUEST HB_GZIO

       hb_vfCopy( "file.txt", "gz9:file.txt.gz" )
       USE test
       APPEND FROM "gz:file.txt.gz"
       hb_vfErase( "file.txt.gz" )
или
       REQUEST HB_GZIO

       FUNCTION GZIP( cFile )
          RETURN hb_vfCopy( cFile, "gz:" + cFile + ".gz" )

hbmemio

Эта библиотека представляет собой драйвер ввода/вывода для файлов, размещенных в оперативной памяти, который может быть использован в RDD и в функциях файлового ввода/вывода hb_vf*().

При сборке программ с hbmemio помимо основного набора вам потребуется подключить библиотеку hbmemio. В программе надо прописать строчку

      REQUEST HB_MEMIO

Теперь, если перед именем файла поставить "mem:", будет использоваться memio драйвер, например:

       REQUEST HB_MEMIO

       LOCAL i

       dbCreate( "mem:test", { { "F1", "N", 9, 0 } }, , .T., "memarea" )

       FOR i := 1 TO 1000
          dbAppend()
          FIELD->F1 := hb_Random() * 1000000
       NEXT
       INDEX ON FIELD->F1 TAG f1
       dbEval( {|| QOut( FIELD->F1 ) } )
       dbCloseArea()

       /* Копируем файлы на диск */
       hb_vfCopyFile( "mem:test.dbf", "test1.dbf" )
       hb_vfCopyFile( "mem:test.ntx", "test1.ntx" )

       /* Освобождаем память */
       dbDrop( "mem:test" )

hbmzip

Эта библиотека содержит набор функций-оболочек для MiniZip, а также несколько дополнительных функций - API более высокого уровня для zip пакетов.

При сборке программ с hbmzip помимо основного набора вам потребуются следующие дополнительные библиотеки: hbzlib, minizip, и, конечно сама hbmzip.

Скорее всего, несмотря на заявленное "API более высокого уровня", для упаковки/распаковки файлов вам будет удобнее использовать библиотеку hbziparc - API еще более высокого уровня :), надстройку над hbmzip.


hbziparc

Эта библиотека, основанная на hbmzip, содержит набор функций для упаковки/распаковки в zip - формате.

При сборке программ с hbziparc помимо основного набора вам потребуются следующие дополнительные библиотеки: hbzlib, minizip, hbmzip, и, конечно сама hbziparc.

Список функций:

lCompress := hb_ZipFile( cFile, cFileToCompress | aFiles, [nLevel], [bBlock], [lOverWrite], [cPassword], [lWithPath], [lWithDrive], [pFileProgress] )Создает zip - файл, возвращает .T. в случае успеха.
cFile - имя создаваемого zip - файла,
cFileToCompress | aFiles - имя файла, который надо сжать, или массив с именами файлов,
nLevel - уровень сжатия от 0 (без сжатия) до 9 (наилучшее),
bBlock - кодоблок, исполняемый при открытии каждого файла для сжатия, принимает параметры cFile и nPos,
lOverWrite - флаг, указывающий, перезаписывать ли файл, если он уже существует,
cPassword - пароль для сжатия, если нужен,
lWithPath - флаг, указывающий, запоминать ли путь к файлу (по умолчанию - .F.),
lWithDrive - флаг, указывающий, запоминать ли имя диска (по умолчанию - .F.),
pFileProgress - кодоблок для визуализации прогресса сжатия, должен выглядеть примерно так: {|nPos,nTotal| GaugeUpdate( aGauge1, nPos / nTotal ) }.
lCompress := hb_UnzipFile( cFile, [bBlock], [lWithPath], [cPassWord], cPath, cFileToExtract | aFile, [pFileProgress] )Распаковывает zip - файл, возвращает .T. в случае успеха.
cFile - имя распаковываемого zip - архива,
bBlock - кодоблок, исполняемый при открытии каждого файла для извлечения, принимает параметры cFile и nPos,
lWithPath - флаг, указывающий, создавать ли каталоги для извлекаемых файлов,
cPassword - пароль для извлечения, если нужен,
cPath - путь, куда извлекать - обязательный параметр,
cFileToExtract | aFiles - имя файла, который надо извлечь, или массив с именами файлов, - обязательный параметр,
pFileProgress - кодоблок для визуализации прогресса распаковки.
lDelete := hb_ZipDeleteFiles( cFile, cFiletoDelete | aFiles | nFilePos )Удаляет файлы из zip - архива, возвращает .T. в случае успеха.
cFile - имя zip - архива,
cFileToExtract | aFiles - имя файла, который надо удалить, или массив с именами файлов
hb_SetZipComment( cComment )Устанавливает комментарий для zip-архива, вызывается перед любой функцией упаковки.
cComment := hb_GetZipComment( cFileName )Возвращает строку - комментарий записанный в zip-файле с именем cFileName.
hb_SetBuffer( [nWriteBuffer], [nExtractBuffer], [nReadBuffer] )Устанавливает размеры буферов для записи (nWriteBuffer), извлечения (nExtractBuffer) и чтения (nReadBuffer). Значения по умолчанию - 65535 / 16384 / 32768, соответственно.
lCompress := hb_ZipFileByTDSpan( cFile, cFileToCompress | aFiles, nLevel, bBlock, lOverWrite, cPassword, iSize, lWithPath, lWithDrive, pFileProgress)Создает zip - файл, разбитый на части заданного размера, возвращает .T. в случае успеха.
Параметры те же, что и в hb_ZipFile() плюс:
iSize - размер в байтах, по умолчанию - 1457664.
lCompress := hb_ZipFileByPKSpan( cFile, cFileToCompress | aFiles, nLevel, bBlock, lOverWrite, cPassword, lWithPath, lWithDrive, pFileProgress )Создает zip - файл на сменном носителе, возвращает .T. в случае успеха.
nReturnCode := hb_ZipTestPK( cFileName )Проверяет "pkSpanned" zip - файлы, код возврата:
        114   Incorrect Disk
        103   No Call back was set with hb_ZipTestPK()
        
hb_SetDiskZip( bBlock ) 
nFiles := hb_GetFileCount( cFileName )Возвращает количество файлов в zip - архиве, включая каталоги.
hb_GetFilesInZip( cFileName [, lVerbose] )Возвращает массив с информацией о файлах в zip - архиве.
Если lVerbose не задан, или равен .F., это одномерный массив с именами файлов, если равен .T., то двухмерный массив, в котором для каждого файла представлена следующая информация: { cFileName, nSize, nMethod, nCompSize, nRatio, dDate, cTime, hb_NumToHex( nCRC, 8 ), nInternalAttr, lCrypted, cComment }

4.2 GUI

Harbour в "чистом виде" предоставляет средства для создания консольных программ, для реализации графического интерфейса ( GUI ) необходимо использование дополнительных библиотек. Ниже будут перечислены наиболее используемые.



Комментариев:       ()       пред.    след.       Добавить комментарий
Длина комментария - не больше 4000 символов.
Ваше имя:

Адрес электронной почты:
(не предназначено к показу)
 
Введите текст с картинки: