Примеры из Минигуи -ошибки, вопросы..... (продолжение)
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.
Andrey: Haz пишет: Там же написано single flag . т.е. один параметр одной строкой. Спасибо ! Блин, год назад делал так же, нашёл у себя. Да уж, памяти совсем нет...
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 примера всего, и непонятные. Что-нибудь интересней нужно в качестве примера.