Отправлено: 15.11.11 21:36. Заголовок: Примеры из Минигуи -ошибки, вопросы..... (продолжение)
Всем привет. Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые....
Очень красочный пример: \MiniGUI\SAMPLES\Advanced\AVI_Animation - не работает под Win7 (наверно AVI-шки нет в ресурсах) Предложение Григорию: Можно ли добавить еще один пример с отдельным AVI-файлом в ресурсах проекта и показом такого же бегунка ?
Отправлено: 27.08.19 17:18. Заголовок: Всем привет ! Хочу п..
Всем привет ! Хочу получить расчёт по времени вот такого вида - 00:00:00.0145 В C# есть такой формат даты, нагляден очень. А в Харборе такого нет. Можно прикрутить такой формат времени в МиниГуи ? Для расчётов самый раз будет, а то Seconds() не всегда даёт разницу по времени. Выдаёт типа 00:00:00 Можно конечно написать свою функцию, но тогда её каждый раз нужно будет таскать из своих исходников.
Отправлено: 27.08.19 18:39. Заголовок: Andrey пишет В C# ес..
Andrey пишет
цитата:
В C# есть такой формат даты, нагляден очень. А в Харборе такого нет.
А если немного подумать, то все получится
Local k, t := hb_datetime() ... k := hb_datetime() - t ? t, k, t + k,'|', hb_StrToTS('') + k получишь такой результат 2019-08-27 18:33:23.825 0.000005 2019-08-27 18:33:24.262 | 00:00:00.437
Отправлено: 28.08.19 08:40. Заголовок: Доброго утра всем ! ..
Доброго утра всем ! Наверное лучше функцию назвать так HMG_TimeMS(). В виде функции у меня работает, а если делаю в мой INCLUDE #xtranslate MG_MilliSeconds( <k> ) => Ltrim( hb_TSToStr( hb_StrToTS('') + <k>, .T. ) ) то не собирается exe-ник.
для горячей клавиши SET KEY VK_1 ACTION _wPost(1, oBrw, oBrw) SET KEY VK_2 ACTION _wPost(2, oBrw, oBrw) и т.д. в событии Event будет устанавливаться среда This для Tsb для GetBox так же можно ставить событие нажатия клавиш (примеры в basic\GetBox...)
Отправлено: 06.09.19 10:36. Заголовок: PS По указанному сво..
PS По указанному свойству HOTKEY кнопки ставится горячая клавиша, т.е. большой разницы нет писать HOTKEY 9 в кнопке или ставить горячую клавишу SET KEY VK_9 ACTION ...
Отправлено: 06.09.19 23:20. Заголовок: SergKis пишет: Для ..
SergKis пишет:
цитата:
Для BUTONEX нет HOTKEY, а у Andrey в основном используются они.
Да, я про эту фичу. А нельзя сделать для BUTONEX эту фичу HOTKEY в следующих версиях ? Для окна можно обойтись пока и так ON KEY ESCAPE OF Form_Main ACTION _wPost(99) ON KEY VK_1 OF Form_Main ACTION _wPost(1) и будет отрабатывать
Отправлено: 07.09.19 00:07. Заголовок: Что то не получается..
Что то не получается... Это отрабатывает нормально - ON KEY ESCAPE OF Form_Main ACTION _wPost(99) А как задать цифирки 1, 2, 3 .... Пробовал так
ON KEY VK_1 OF Form_Main ACTION _wPost(1) ON KEY VK_2 OF Form_Main ACTION _wPost(2) ON KEY VK_3 OF Form_Main ACTION _wPost(3)
Не компилируется, выдаёт ошибку... Смотрел \Include\ i_keybd.ch и i_keybd_ext.ch что то не нашёл... Меню просто из 4-5-6 кнопок. Больше на форме ничего нет. Как подключить цифирки 1, 2, 3 ... ?
Отправлено: 07.09.19 06:31. Заголовок: Andrey пишет Смотрел..
Andrey пишет
цитата:
Смотрел \Include\ i_keybd.ch и i_keybd_ext.ch что то не нашёл...
Надо без VK_... вариант по имени #xcommand ON KEY <key> [ OF <parent> ] ACTION <action> [ RESULT ] TO <lresult> ; => ; <lresult> := _SetHotKeyByName ( <"parent"> , <"key"> , <{action}> ) т.е. ON KEY 1 OF Form_Main ACTION _wPost(1) ON KEY 2 OF Form_Main ACTION _wPost(2) ON KEY 3 OF Form_Main ACTION _wPost(3)
Отправлено: 07.09.19 07:07. Заголовок: Andrey Специально д..
Andrey Специально для тебя вынес сюда команду, но ты на нее все равно не смотришь #xcommand ON KEY <key> [ OF <parent> ] ACTION <action> [ RESULT ] TO <lresult> ; => ; <lresult> := _SetHotKeyByName ( <"parent"> , <"key"> , <{action}> )
Чтобы писать как ты сделал надо в команде поправить #xcommand ON KEY <key> [ OF <parent> ] ACTION <action> [ RESULT ] [ TO <lresult> ] ; => ; [ <lresult> := ] _SetHotKeyByName ( <"parent"> , <"key"> , <{action}> )
Отправлено: 07.09.19 08:16. Заголовок: А как на кнопку пове..
А как на кнопку повесить обработку ENTER ? Делаю так: ON KEY RETURN OF Form_NewZ ACTION {|| Form_NewZ.Button_Find.Setfocus, InkeyGui(200), _PushKey( VK_RETURN ) } И вся форма вешается... Почему ? ENTER зацикливается ?
ON KEY RETURN OF Form_NewZ ACTION {|| Form_NewZ.Button_Find.Setfocus, InkeyGui(200), _PushKey( VK_SPACE ) } ON KEY ESCAPE OF Form_NewZ ACTION {|| aRet := {}, Form_NewZ.Release() }
END WINDOW
Видно что курсор прыгает на кнопку, а отработки нет. ESC - срабатывает нормально. Дело в том что у меня на кнопке Button_Find - большой код, там несколько функций. Хотелось бы не переписывать, а заставить кнопку Button_Find срабатывать на ENTER !
Использование This.butt_2.SetFocus - не подсвечивает кнопку ! Только текст кнопки подсвечивает. Хотелось бы - нажал горячую клавишу, кнопка под светилась и юзер понял какую кнопку нажал. Это для красоты.
........... WITH OBJECT This.Object :Event( 1, {|| Form_NewZ.Button_Find.Setfocus, DoEvents(), _PushKey( VK_SPACE ) } ) :Event(99, {|ow| ow:Release() } ) END WITH
ON KEY RETURN OF Form_NewZ ACTION _wPost(1 , This.button_Find.Index) ON KEY ESCAPE OF Form_NewZ ACTION _wPost(99, This.button_Exit.Index)
END WINDOW
Как сделать не перетаскивая код-блока из кнопки, чтобы срабатывал _wPost(1) и _wPost(99) ? Не хочется перетаскивать код из кнопки. Или так нельзя делать ? Если перетащу код из кнопки в :Event( 1, {|| ..... - то всё работает отлично !
ON KEY RETURN OF Form_NewZ ACTION ( SetMousePos(This.button_Find.Handle), This.button_Find.SetFocus, DoEvents(), _wPost(1, This.button_Find.Index) ) ON KEY ESCAPE OF Form_NewZ ACTION _wPost(99)
ON KEY ESCAPE OF Form_NewZ ACTION ( SetMousePos(This.button_Exit.Handle), This.button_Exit.SetFocus, DoEvents(), _wPost(2, This.button_Exit.Index) ) или если есть LOCAL aRet := {} то сразу делать @ ........ BUTTONEX Button_Exit ; ........... ACTION _wPost(99) ;
ON KEY ESCAPE ACTION ( SetMousePos(This.button_Exit.Handle), This.button_Exit.SetFocus, DoEvents(), _PushKey( VK_SPACE ) /* или _wPost(99) или _wSend(99) */ )
Отправлено: 11.09.19 19:24. Заголовок: Всем привет. А как о..
Всем привет. А как объявить в проге, что нужно линковать функцию, у которой нет явного вызова ?
Т.е. вызов функции объявлен в массиве меню, примерно так: AADD( aDim, {"FLAG_RU.bmp" , "Test menu - Russian ", "RunTest1", "Stroka1" , 1 } ) чтобы потом можно было вызвать RunTest1() ? А то сейчас пишет, что нет такой функции в ехе-файле. В библиотеке которую линкую эта функция есть.
Отправлено: 12.09.19 14:23. Заголовок: Обнаружил небольшой ..
Обнаружил небольшой баг в примере MiniGUI\SAMPLES\BASIC\Menu\menudemo5.prg Выбираем меню Options и потом любое другое меню. После выхода из меню можно кликнуть правой кнопкой мышки и это же меню появиться опять на форме. В Options-2 и Options-3 от этого избавился, как рекомендовал раньше. Больше такого избавления в примерах нигде нет ! А новичкам это тоже будет интересно. Последний пример совместно написанный с Сергеем выслал на почту.
Отправлено: 12.09.19 18:26. Заголовок: Можно ли включить в ..
Можно ли включить в Минигуи стандартную функцию расчёта размера фонта в зависимости от ширины и высоты LABEL ? Свои есть, но что-то не дотягивают до стандарта. И не знаю как рассчитать размеры для фонтов BOLD ? Вот например есть такая у меня функция:
////////////////////////////////////////////////////////////////// // Функция вернёт максимальный размер фонта для заданной строки по заданной ширине FUNCTION FontSizeMaxAutoFit( cText, cFName, nWinWidth ) LOCAL nTxtWidth, nFSize, lExit := .T.
nFSize := 6 DO WHILE lExit nTxtWidth := GetTxtWidth( cText, nFSize, cFName ) IF nTxtWidth >= nWinWidth lExit := .F. ELSE nFSize++ ENDIF ENDDO
RETURN nFSize
Если текст короткий то половина слова показывается на LABEL, нижняя часть слова обрезается, слишком большой фонт. Помогите сделать такие универсальные функции !
Отправлено: 12.09.19 19:18. Заголовок: Andrey пишет Помогит..
Andrey пишет
цитата:
Помогите сделать такие универсальные функции !
Они уже в тек. версии есть, для регистрированного фонта, посмотри changelog
* New: Added the useful pseudo-functions GetFontWidth( FontName, nLen ) and GetFontHeight( FontName ) for receiving of the font's parameters. Note that a font should be defined by command DEFINE FONT <FontName> FONTNAME <sysfont> ...
и пример, который отсылал Григорию, там есть применение GetFontWidth( FontName, nLen ) для меню. Универсальность nW := 0; AEval(aText, {|ct| nW := Max(nW, GetFontWidth( 'Font_1', Len(ct) ) })
Это относится к окну. Понял. Спасибо большое ! У меня проблема большая... по Tab. Показываю окно с Tab карточкой юзеру. На медленных компах видно как этот Tab дергается, т.е. на Tab вывожу объекты Label и GetBox. Там их много, порядка 150 объектов. Вот и дергается Tab. Можно как то это "дерганье" убрать ? Код почти такой же как в примере MiniGUI\SAMPLES\BASIC\COLORED_TAB
ON KEY ESCAPE OF Form_Card ACTION ThisWindow.Release ON KEY PRIOR OF Form_Card ACTION MyPageUpCard(cTableForm) // это PageUp ON KEY NEXT OF Form_Card ACTION MyPageDownCard(cTableForm) // это PageDown
END WINDOW ACTIVATE WINDOW Form_Card
Можно ли скрыть построение TAB Tab_1 а потом его показать ?
Отправлено: 22.09.19 22:23. Заголовок: Andrey пишет Можно л..
Andrey пишет
цитата:
Можно ли скрыть построение TAB Tab_1 а потом его показать ?
Если найдешь хандле всех дочерних окон - page, то, наверно, сможешь. Сделай 2а окна, с tab -> hide, 2ое для анимации, т.е. заполняешь первое, размеры меняешь у второго. Потом 1му -> размеры 2го и выводишь из hide+topmost+-, второму release. Вроде, были примеры на анимацию окна, но не помню так ли.
Отправлено: 22.09.19 22:31. Заголовок: Andrey пишет ..
Andrey пишет
цитата:
ON INIT { || MyInitCard(cTableForm,lEditPrg,hCursorTable),; ResizeCardForm(cTableForm) , SizePageBack(1) } ;
Все как в примере colored_tab, на глаз видно передергивание (маленькое) перерисовки Сделал NOSHOW + ON INIT ( ..., This.Show() ), все чистенько стало. А так, ты сам елку (анимацию) сделал
Отправлено: 23.09.19 21:00. Заголовок: Всем привет ! Попро..
Всем привет ! Попросил сделать пример с TAB объектом на C# для WinForm. Чуток по другому дергается для большлого кол-ва вкладок с TextBox. Видать это особенность Win-api для WinForm. Но есть одна особенность, в C# можно скрыть объект, а после прорисовки его показать ! Тогда "дерганья" не видно вообще !
Посмотрел хелп по МиниГуи. Для TAB нет свойства INVISIBLE. Для других объектов есть, а для TAB нет. Если бы был, то тогда было бы всё отлично ! Строим скрытый объект TAB, а потом можно было бы сделать в ON INIT { || Form_Card.Tab_1.Show .....
Григорий, можно ли добавить для TAB свойство INVISIBLE ?
Я, конечно, могу ошибаться, но разве Сергей тебе не то же самое предложил?
У объекта TAB по хелпу нет свойства NOSHOW. Сергей предложил сделать NOSHOW для всего окна. Для меня показ окна обязателен. Предложения с подменой окон уж очень сложен.
Отправлено: 26.09.19 20:18. Заголовок: Всем привет ! Сделал..
Всем привет ! Сделал тестовый пример, показ из массива 20 вкладок по 25 объектов LABEL + 25 объектов GetBox Построение на TAB происходит моментально, без "дерганья". Значит эффект "дерганья" происходит тогда, когда считываются значения полей из базы. Буду дальше пилить тестовый пример.
Отправлено: 02.10.19 12:45. Заголовок: Наконец то смог зако..
Наконец то смог закончить проверку "дерганья" карточки в TAB. Мой косяк, делаю перерисовку всех объектов TAB в SizeTest. Сам виноват, не там нужно было делать. И вот это: Form_1.Tab_1.Visible := .F. Form_1.Tab_1.Visible := .T. помогло убрать "дерганье" карточки в TAB ! Спасибо всем подсказчикам !
Отправлено: 04.11.19 17:30. Заголовок: Посмотрел тест на ХР..
Посмотрел тест на ХР и Win8.1 - цвет заголовка FRAME тоже черный ! Думал опять какая то бодяга в Win8.1.. Смотрел ppo файл - цвет передается нормально !
Пропустил наверное... Пока сам на грабли не налетел, не запомнишь ! СПАСИБО, понял.
А в C# (он называется GroupBox) на любых темах цвет заголовка FRAME можно делать любым... Вот пример - https://cloud.mail.ru/public/Ba8K/kzjVDx7tc Может можно как нибудь сделать изменение цвета заголовка и для МиниГуи ? Это не срочно, но чтобы было такое в МиниГуи.
Посмотри функцию MyFrame() в примере из папки samples\Basic\LABEL_3
Посмотрел... Что-то не совсем понятно как прицепить эту функцию в модуль Form_fonts.prg проекта Tsb_composite ? Там несколько FRAME и имена объектов разные.
Отправлено: 06.11.19 17:48. Заголовок: Вроде получилось сде..
Вроде получилось сделать несколько FRAME через функцию MyFrame(), но пришлось убрать имя и размер фонта в этой функции. И не по центру текста проходиь полоса, но пойдёт и так ! Спасибо Григорий !
Отправлено: 12.11.19 15:13. Заголовок: Всем привет ! Вот чт..
Всем привет ! Вот что за ерунда получается, как юзер добивается ошибки в работающей программе ? Пробовал сам - не вылетает, а юзер что-то делает и вылетает. Вот например такая ошибка: Error MGERROR/0 Window: Form_Dim is already defined. Program terminated. Called from MSGMINIGUIERROR(100) in module: h_error.prg Called from _DEFINEMODALWINDOW(487) in module: h_windows.prg Called from FORM_SEL_DIM(632) in module: Source\Sel_Dim_Hmg.prg Called from SEL_DIM(561) in module: Source\Sel_Dim_Hmg.prg В исходнике все правильно, у меня работает без ошибок:
Как расшифровать ошибку ? Может доп.отладку какую то сделать ? Окно Form_Dim только в ОДНОМ исходнике, и оно MODAL, т.е. другое окно не сделаешь, пока это окно не закроешь. Или я чего-то не до понимаю ?
Я в терминалке сделал второй поток и отслеживаю нажатые клавиши и сохраняю изменения экрана, имитирую видеопоток. Сохраняю все в базу, потом можно просматривать что делал пользователь, что нажимал в какой момент времени, снимок состояния базы и т.д. Иногда помогает понять что накосячили, да и подловить недобросовестных пользователей можно.... Наверное в гуи более затратно будте вести постоянную запись, но последние минуту -другую до вылета проги можно сохранять и выкладывать на ftp например
Отправлено: 20.11.19 17:12. Заголовок: Andrey пишет: Вот н..
Andrey пишет:
цитата:
Вот например такая ошибка: Error MGERROR/0 Window: Form_Dim is already defined. Program terminated. Called from MSGMINIGUIERROR(100) in module: h_error.prg Called from _DEFINEMODALWINDOW(487) in module: h_windows.prg Called from FORM_SEL_DIM(632) in module: Source\Sel_Dim_Hmg.prg
Вроде разобрался с подсказки Сергея - почему так выходит, т.е. юзер ловит ошибку, а я нет . У меня система Win8.1, у юзера Win7 и WinServer2008. Юзер по кнопке успевает 2 раза кликнуть по мышке и 2 раза вызвать модальное окно с одинаковым именем. У меня так не получается... Сделал теперь в кнопке так:
Отправлено: 29.11.19 10:25. Заголовок: Всем привет ! в прим..
Всем привет ! в примере \MiniGUI\SAMPLES\Advanced\Tsb_array_2\demo.prg, если увеличить количество колонок (раза в 3, выход за ширину TSBROWS) и после запуска программы на горизонтальном SCRLLBAR удерживать кнопку движения вправо, всё подвисает. Может кто то подскажет как побороть ?
Отправлено: 29.11.19 12:39. Заголовок: kkg пишет и после за..
kkg пишет
цитата:
и после запуска программы на горизонтальном SCRLLBAR удерживать кнопку движения вправо, всё подвисает
Попробуйте сделать для колонок (при быстром скролинге не успевает за ним прорисовка тсб) AEval( oBrw:aColumns, {|oc| oc:bGotFocus := {|| DoEvents() } } ) Если не поможет, то надо уменьшать количество колонок в просмотре, используя oc:Visible := .F. для скрытия и показываете, сгруппировав частями, переключая по выбору на нужную группу.
Отправлено: 30.11.19 09:31. Заголовок: kkg пишет с SQLMIX ..
kkg пишет
цитата:
с SQLMIX и с массивом, результат всё равно крах
Правильнее, по мне, отработать счетчиками нажатия (+) и отпускания (сброс) клавиш VK_LEFT, VK_RIGHT, т.е. если, к примеру, счетчик нажатий будет > 5, то не делать :GoLeft(), :GoRight() пока не отпустят или не закончится прорисовка тсб. Похожая схема работает в моей версии (7+часть из 9) тсб при VK_UP, VK_DOWN, нажатиях, если их >= :nRowCount(), то делаю листание страницы, вместо движения построчно. Таким образом обхожу зависание прорисовки в 7ой версии тсб.
на этом примере да , но на примере из поставки с массивом + nFreeze на счётчиках не работает (по крайней мере у меня не получается), только с временной задержкой Скрытый текст
Отправлено: 30.11.19 21:44. Заголовок: kkg пишет на этом пр..
kkg пишет
цитата:
на этом примере да , но на примере из поставки с массивом + nFreeze на счётчиках не работает (по крайней мере у меня не получается), только с временной задержкой
Уменьшите значение Static n_CntLeft := 0, n_CntRight := 0, n_LeftRight := 3 Вот пример Tsb_Array_2 с учетом :nFreeze Скрытый текст
#include "minigui.ch" #include "TSBrowse.ch"
PROCEDURE MAIN
LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11
SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON
DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD
Отправлено: 01.12.19 00:39. Заголовок: kkg пишет так всё ра..
kkg пишет
цитата:
так всё равно виснет если двигать зажатой кнопкой скрола в право
В моей сборки вправо и влево зажатый скролл работает по всей линейке и не виснет (hmg 19.09.2 сборка) Если виснет у вас, то можно пробовать обработку сообщения WM_HSCROLL (цветом выделено)
function tsb_events( oBrw, nMsg, nWParam, nLParam ) Local nRet := 0, nKey, nFlag, nCol, nFrez Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU ) Static n_CntLeft := 0, n_CntRight := 0, n_LeftRight := 3
Если скролл побежал до конца\начала, надо пощелкать по тсб мышкой, для активации тсб или по полунку скролла Причину такого поведения надо искать, разбирать тсб и скролл работу
Отправлено: 01.12.19 02:43. Заголовок: SergKis пишет: В мо..
SergKis пишет:
цитата:
В моей сборки вправо и влево зажатый скролл работает по всей линейке и не виснет (hmg 19.09.2 сборка) Если виснет у вас, то можно пробовать обработку сообщения WM_HSCROLL (цветом выделено)
у меня сборка Harbour MiniGUI Extended Edition 19.10 (Update 2), на ней не работает. заработало только так. Скрытый текст
#include "minigui.ch" #include "TSBrowse.ch"
PROCEDURE MAIN
LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11
SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON
DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD
Отправлено: 01.12.19 11:45. Заголовок: kkg пишет заработало..
kkg пишет
цитата:
заработало только так
hmg 19.09.2 сборка вашего примера скролл работает аналогично моего варианта, после двойных кликов по крайним кнопкам скролла (сообщения автоматом), при достижении крайних значений колонок, надо кликами на тсб активировать тсб работу. Разваливается - :nFreeze установленный (влево уходит на 1ю колонку) :nFreeze := 4 - Shift+End и Shift+Home (переход в конец\начало строки) - врет с нумерацией SpecHeader, меняя нумерацию у :nFreeze колонок и соответсвенно у остальных
Отправлено: 01.12.19 11:58. Заголовок: PS Надо отметить, чт..
PS Надо отметить, что и в моем примере SpecHeader врет одинаково и Shift+Home уст. на 1ю колонку, но по -> правильно перепрыгивает на колонку с учетом :nFreeze. Это, наверно, общая неточность в тсб.
Отправлено: 01.12.19 18:07. Заголовок: kkg пишет Допиливать..
kkg пишет
цитата:
Допиливать нужно, но пока хоть не сваливается
Что то допиливать надо, но у меня сборка hmg 19.10.2 на bcc 5.8 работает? не виснет по скроллу и клавишам. Вот пример этой сборки https://TransFiles.ru/8n29c Гонял туда-сюда работает и не виснет, так же как сборка bcc 5.5 hmg 19.09.2
Отправлено: 02.12.19 10:19. Заголовок: kkg пишет с oBrw:lLo..
kkg пишет
цитата:
с oBrw:lLockFreeze := .F. на сборке 19.10.2 виснет
При :nFreeze := 4 задан, надо :lLockFreeze := .T., избегать прорисовки замороженных колонок По примеру с :lLockFreeze := .F. видно, что при работе левой кнопки скроллбар курсор добегает до 1ой колнки, а должен остановиться на 4ой, что и происходит при :lLockFreeze := .T.. Уже видно рассогласование в прорисовке.
Отправлено: 02.12.19 10:50. Заголовок: SergKis пишет: При ..
SergKis пишет:
цитата:
При :nFreeze := 4 задан, надо :lLockFreeze := .F., избегать прорисовки замороженных колонок
На тяжёлых многоуровневых формах (много колонок) nFreeze нужен для замораживания ключевой информации, а lLockFreeze := .F. нужен чтобы передать на следующий уровень строку с данными и номер (имя) кликнутой колонки, но зачастую необходимая колонка находится в замороженной зоне поэтому и нужно чтобы курсор в неё заходил.
Для наглядности можно переставить местами oBrw:lLockFreeze:=.f. oBrw:nFreeze:=4
Ещё бывает необходимость редактировать данные в замороженной области
Отправлено: 02.12.19 11:27. Заголовок: kkg пишет На тяжёлых..
kkg пишет
цитата:
На тяжёлых многоуровневых формах (много колонок) nFreeze нужен для замораживания ключевой информации, а lLockFreeze := .F. нужен чтобы передать на следующий уровень строку с данными и номер (имя) кликнутой колонки, но зачастую необходимая колонка находится в замороженной зоне поэтому и нужно чтобы курсор в неё заходил.
OK! Попробуйте добавить в h_tbrowse.prg
METHOD DrawLine( xRow ) CLASS TSBrowse ... Next
DoEvents()
EndIf
Return Self ... METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... If lDraw AAdd( ::aDrawCols, nJ ) EndIf
Next
DoEvents()
EndIf
If ::bOnDraw != Nil ...
и пересобрать либу MakeLib.bat Пример с :lLockFreeze := .F. мой вариант, вроде не виснет, покрутил туда-сюда какое то время.
function tsb_events( oBrw, nMsg, nWParam, nLParam ) Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU ) Local i
If lCtrl .or. lShift .or. lAlt; Return 0; EndIf do case case nMsg == WM_KEYDOWN do case case nWParam == VK_RIGHT; Return tsb_events_Right( oBrw ) case nWParam == VK_LEFT ; Return tsb_events_Left ( oBrw ) endcase case nMsg == WM_KEYUP Do while InkeyGui(1)!=0 Enddo case nMsg == WM_HSCROLL .and. lCtrl; nMsg := nil; Return 1 case nMsg == WM_HSCROLL .and. !lCtrl If ! oBrw:lDontchange if Loword( nWParam ) = 5; i := HiWord( nWParam ) if oBrw:nCell=i ; nMsg := nil; Return 1; EndIf if i <= oBrw:nFreeze; oBrw:GoPos( oBrw:nAt, oBrw:nFreeze + 1 ); oBrw:GoPos( oBrw:nAt, i ) ; nMsg := nil; Return 1; EndIf oBrw:GoPos( oBrw:nAt, i ) nMsg := nil Return 1 Endif do case case nWParam == SB_LINELEFT ;Return tsb_events_Left ( oBrw ) case nWParam == SB_LINERIGHT ;Return tsb_events_Right( oBrw ) case nWParam == SB_PAGELEFT ;nMsg := nil; Return 1 case nWParam == SB_PAGERIGHT ;nMsg := nil; Return 1 endcase EndIf
case nMsg == WM_VSCROLL If ! oBrw:lDontchange do case case nWParam == SB_PAGELEFT ;nMsg := nil; Return 1 case nWParam == SB_PAGERIGHT ;nMsg := nil; Return 1 endcase EndIf endcase return 0
function tsb_events_Left ( oBrw ) Local anW:={}, nObrW := 0, nFW := 0, nC := 0, nW:=0, j:=0, nG:=0 Local nCol := oBrw:nCell, nRow := oBrw:nAt
Отправлено: 04.12.19 18:20. Заголовок: kkg Используйте в р..
kkg Используйте в редакторе для сохранения отступов моноширинный шрифт - левая, первая кнопка с 123. т.е. [ more ][ pre2 ] тут текст [ /pre2 ][ /more ] очень трудно смотреть выложенный текст без выравнивания
Отправлено: 08.12.19 17:34. Заголовок: Andrey пишет Заработ..
Andrey пишет
цитата:
Заработало !
В своей версии сделал
CLASS TSBrowse FROM TControl ... DATA lMoreFields AS LOGICAL INIT .F. DATA nCntKeysLR AS NUMERIC INIT 0 DATA nMaxKeysLR AS NUMERIC INIT 3 DATA nCntScroll AS NUMERIC INIT 0 DATA nMaxScroll AS NUMERIC INIT 3 ... METHOD MoreFields( nMsg, nWParam, nLParam ) CLASS TSBrowse Local nRet := 0, nCol, nFrez, nKey, nPos Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU )
If lCtrl .or. lShift .or. lAlt ; RETURN nRet EndIf
Отправлено: 09.12.19 12:21. Заголовок: Andrey пишет если ос..
Andrey пишет
цитата:
если оставить ? Конфликты будут ?
Погонял пример с установками, т.е. работают метод и ф-я (hmg 19.09.2) oBrw:lMoreFields := .T. oBrw:bEvents := {|ob,nm,np,nl| tsb_events(ob,nm,np,nl) } все OK не виснет, т.е. конфликта нет, работает
Отправлено: 10.12.19 16:03. Заголовок: Andrey пишет: Что э..
Andrey пишет:
цитата:
Что эта за ошибка и как от неё избавиться ?
BASE/2018 Open error (DISKSPACE() function)
Default Behavior: The program continues after returning an empty value.
Explanation: The disk does not exist or is not ready upon an attempt to access it with the DISKSPACE() function.
Action: Make sure to supply the correct drive number (for fixed disks) or call the DISKSPACE() function in a loop with a user warning when checking the readiness of a floppy drive. See Also: COPY FILE command
На обоих дисках свободно - C: 34Гб D: 200-Гб Почему вылазит такая ошибка ? Как исправить, чтобы не появлялась в дальнейшем ?
Нашёл в недописанном ErrorLog.htm
Workstation name...: SERVER Active user name...: Администратор Available memory...: 1986 MB Current disk.......: A Current directory..: \Server\ABONENT\ABONENT2\COMMO
Я так понял - сбой непонятный. На диск А: не переключался ! И сетевой путь должен быть \\Server\ABONENT\ABONENT2\COMMO
Видимо, DiskSpace() не умеет работать с сетевыми дисками/шарами. Ты ему подсовываешь "\\Server\ABONENT\ABONENT2\COMMO", а он берет первый символ этой строки и интерпретирует его как "А".
Когда переменной присваивается значение из одной базы, показывается нормально, а из другой не показывается. Переменная есть, всё с ней в порядке. Поставил спереди пробел и заработало:
@ 10,10 LABEL LABEL_NAME VALUE ' '+NameBase
Кто-нибудь с таким сталкивался? Что это может быть?
У меня стоит версия 19.06, на новые версии с другими компиляторами пока не перебрался.
Кто-нибудь с таким сталкивался? Что это может быть?
Возможно причина в том, что не задано WIDTH у LABEL и ширина считается при каждом присвоении от значения и возникло внутреннее "недопонимание" при выводе на экран.
Отправлено: 06.02.20 19:17. Заголовок: Попробуйте так Если ..
Попробуйте так
Если в лабел данные из полей дбф, то используйте имя поля для лабел, если для поля исп. еще getbox, то для него исп. имя поля, для лабел добавляйте '_'. получается просто в использовании. Т.е. кода создаете форму, данных из базы не используете, потом выполняете процедуру заполнения данными Пример y := x := 10 FOR EACH aFld IN (cAls)->( dbStruct() ) cFld := aFld[1] @ y,x LABEL &( cFld+'_' ) VALUE ' ' WIDTH nW HEIGHT nH This.&(cFld+'_').Value := Trim(cValToChar( (cAls)->&cFld ))+' ' y += 10 NEXT ... Ваш вариант ... cN := 'NAME' @ y,x LABEL LABEL_NAME VALUE ' ' WIDTH nW HEIGHT nH ... FUNC Refr_Lbl( oBrw ) LOCAL cAls := oBrw:cAlias
Отправлено: 07.02.20 11:15. Заголовок: rvu пишет Так если п..
rvu пишет
цитата:
Так если пробел все равно добавлять, то с ним и так работает. Вот заменил вообще на поле БД:
Я предлагал разделить создание контролов и заполнение их данными в разные процедуры, т.е.
DEFINE WINDOW Form1 ... Label_Crt() END WINDOW ACTION WINDOW Form1 ON INIT {|| Label_Val() } // или в ON INIT окна или ставим в :Event(1, {|| Label_Val() }), активируя сообщением ... STAT FUNC Label_Crt() ... @ 10,10 LABEL NAME VALUE ' ' WIDTH 1500 VCENTERALIGN ... RETU Nil
STAT FUNC Label_Val() LOCAL cAls := 'BASECONFIG' ... This.NAME.Value := Trim( (cAls)->NAME )+' ' * Form1.NAME.Value := Trim( (cAls)->NAME )+' ' // или такую форму записи ... RETU Nil
Вызывая Label_Val() повторно (изменив поле NAME) производите переотображение Label NAME Добавление пробела слева смещает текст отображения вправо на ширину пробела в пикселях, т.е. сменили координату X у лабел
Отправлено: 07.02.20 16:31. Заголовок: Запускаю прогу на Ми..
Запускаю прогу на МиниГуи. На форме есть таймер.
DEFINE TIMER Timer_1 ; INTERVAL (StaticTimeUpdate * 100) * 1000 ACTION OperatUsers2() .... // Функция чтения всех работающих в журнале программы / заглушка Function OperatUsers2() LOCAL nSel := SELECT() ? "Timer всех работающих в программе !", TIME(), ProcNameLine(0) Form_Main.Label_0.Value := "+" + TIME() SELECT(nSel) RETURN NIL
После запуска проги, в Фаре работать нельзя, отрубаются клавиши. Запускаю TeamViewer, пытаюсь набрать пароль в нём, пароль неверен. Закрываю прогу на МиниГуи - всё прекрасно начинает работать.
Что то с таймером беда... Или опять я нахимичил ....
for n := 1 To 3 hb_IdleSleep(1) // дает на втором шаге Error BASE/1102 Неверный аргумент: UPPER</p> end
не соображу причем тут слип
трассер ошибки
<br/></summary> Called from UPPER(0) <BR> Called from (b)TCNLDATA(737) in module: h_objects.prg <BR> Called from TCNLDATA:DEL(0) <BR> Called from (b)TCNLDATA(776) in module: h_objects.prg <BR> Called from TCNLDATA:DESTROY(0) <BR> Called from TWNDDATA:__msgDestructor(678) in module: h_objects.prg <BR> Called from HB_IDLESLEEP(0)
условия такие Operating system...: Windows 7 6.1 SP1<BR> MiniGUI version....: Harbour MiniGUI Extended Edition 19.08 (32-bit)<BR> Harbour version....: Harbour 3.2.0dev (r1904111533)<BR> Harbour built on...: Apr 11 2019 19:43:19<BR> C/C++ compiler.....: Borland C++ 5.5.1 (32-bit)<BR> Multi Threading....: YES<BR> VM Optimization....: YES<BR>
AADD( aGetBoxObj, cObj2 ) // для проверки на русские буквы ........ // назначаем на getbox и checkbox событие (This.Object):Event(10, {|| aRcPlt[ This.Cargo ] := This.Value })
Отправлено: 08.05.20 15:02. Заголовок: Pasha пишет: Да код..
Pasha пишет:
цитата:
Да кодировка у дебаггера не той системы Буква А, код в 1251 - 0xc1, в cp866 как раз отображается такой закорлючкой
У меня в МиниГуи кодировка RU1251 Соответственно GETBOX должнен быть в RU1251 И при доп. выводе в файл получаю, беру ASC(символа) :
└ 192 ┴ 193 ▀ 223
И код не работает по проверке на русские буквы ВЕРХНЕГО РЕГИСТРА:
STATIC FUNCTION CheckingRussianGet( aGetBoxObj ) // Проверка на русские буквы LOCAL lRet := .T., nI, cC, nJ, cVal LOCAL cGetBox, cTbl := ' 0123456789' , cMsg := ""
FOR nI := 128 TO 175 cTbl += CHR(nI) NEXT FOR nI := 224 TO 239 cTbl += CHR(nI) NEXT ? cTbl
FOR nI := 1 TO Len(cVal) cC := subs(cVal, nI, 1) ? nI, cC, ASC(cC), " logika[ ! cC $ cTbl ]=", ! cC $ cTbl If ! cC $ cTbl cMsg += 'Неверный символ "'+cC+'" позиция '+hb_ntos(nI) cMsg += ' строка '+hb_ntos(nJ)+";" lRet := .F. EXIT EndIf NEXT
NEXT
IF ! lRet cMsg += 'БУКВЫ должны быть русскими !;;' cMsg += "Исправьте, иначе поиск будет неправилен !;;" MG_Stop(cMsg, 'Ошибка') This.&(cGetBox).SetFocus DO EVENTS ENDIF
Отправлено: 01.06.20 11:25. Заголовок: Для заставки в прогр..
Для заставки в программе использую функцию Paintdegrade() из примера \Minigui\Samples\Advanced\PaintDegrade\Demo.prg. Если в пример вставить строку SET PROGRAMMATICCHANGE OFF , то цветовая гамма не появляется. Это несоответствие появилось еще с версии 17.04 . Как решить эту проблему?
Отправлено: 10.07.20 11:14. Заголовок: Всем привет ! Очеред..
Всем привет ! Очередная китайская загадка. На форму вывожу так:
? nY, nX, nWtb1, nHTxt, cFileSbln, aBColorTxt @ nY, nX TEXTBOX TbShbl_1 VALUE cFileSbln WIDTH nWtb1 HEIGHT nHTxt ; FONTCOLOR BLACK BACKCOLOR aBColorTxt ON CHANGE {|| cFileSbln := This.TbSbln_1.Value } пробовал и так: @ nY, nX TEXTBOX TbShbl_1 VALUE cFileSbln WIDTH nWtb1 HEIGHT nHTxt ; FONTCOLOR BLACK BACKCOLOR aBColorTxt ; ON CHANGE {|| cFileSbln := Form_SetCmp.TbSbln_1.Value } // строка 192
Форму строит нормально, но при попытке ввода - вылет с ошибкой:
Error MGERROR/0 Control: TbSbln_1 Of Form_SetCmp Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(100) in module: h_error.prg Called from GETPROPERTY(4856) in module: h_controlmisc.prg Called from (b)FORM_OPENCOMPSET(192) in module: aTopMenu2.prg Called from _DOCONTROLEVENTPROCEDURE(1901) in module: h_windows.prg Called from EVENTS(1912) in module: h_events.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1514) in module: h_windows.prg Called from FORM_OPENCOMPSET(401) in module: aTopMenu2.prg
Все переменные определены, точно такой же оператор стоит в другом окне - работает без проблем. А почему здесь не работает, что не так делаю ?
Отправлено: 10.07.20 17:26. Заголовок: А вот дальше у меня ..
А вот дальше у меня точно НЕ МОЯ ошибка или баг. При использовании отладки в лог-файл допустим _MsgLog.txt после использования команды GetFile(...) перестаёт писаться в текущий лог, создаёт НОВЫЙ лог в папке где был использован последний путь из GetFile(...) Почему ?
Отправлено: 10.07.20 17:34. Заголовок: Andrey пишет после и..
Andrey пишет
цитата:
после использования команды GetFile(...) перестаёт писаться в текущий лог
Исходники для того, что бы их смотреть h_ini.prg
*-----------------------------------------------------------------------------* FUNCTION _SetGetLogFile( cFile ) *-----------------------------------------------------------------------------* LOCAL cOld STATIC MLog_File
Использую виндовую функцию GetColor() из h_dialogs.prg Открывается аж на другом конце экрана, по позиции окна примерно 10x10. Окно с ТСБ на весь экран, колонка с изменением цвета в правом углу. Вызываешь эту функцию и она показывается в левом углу... Блин юзера задолбают вопросом - сдвинуть там где колонка. А можно как то задать позицию этого GetColor() ? В старом примере Tsb_Config тоже так же, только там задание цвета в отдельном окне и выходит по центру. Более менее красиво.
Пример браузера. Наблюдается такое: выделяешь выражение, если вызвать меню мышкой, то Копировать работает. А по CTRL+C не копирует. Как это исправить? Какие могут быть причины? По идее это виндовый браузер, в нем же это работает.
Отправлено: 14.02.21 22:31. Заголовок: Можно ли на объекте ..
Можно ли на объекте BUTTONEX сделать отключение показа окантовки кнопки внизу/вверху/справа/слева ? Очень удобно при совмещении кнопки и FRAME сделать объект единым, т.е. совмещать два объекта.
В коде примерно так: @ nR, nC BUTTONEX Button_11 CAPTION "Page (1)" WIDTH nWBth HEIGHT nHBth ; PARENT &cForm FONTCOLOR BLACK BACKCOLOR aColors[1] FONT cFname SIZE nFSize BOLD ; SETBORDER {.T.,.T.,.T.,.F.} FLAT NOXPSTYLE ACTION {|| myAction(1), myFocus() }
Отправлено: 26.02.21 19:54. Заголовок: Можно ли при старте ..
Можно ли при старте MAIN окна сделать запуск отдельной формы (с наворотами) в отдельном потоке ? Этот поток должен существовать до конца закрытия программы. И как тогда обращаться к этой форме в другом потоке (вывод на форму) ?
Отдельные Public и Private переменные могут передаваться потоку при его создании ... Поэтому в тех случаях, когда потоки используют какие-либо общие ресурсы ( чаще всего - переменные ), необходимы средства синхронизации работы потоков, чтобы они не обращались к общим ресурсам одновременно. Такими средствами являются семафоры и одна из их разновидностей - mutex ...
Учитывая что _HMG_SYSDATA это глобальный массив с ~ _HMG_SYSDATA\[455] (_HMG_aFormNames, _HMG_aFormHandles, ...) элементами, то совместный доступ организовать будет не возможно, учитывая, что обработчик всего общая ф-я Events(...). Забудь. Запускай свою же прогу повторно с др. параметрами при первом старте и общайся между ними по потребностям
Отправлено: 02.04.21 18:08. Заголовок: А есть возможность в..
А есть возможность в МиниГуи цеплять большие курсоры для мышки ? А то при выборе в ТСБ записи медленно окно карточки прорисовывается, пока построит всё объекты на окне, юзер давит на кнопку или мышкой затыкивает запись в ТСБ. Нужно показать немедленную реакцию программы - типа большие часики показать и юзер увидит реакцию проги и не будет нервничать. У кого есть большие курсоры для мышки и как это сделать для МиниГуи ?
P.S. Нашёл в инете только ОДИН большой курсор Circle.ani - 350 кб, добавил в пример MiniGUI\SAMPLES\BASIC\CURSOR_2 заработал, а вот собираться в ехе-ник этот курсор не хочет. Выдаёт ошибку:
Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Error MyCurcor.rc 2 45: Invalid cursor format hbmk2[5Tbrw_table_2]: Error: Running resource compiler. 20018
Ошибку выдаёт и на других курсорах: HMG.cur Working in Background.ani Почему ?
Отправлено: 02.04.21 21:39. Заголовок: Andrey пишет Выдаёт ..
Andrey пишет
цитата:
Выдаёт ошибку:
У меня выдает DEMO.RC (61) : error RC2175 : resource file .\Cursors\Circle.ani is not in 3.00 format
цитата:
Ошибка компилятора ресурсов RC2175 имя файла ресурсного файла не в формате 3.00
Указанный ресурс использовал формат более ранней, чем версия 3.00. Файл ресурсов должен быть преобразован или воссоздан с использованием формата версии 3.00 или новее.
Отправлено: 03.04.21 17:16. Заголовок: Вопрос возник опять ..
Вопрос возник опять по окнам. Есть окно модал1, далее строю модал2 с ТСБ. В ячейки таблицы вызываю редактирование - окно модал3. Иногда у заказчика (да и я сам один раз словил) идёт переключение сразу на модал1.
Нашёл алгоритм, который роняет прогу: Колёсико мышки в ТСБ вверх/вниз, выхожу обратно на модал2 и после закрытия редактирования ячейки (модал3 закрывается) - идёт переключение на модал1 и становиться АКТИВНЫМ !!! Т.е. окно модал2 под ним и переключиться на него НЕ МОГУ ! Почему ? Как это исправить ?
Отправлено: 03.04.21 17:50. Заголовок: Andrey пишет Т.е. ок..
Andrey пишет
цитата:
Т.е. окно модал2 под ним и переключиться на него НЕ МОГУ !
Похожая картина происходит в MDI окнах, если их 3-и и больше и на тек. окне ввод в GETBOX, то по завершении ввода фокус улетает на окно mdi child другое (точно уже не помню, но кажется первое) и все там и сидит. Где то управление окнами в h_events.prg подрабатывает. Определить не смог.
Отправлено: 03.04.21 18:44. Заголовок: Andrey пишет Благо э..
Andrey пишет
цитата:
Благо это в одном месте, переделал на контекстное меню.
Если есть потребность 3-го окна, то надо убирать 2-е и вместо него делать, типа, 3-е, отработать и убрав 3-е, пересоздать 2-е, учитывая данные с 3-го. В MDI тек. hmg (так пробовал делать и не было перескоков фокуса).
Отправлено: 01.05.21 08:18. Заголовок: Наткнулся на баг!
Пример со строчным курсором: MiniGUI\SAMPLES\Advanced\Tsb_linedrag
Для решения задачи все ячейки делаются редактируемыми ... // prepare for showing of Double cursor AEval( oBrw:aColumns, {| oCol | oCol:lFixLite := oCol:lEdit := TRUE } ) ... и хотя для предотвращения входа в редактирование я устанавливал в описании столбца PREEDIT {|| .F.} это не спасает от ошибочного входа в редактирование первого столбца Пользователь зачастую не глядя редактирует быстро колонки и ИНОГДА кусок введеных данных оказывается введен параллельно и в первую колонку TSBrowse. Вышел из этой ситуации таким образом: DATA FieldWBlock('ls', Select('sity')) --> DATA str(sity->ls,6,0)
Отправлено: 28.09.21 19:24. Заголовок: Блин, опять забыл ка..
Блин, опять забыл как сделать передачу параметров для запуска программы. Программа запускается так: import.exe "блабла" 2021 "ок" А как сделать этот параметр в файле import.hbp ? Т.е. чтобы запускать на компиляцию hbmk2.bat import.hbp и после сборки предавалась эта командная строка - "блабла" 2021 "ок"
Отправлено: 29.09.21 00:13. Заголовок: А что поделать, памя..
А что поделать, памяти после ковида вообще нет. Год назад об этом спрашивал оказывается, забыл. На форуме в поиске задавал ключ поиска -run и выдало 0 страниц. Поиск на форуме вообще не фурычит.
Haz пишет:
цитата:
2) читаем справку , там есть -runflag=<f> pass single flag to output executable when -run option is used
Пробовал этот ключ, что то не пошёл он у меня. Задаю так:
Там же написано single flag . т.е. один параметр одной строкой. Убери все пробелы и кавычки ( они точно не нужны т.к. через командную строку передаются только строки) В программе распарсишь полученную строку на нужные составляюшие
/* * 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 ----------------"
Отправлено: 20.10.21 20:02. Заголовок: Можно ли заблокирова..
У меня 4 окна с таблицами WINDOWTYPE STANDARD которые можно открыть поочерёдно на экране. С каждой таблицы можно открыть ТОЛЬКО одну карточку - окно MODAL, это чтобы юзер не запутался ещё и в карточках.
Можно ли заблокировать переключение на другие окна из MODAL окна. Т.е. если юзер открыл окно, то пока не закроет его, то пусть в нём и СИДИТ !!! А то если открыты другие таблицы, юзер пытается туда переключаться без закрытия окна предыдущей карточки. И переключается текущий алиас базы. Можно эти переключения на другие таблицы, как то блокировать ? Или заменять после переключения на таблицу от которой открыта карточка ? Предупреждение можно вывести в этот момент, типа закройте карточку, а потом переключайтесь на другую таблицу ?
Собирал так: c:\MiniGui-23.09\batch\hbmk2.bat aesdemo.hbp из за этого и выдавало ошибку. Добавил в aesdemo.hbp строку -lhbaes и всё собралось ! Спасибо Dima
Отправлено: 19.09.23 23:20. Заголовок: Пытался из этого при..
Пытался из этого примера перенести в другой модуль, где весь С-код util_c_code.prg:
/* * C-level */ #pragma BEGINDUMP
Не получается. Потом не собирается util_c_code.prg, выдаёт ошибку:
Harbour 3.2.0dev (r2307062207) Copyright (c) 1999-2023, https://harbour.github.io/ OBJ\util_c_code.c: Warning W8017 util_c_code.prg 94: Redefinition of '_WIN32_IE' is not identical Warning W8017 util_c_code.prg 95: Redefinition of '_WIN32_WINNT' is not identical Error E2451 util_c_code.prg 110: Undefined symbol 'NOTIFYICONDATA' in function ShowNotifyInfo Error E2379 util_c_code.prg 110: Statement missing ; in function ShowNotifyInfo Error E2451 util_c_code.prg 112: Undefined symbol 'nid' in function ShowNotifyInfo Error E2109 util_c_code.prg 112: Not an allowed type in function ShowNotifyInfo Error E2109 util_c_code.prg 114: Not an allowed type in function ShowNotifyInfo Error E2451 util_c_code.prg 118: Undefined symbol 'NIF_INFO' in function ShowNotifyInfo Error E2451 util_c_code.prg 126: Undefined symbol 'NIM_ADD' in function ShowNotifyInfo Warning W8065 util_c_code.prg 126: Call to function 'Shell_NotifyIcon' with no prototype in function ShowNotifyInfo Error E2451 util_c_code.prg 128: Undefined symbol 'NIM_DELETE' in function ShowNotifyInfo Warning W8065 util_c_code.prg 128: Call to function 'Shell_NotifyIcon' with no prototype in function ShowNotifyInfo Warning W8057 util_c_code.prg 132: Parameter 'hWnd' is never used in function ShowNotifyInfo *** 8 errors in Compile *** hbmk2[Demo]: Error: Running C/C++ compiler. 1
Как можно это решить (перенести в отдельный модуль) ?
Отправлено: 11.10.23 11:49. Заголовок: Григорий, что мне де..
Григорий, что мне делать ? Собираю свою большую прогу MiniGui 23.09.2 Перетасовал свой main.prg Теперь после запуска прога падает с ошибкой:
Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(178) in module: Source\main.prg
Вот код:
? ProcNL(), Repl("*",10) + " DEFINE WINDOW " + Repl("*",10), "Set_bEvents('MyEventsHandler')" DoEvents() Set_bEvents( {|hH,nM,wP,lP| MyEventsHandler(hH,nM,wP,lP) } ) // блок кода обработчика событий программы
DEFINE WINDOW Form_Main ; AT 0,0 WIDTH 640 HEIGHT 480 ; TITLE cTitle ICON cIcon ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT {|| DoEvents(), _wPost(0) } ; ON RELEASE {|| _LogFile(.T., CRLF + ">>> STOP <<< " + HMG_TimeMS(App.Cargo:tStart) ) } ; ON INTERACTIVECLOSE {|| IIF( lStaticErrorClose, MyExit(), Nil ) }
? ProcNL(), Repl("*",10) + " DEFINE WINDOW " + Repl("*",10), "после" ... o := This.Object o:Event( 0, {|ow| // запуск при инициализации окна Local hWnd, cWnd hWnd := ow:Handle cWnd := ow:Name ? REPL(".", 90 ) ? SPACE(5) + ":Event(0)", ProcNL(), hWnd, IsIconic( hWnd ), cWnd, _HMG_MainHandle myInitForm() DO EVENTS _wSend(1, ow) // запуск события 1 DO EVENTS _wSend(2, ow) // запуск события 2 DO EVENTS _wPost(3, ow) // запуск события 3 Return Nil }) // <<<<<<------------- строка 178
Отправлено: 25.10.23 22:15. Заголовок: Есть такой рабочий к..
Есть такой рабочий код для проверки ранее запущенной программы.
/* * Проверка запуска программы на ВТОРУЮ копию программы * Check the start of the program on the second copy of the program */ FUNCTION OnlyOneInstance( cAppTitle )
Код отлично работает с 2013 года, но есть подвох. Если MAIN окно сделать HIDE, то код перестаёт работать. Как это исправить, если MAIN окно всегда HIDE ?
Dima hWnd := FindWindowEx( ,,, cAppTitle ) позволяет проверять наличие программы по Title main окна, т.е. один запуск с таким заголовком IsExeRunning() - создает mutex, который проверяется на наличие, по default mutex такой _HMG_IsMultiple := IsExeRunning ( StrTran( GetExeFileName (), '\', '_' ) ) но можно mutex строить от full имени ini + [секция], т.е. несколько запусков exe, но разные параметры, например
Отправлено: 26.10.23 16:43. Заголовок: Dima пишет: а что к..
Dima пишет:
цитата:
а что кажет IsWindowVisible(hwnd) если окно скрыто ?
? " #### " + ProcNL(), cAppTitle, hWnd, IsWindowVisible(hWnd) Выдаёт в лог: #### Call from: ONLYONEINSTANCE(27) --> main_misc.prg Template of the finished program on MiniGui 263598 .F.
Программа cAppTitle должна запускаться ТОЛЬКО ОДИН раз ! Повторные запуски из других каталогов - запретить ! Программа cAppTitle имеет всегда видимое окно Forma_MenuMain. Нужно достучаться до второго окна допустим Forma_MenuMain. И если уже ранее было запущено, то поднять нужно на передний план экрана. Это можно как то сделать ?
Отправлено: 11.12.23 14:10. Заголовок: Andrey Выведи весь ..
Andrey Выведи весь список Label и увидишь, что они формируются по окну, т.е. длинные строки разбиваются на несколько Label, делай как надо сам, например так Скрытый текст
/////////////////////////////////////////////////////////////////////////////// FUNCTION Main() LOCAL aGrOver, aBtn, aGrFill, aGrOverX, aGrFillX LOCAL cLog := "_msg.log"
Отправлено: 11.12.23 22:24. Заголовок: Есть окно с POPUP ме..
Есть окно с POPUP меню. Что нужно поставить в ON INIT, чтобы при запуске это меню открывалось ?
DEFINE WINDOW Win1 AT 0, 0 WIDTH System.DesktopWidth HEIGHT 90 ; TITLE PROGRAM MAIN ON INIT {|| Nil }
DEFINE MAIN MENU DEFINE POPUP 'Menu examples' MENUITEM 'Menu without icons' ACTION ... MENUITEM 'Menu with icons' ACTION ... Separator MENUITEM 'Exit' ACTION Win1.Release() END POPUP END MENU
Пример \MiniGUI\SAMPLES\BASIC\ButtonEx_3 Там есть команды: PICTALIGNMENT TOP PICTALIGNMENT LEFT PICTALIGNMENT RIGHT PICTALIGNMENT BOTTOM
Эти команды предназначены только для совместимости с кодом официальной версии HMG. Это было сделано для удобства миграции кода с HMG в МиниГуи. Все подробности надо см. в файле minigui\include\i_hmgcompat.ch
Понял. Надоело писать много IF в коде с кнопками, например в APP_OOPTEMPLATE функция util_button.prg Там сплошные IF.... Хотелось бы просто задавать свойства кнопки через SetProperty ( ххх, ххх, , ) или так This.&(cObj).Action := {|| .... } Кстати ещё вопрос, а можно после построения кнопки задать MOUSEHOVER и MOUSELEAVE ?
@ y, x BUTTONEX &cObj PARENT &cForm ; ... FONT aFnt[1] SIZE aFnt[2] BOLD VERTICAL ; ON MOUSEHOVER ( This.Backcolor := aBtnClr[2] , This.Fontcolor := aFntClr[2] ,; This.Icon := LoadIconByName(aIcon[2],nSizeIcon,nSizeIcon) ); ON MOUSELEAVE ( This.Backcolor := aBtnClr[1] , This.Fontcolor := aFntClr[1] ,; This.Icon := LoadIconByName(aIcon[1],nSizeIcon,nSizeIcon) );
Отправлено: 13.12.23 21:39. Заголовок: Спасибо БОЛЬШОЕ ! :..
Спасибо БОЛЬШОЕ ! Заработало у меня. Ещё вопрос по кнопкам:
@ .. BUTTONEX &cObj .... ; ..... IIF(lTextVert, VERTICAL, Nil) ; // так можно ? IIF(lTextLeft, LEFTTEXT, Nil) ; // так можно ? ON INIT {|| This.Cargo := nwPost } ; .....
Попробовал, не компилируется.... Я вспомнил, что задавал этот вопрос, вы советовали использовать другой синтаксис этой команды. Григорий, можно как то добавить свойства для этого - SetProperty ( ххх, ххх, , ) ? Примерно такого нового синтаксиса:
Отправлено: 20.05.25 18:31. Заголовок: Проходили этот вопро..
Проходили этот вопрос, но может как то можно сделать окно ожидания внутри построения окна ? При построение большой карточки и когда много открытых баз, прога на МиниГуи подтормаживает. Юзеру нужно окно ожидания. Вот так не получается, вылетает:
DEFINE WINDOW &cForm MODAL .... .... WaitWindow( {"... Wait for the preparation to complete ...", App.ExeName }, .F., 600, 16, NIL, RED, ORANGE ) DBSELECTAREA(cAls) Card_6Tsb(owc:oWin,owc:aBClr,{},"",lCaEdit) // построение на окне 6 таблиц WaitWindow() .... END WINDOW
Программа висит и всё... Потом по клику мышки вылетает с ошибкой ! Как решить данную проблему ?
Отправлено: 21.05.25 02:10. Заголовок: Если ставлю .T. вот ..
Если ставлю .T. вот так:
WaitWindow ( {"... WAIT FOR COMPLETION ...", App.ExeName }, .T.,600,16, "DlgFont", YELLOW, RED ) DO EVENTS DBSELECTAREA(cAls) INKEYGUI(500) Card_6Tsb(owc:oWin,owc:aBClr,{},"",lCaEdit) WaitWindow() То вылет: Error MGERROR/0 Only Panel windows can be defined inside a DEFINE WINDOW...END WINDOW structure. Program terminated. Called from MSGMINIGUIERROR(132) in module: h_error.prg Called from _DEFINEWINDOW(153) in module: h_windows.prg Called from WAITWINDOW(3033) in module: h_windows.prg Called from CARD_FOR_TABLE(134) in module: form_card.prg Called from (b)SETS_EVENT2ZAIVKA(288) in module: demo3_1Base.prg
Если ставлю
WaitWindow ( {"... WAIT FOR COMPLETION ...", App.ExeName }, 0,600,16, "DlgFont", YELLOW, RED )
Отправлено: 21.05.25 12:22. Заголовок: Andrey пишет То окна..
Andrey пишет
цитата:
То окна НЕТ !
Внимательнее читай, с таким параметром и не должно его быть - это задание глобальных значений, т.е. команда, которую Григорий написал ниже в теме, перед выпуском new версии. Пример BASIC\Wait_Window\demo.prg с добавками Скрытый текст
/* * Harbour MiniGUI Demo */
#include "minigui.ch"
FUNCTION Main
LOCAL cTitle := 'WAIT WINDOW DEMO' LOCAL cFont := "Arial", nSize := 16 LOCAL cMsg := "... WAIT FOR COMPLETION ...;"+App.ExeName+";"
Отправлено: 22.05.25 11:54. Заголовок: После очередных свои..
После очередных своих проб - выяснил следующее: КАТЕГОРИЧЕСКИ нельзя делать в незаконченном окне (структуре define window ... end window) - другие окна !
В GUI действует правило: Пока нет activate, то нет и окна и ничего нигде не увидеть. Строить ВСЕ работы надо ДО Define Window ... или в on init ... и др. событиях Спасибо БОЛЬШОЕ Сергею !
Все даты в формате GMT
3 час. Хитов сегодня: 1574
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет