Отправлено: 15.11.11 21:36. Заголовок: Примеры из Минигуи -ошибки, вопросы..... (продолжение)
Всем привет. Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые....
Очень красочный пример: \MiniGUI\SAMPLES\Advanced\AVI_Animation - не работает под Win7 (наверно AVI-шки нет в ресурсах) Предложение Григорию: Можно ли добавить еще один пример с отдельным AVI-файлом в ресурсах проекта и показом такого же бегунка ?
Пример: \MiniGUI\SAMPLES\Advanced\DisplayMode - не работает под ХР и далее....
/* * 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
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
// читать переменные - секция [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) // это функция-метод
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" }
[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 Выход
Отправлено: 29.09.21 14:44. Заголовок: Пример demo4.prg (бо..
Пример demo4.prg (более простой вариант работы с ini) Скрытый текст
/* * 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 дбавляется, если нет ее)
Отправлено: 29.09.21 22:44. Заголовок: Haz пишет Вот где бе..
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 внутри и оперируешь только переменной объекта
Формат даты в json не понимается никак, имеется ввиду обратно,
не приходилось пока использовать формат даты, не проверял, верю. При старте программы считываю локальные настройки пользователя из папки его профиля. К примеру видимости и порядок колонок бровсов, ширину этих колонок, цветовые настройки и пр. Раньше писал в INI, каких только изввратов не придумал. Бровсов много, параметров бровсов много в INI реализация вложенности на нуле.. А если еще и шифровать, так вообще пляски иначе продвинутые юзера туда лезли. Перешел на json и выдохнул., все структуры данных разложены как надо, вложенность и ветвления без ограничений. От дурака защита реализуется легко. В общем каждому своё 👍
дерево строится практически как в xml Если исп. механизм LayOut (авто компоновка контролов на окне), то еще проще [MAIN] ... [Form_1] 01 = [Label_1], [GetBox_1] 02 = [Label_2], [GetBox_3], [Label_3], [GetBox_4] ... NN = [Browse_1] ...
в том и дело , что нет желания строительством занимается.. Тут собрал структуру в хеш, и выплюнул в джсон и все. Обратно так же. С alias() работать для меня не вариант, база в ads на словарях, все под SQL. Сторонние таблицы явно проигрывают в удобстве хранения данных , так как требуют унификации полей. Мне в работе json проще и понятнее чем XML, компактнее , современнее и универсальное. Более торо , обмен в этом формате между разными системами реализуется проще, хоть через диск, хоть через порт , хоть через pipe и пр. Плюс для работы внешних редакторов полно любых. Так что не убедил 😎. Просто для себя взял стандартом. Конфигурации храню в json, обмен с 1с в json, коммуникации с Битрикс в json. Даже выгрузку из конструкторского по в кривом CSV , сначала гоню в json ( hash) а потом только разбираю. В общем дело привычки 🧐
Отправлено: 30.09.21 00:10. Заголовок: Haz пишет Так что не..
Haz пишет
цитата:
Так что не убедил
Особо не собираюсь, но ~ 20 справочников (до 20 строк, которые практически не меняются, типа пол: мужской, женский) подчитанных в 20 hash переменных и потом работа с ними и работа с 20 переменными объектов-контейнеров ... , она практически одинакова, только тебе надо оперировать hb_HSet\GetDef(<имя спр.>, ...), а мне <имя спр.>:имя ключа, т.е. мнемоника, или <имя спр.>:Get\Set(...), если это работа с html и js, то вариантов нет, json и при обратной обработке, дата - это проблема, т.е. полная привязка к именам json, не факт, что это совпадает с полями dbf-базы, т.е. строим какие то перекодировки.
цитата:
В общем дело привычки
Это да, привычки в нашей жизни, РУЛЯТ. Мы как собаки Павлова, к чему привыкли, так и делаем,в др. случаях надо напрягаться, организм сопротивляется
Отправлено: 30.09.21 00:29. Заголовок: PS Разговор, вообще ..
PS Разговор, вообще то шел о параметрах для программы, т.е.
цитата:
Там же написано single flag . т.е. один параметр одной строкой.
На мой взгляд, параметры для программы проще передать, через ini, чем строкой, которую потом надо парсить. Т.е. для прогр. создаем ini (руками или программой не важно) и в запускаемой программе обрабатываем. Сделать Local oIni := oIniRead( ".\Start.ini", .T. ):COM ? oIni:nMode, oIni:... проще, чем что то другое, даже, если этого ini нет
Отправлено: 30.09.21 00:52. Заголовок: Тут собрал структуру..
Haz пишет
цитата:
Тут собрал структуру в хеш, и выплюнул в джсон и все
Тут, немного ты, скрыл алгоритм, для вложенных jcon, как секции в ini, т.е. надо построить примерно (как в demo4, в demo5 это скрыто внутри) такое по hash Скрытый текст
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"}}
в примере это подается в объект, но можно подать это и json, перебрав секции и превратив ее в json, в целом, "хрен редьки не слаще", вопрос для каких целей делаем. Наглядности в сравнении с json5, json (hb ф-ии) мало дает, делая ключи в кавычках и как не крути json в hb слабоват, на мой взгляд, т.е. json в js (html) уже практически отсутствует, применяется json5, т.е. к тебе приходят данные в json5 их надо превратить в hash
Тут, немного ты, скрыл алгоритм, для вложенных jcon
Да , утаил. Но он элементарный. Json5 проблем и пока не доставлял. Плюс автоматом экранирует служебные символы. К примеру заголовок с разделителями CRLF не нужно обрабатывать перед чтением или записью. Пользую давно, функционала хватает. И главное, как уже писал, могу сохранить на диск и 1С 7.7 спокойно эта прочтет и разберет своими штатными средствами (компонент под json полно). С навороченным INI в 1С придется попотеть, тк. нет там никаких объектов и oKeyData и логику разбора из харбур не перенести. Зачем мне две одинаковые по смыслу сущности , одну из которых не поднять в 1С ? Обмен с 1С через dbf только с виду прост, на деле проблем множество и тут пока только текстом через диск. Порт слушать 1С 7.7 не умеет, сообщения окну обрабатывать не чем, остается только pipe , а это тот же файловый обмен. Зато спасибо микрософту , элементарно из 1С шлется json в порт программы приемника. Вот и пришел к выводу, что мне удобнее json т.к он везде поддерживается и везде одинаков.
Отправлено: 30.09.21 10:07. Заголовок: SergKis пишет: На м..
SergKis пишет:
цитата:
На мой взгляд, параметры для программы проще передать, через ini, чем строкой, которую потом надо парсить. Т.е. для прогр. создаем ini (руками или программой не важно) и в запускаемой программе обрабатываем
тогда уж проще прям в коде забить. Хотя соглашусь, параметром может быть файл, где все разложено. так проще но не нужно. Андрею при отладке лень каждый раз эти параметры руками бить. Иначе при чем тут .hbp ? поэтому проще всего в коде
Отправлено: 30.09.21 10:07. Заголовок: Игорь, мы немного о ..
Игорь, мы немного о разном. Ты об обмене данными со сторонними программами (тут от их правил не отпрыгнешь), а я о внутреннем употреблении в prg hmg с учетом языковых данных. 1C с 8-ой версии стала unicode, вроде, да и у вас редко стоит вопрос разных языковых текстов в prg (для Gui). А у нас язык на 1-м месте, Формы для России, ЕС, Латвии разные + тексты языковые к ним (клиент сам может правильно править перевод), так что приходится организовывать хранилища и ini простой и удобный вариант
Отправлено: 30.09.21 10:15. Заголовок: SergKis пишет: мы н..
SergKis пишет:
цитата:
мы немного о разном.
Сергей, конечно о разном. Базовая реализация INI просто убогая. Твой пример погоняю раньше не натыкался на него и такую реализацию INI. Да, для ситуации когда
Отправлено: 30.09.21 10:35. Заголовок: Haz пишет Андрею при..
Haz пишет
цитата:
Андрею при отладке лень каждый раз эти параметры руками бить. Иначе при чем тут .hbp ?
Как он написал параметры (назначение), то это 1-текст, 2-режим базы, 3-текст кнопки "ok" т.е. все может быть разным, в hbp он меняя набирает и отлаживает режимы prg, потом будет для них запуск ShellExecute с кнопок и меню, т.е. вид параметров my.exe {"bla bla bla",2021,"ok"} и потом внутри aParam := &cParam
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
// массив в файл 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 ----------------"
Все даты в формате GMT
3 час. Хитов сегодня: 11
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет