On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение
gfilatov
модератор




Пост N: 699
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)


Начало темы находится здесь, а теперь

АНОНС * АНОНС * АНОНС * АНОНС * АНОНС

Готовится к опубликованию новая сборка №48, которая выйдет в конце недели.
Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне

Кратко, что нового:

- исправление обнаруженных ошибок и неточностей кода;
- новый класс HEADERIMAGE для Grid и Browse;
- свойство Address в Hyperlink может теперь открывать папку или файл на диске;
- добавлен NOTABSTOP класс для Browse;
- поддержка пользовательских компонентов (заимствована из оффициального релиза);
- расширения и исправления в библиотеках TsBrowse и PropGrid;
- обновлены сборки Харбор и HMGS-IDE;
- новые и обновленные старые примеры (как обычно ).




Спасибо: 5 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


gfilatov2002
moderator




Пост N: 2106
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.02.23 11:11. Заголовок: Andrey пишет: функц..


Andrey пишет:

 цитата:
функция определяющая тип время


Попробуй использовать функцию HB_ISTIMESTAMP()

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7306
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.02.23 11:29. Заголовок: Спасибо БОЛЬШОЕ ! ..


Спасибо БОЛЬШОЕ !

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4234
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.02.23 11:45. Заголовок: Andrey Уже публиков..


Andrey
Уже публиковали, повторю https://github.com/Petewg/harbour-core/wiki

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7307
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.02.23 18:04. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Попробуй использовать функцию HB_ISTIMESTAMP()


А можно добавить аналогично как другие hb_IsLogical, hb_IsDate, hb_IsChar , типа - hb_IsDateTime ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4235
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.02.23 18:10. Заголовок: Andrey по ссылке на..


Andrey
по ссылке на оглавлении hb_I смотреть не пробовал ?
 
...
hb_IsDateTime(<xExp>) ➜ lResult
determines if <xExp> evaluates to a timestamp (valtype "T") or a date (valtype "D") value.

hb_IsTimestamp(<xExp>) ➜ lResult
determines if <xExp> evaluates to a timestamp (valtype "T).


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7308
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.02.23 18:20. Заголовок: SergKis пишет: по с..


SergKis пишет:

 цитата:
по ссылке на оглавлении hb_I смотреть не пробовал ?


Да опять моё невнимание. Посмотрел только в CH и все...
Извиняюсь...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4236
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.02.23 11:41. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая недоработка в MDI с ToolBar, примеры тут https://TransFiles.ru/duv77
1. demo.exe - ToolBar на MdiMain окне - нажатие Maximize окна работает как надо ToolBar меняет размер
2. demo2.exe- ToolBar на MdiChild окне - нажатие Maximize окна работает НЕ как надо ToolBar НЕ меняет размер
с тсб, то что размер не меняется, так и должно быть - нет обработчика
h_events.prg 
****************************************************************************
CASE WM_SIZE
****************************************************************************
...
FOR i := 1 TO ControlCount

IF _HMG_aControlParentHandles [ i ] == hWnd

IF _HMG_aControlType [ i ] == "TOOLBAR"
SendMessage ( _HMG_aControlHandles [ i ], TB_AUTOSIZE, 0, 0 )
ENDIF

ENDIF

NEXT i
...
h_windowsmdi.prg
//**********************************************************************
CASE nMsg == WM_SIZE
//**********************************************************************
...
нет SendMessage ( _HMG_aControlHandles [ i ], TB_AUTOSIZE, 0, 0 ), как выше

может тут причина

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2108
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.03.23 11:12. Заголовок: Выложил 2-е обновлен..


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

click here

Благодарю Андрея Верченко и Сергея Киселева за непрерывную поддержку разработки этой библиотеки

Желаю всем форумчанам здоровья и процветания

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7311
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.03.23 09:00. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

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


Спасибо БОЛЬШОЕ Григорий за твой труд !

Народ !
Оцените код примера - MiniGUI\SAMPLES\Advanced\Tsb_array_4
Огромное СПАСИБО Сергею за его участие в создание таких примеров !
Был бы раньше такой пример, я бы по другому сделал у себя ВСЕ таблицы.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4244
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.03.23 12:30. Заголовок: gfilatov2002 SergKi..


gfilatov2002
SergKis пишет
 цитата:
Небольшая недоработка в MDI с ToolBar


Сделал как в нашей версии
1. убрал в FUNCTION MdiEvents ( hWnd, nMsg, wParam, lParam ) секцию WM_SIZE, т.е.
/*
//**********************************************************************
CASE nMsg == WM_SIZE
//**********************************************************************
...
*/
//**********************************************************************
CASE nMsg == WM_CLOSE
//**********************************************************************
...
2. h_events.prg
 
****************************************************************************
CASE WM_SIZE
****************************************************************************
...
IF _HMG_MainClientMDIHandle != 0

IF wParam != SIZE_MINIMIZED .AND. hWnd==_HMG_MainHandle

SizeClientWindow ( hWnd, _HMG_ActiveStatusHandle, _HMG_MainClientMDIHandle, r )

ENDIF

ENDIF
...

работает как надо с изменением Maximize\Normalize Main окна, но так же не работает, как и раньше, с Maximize MdiChild окна (пример 1 из архива выше)

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2110
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.03.23 16:03. Заголовок: SergKis пишет: не р..


SergKis пишет:

 цитата:
не работает, как и раньше, с Maximize MdiChild окна


Решил эту проблему в примере 2 из архива, добавив в основное окно два обработчика событий ON MAXIMIZE и ON SIZE:

 
DEFINE WINDOW wMain AT nY,nX WIDTH nW HEIGHT nH TITLE cTitle ;
MAIN MDI TOPMOST ;
BACKCOLOR {227, 238, 251} ;
ON INIT {|| This.Topmost := .F., DoEvents(), _wPost(0) } ;
ON MAXIMIZE {|| iif( ISNUMERIC( hSpl ), _SetWindowSizePos ( hSpl, , , This.Width ), ) } ;
ON SIZE {|| iif( ISNUMERIC( hSpl ), _SetWindowSizePos ( hSpl, , , This.Width ), ) } ;
ON INTERACTIVECLOSE {|| _wSend(98), This.Cargo:lCloseForm } ;
ON RELEASE {|| dbCloseAll() }
и сделал переменную hSpl типа Public в функции Main (соответственно убрал ее из функции Child_Button()):

 цитата:
PUBLIC hSpl



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4245
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.03.23 18:07. Заголовок: gfilatov2002 пишет Р..


gfilatov2002 пишет
 цитата:
Решил эту проблему в примере 2 из архива, добавив в основное окно два обработчика событий ON MAXIMIZE и ON SIZE:


С самим MdiChild окном - все ясно (надо обработчики, лучше спрятать во внутрь, а не прописывать каждому окну). Изменения про которые писал выше, касаются только притягивания StatusBar и ToolBar к размеру MdiMain окна (Maximize\Normalize кнопка), в 1-м и во втором примерах (до изменений работало правильно только во 2-м примере, в 1-м нет).
А
 цитата:
но так же не работает, как и раньше, с Maximize MdiChild окна (пример 1 из архива выше)


относится к 1-му примеру, т.е. запускаем, жмем, например, кнопку 3, получаем MdiChild окно, жмем кнопку Maxmize этого окна и получаем .... Тут тоже вопрос есть. Как выполнять Maximize ? Приводить все MdiChild окна к режиму Maximize или делать MdiChild окно в размер реальной клиентской области MdiMain окна ?
PS
В своей версии режим работы 1-го примера не используем в работе MDI, все только в режиме 2-го примера, т.е. всем MdiChild окнам (в lib загнали) делается This.Maximize, т.е. всегда видим только одно окно (под ним могут быть др. MdiChild окна, можно их видимость переключать) + Modal окна как в примере 2-а. Как показала практика - этого достаточно

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2112
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.03.23 11:42. Заголовок: Всем кому это интересно


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

click here

Это последнее обновление библиотеки, дальнейшая ее разработка и поддержка поставлены на паузу...

Благодарю за ваше внимание.

Спасибо: 1 
Профиль
Andrey
постоянный участник




Пост N: 7337
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.03.23 18:55. Заголовок: Григорий, можно в h_..


Григорий, можно в h_tbrowse.prg в METHOD ExcelOle(...) поменять местами строки ?
   IF bExtern != NIL 
Eval( bExtern, oSheet, Self )
ENDIF

oRange:Borders():LineStyle := xlContinuous
oRange:Columns:AutoFit()

Сделать так:
oRange:Borders():LineStyle := xlContinuous
oRange:Columns:AutoFit()

IF bExtern != NIL
Eval( bExtern, oSheet, Self )
ENDIF

Дело в том что
oRange:Columns:AutoFit() // автоматически поменять ширину всех столбцов и высоту всех строк 
// в диапазоне, чтобы туда уместился текст ячеек.

А я хочу менять ширину колонок.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1912
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.03.23 23:20. Заголовок: Andrey пишет: А я х..


Andrey пишет:

 цитата:
А я хочу менять ширину колонок.



Гораздо полезнее если метод будет опционально возвращать oExcel вне зависимости от установки lActivate. Тогда делать можно что угодно с созданным объектом.

Ps. Повторюсь, метод на любителя. Скорее как пример работы с оле , чем реально требующийся.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7340
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.03.23 09:38. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

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


Перешёл на него, отдельные проекты собираются.
Перестал работать ехе-ник моей большой системы.
Собирается, запускается, в лог чуток пишет и выходит без ошибки ! Совсем выходит, без запуска MAIN окна.
Откатился на 23.01 - прога собирается и запускается нормально...
Что такого нового в этом обновление ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2113
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.03.23 16:41. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Это последнее обновление библиотеки


Завершается подготовка 4-го и последнего обновления сборки 23.02

Что нового:
Скрытый текст

Если у вас есть дополнения к этой сборке, то я с удовольствием рассмотрю их

Желаю всем доброго здоровья (SergKis) и благодарю за ваше внимание.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7342
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.03.23 18:22. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Если у вас есть дополнения к этой сборке, то я с удовольствием рассмотрю


Отправил на почту.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4252
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.03.23 14:54. Заголовок: gfilatov2002 Спасиб..


gfilatov2002
Спасибо за пожелание. Всем его желаю.

Такую правку предлагаю.
 
FUNCTION _EndTBrowse( bEnd )
...
IF i > 0
oBrw := _HMG_aControlIds[ i ]
IF Len(oBrw:aColumns) > 0
oc := ATail(oBrw:aColumns)
oBrw:oPhant:nClrHeadBack := oc:nClrHeadBack
oBrw:oPhant:nClrFootBack := oc:nClrFootBack
oc := NIL
ENDIF

oBrw:lRePaint := .T.
...

что бы не писать

END TBROWSE ON END {|ob,oc| ob:SetNoHoles(), oc := ATail(ob:aColumns), ;
ob:oPhant:nClrHeadBack := oc:nClrHeadBack, ;
ob:oPhant:nClrFootBack := oc:nClrFootBack, ;
ob:Refresh(), ob:SetFocus() }


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2114
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.03.23 15:42. Заголовок: SergKis пишет: прав..


SergKis пишет:

 цитата:
правку предлагаю


Принято, но с поправкой.

SergKis пишет:

 цитата:

...
oBrw := _HMG_aControlIds[ i ]
IF Len(oBrw:aColumns) > 0
oc := ATail(oBrw:aColumns)
oBrw:oPhant:nClrHeadBack := oc:nClrHeadBack
oBrw:oPhant:nClrFootBack := oc:nClrFootBack
oc := NIL
ENDIF
oBrw:lRePaint := .T.


Поскольку в этот момент колонка oPhant не определена, переписал эту правку таким образом:

 
...
oBrw:lRePaint := .T.
oBrw:Display()
IF Len( oBrw:aColumns ) > 0 .AND. ! Empty( oBrw:oPhant )
oc := ATail( oBrw:aColumns )
oBrw:oPhant:nClrHeadBack := oc:nClrHeadBack
oBrw:oPhant:nClrFootBack := oc:nClrFootBack
oc := NIL
ENDIF
...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4255
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.03.23 20:24. Заголовок: gfilatov2002 Немног..


gfilatov2002
Немного поправил, получилось
 
*-----------------------------------------------------------------------------*
FUNCTION _EndTBrowse( bEnd )
*-----------------------------------------------------------------------------*
LOCAL i, k, n, oBrw
LOCAL oc := NIL, ow := NIL

#ifdef _OBJECT_
ow := oDlu2Pixel()
#endif

IF _HMG_BeginTBrowseActive
i := AScan( _HMG_aControlHandles, _HMG_ActiveTBrowseHandle )
IF i > 0
oBrw := _HMG_aControlIds[ i ]
oBrw:lRePaint := .T.
oBrw:Display()
IF ( k := Len(oBrw:aColumns) ) > 0 .AND. ! Empty( oBrw:oPhant )
oc := ATail(oBrw:aColumns)
n := iif( ValType( oc:nClrHeadBack ) == "B", Eval( oc:nClrHeadBack, k, oBrw ), oc:nClrHeadBack )
oBrw:oPhant:nClrHeadBack := n
n := iif( ValType( oc:nClrFootBack ) == "B", Eval( oc:nClrFootBack, k, oBrw ), oc:nClrFootBack )
oBrw:oPhant:nClrFootBack := n
oBrw:Refresh()

oc := NIL
ENDIF


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2115
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.03.23 21:38. Заголовок: SergKis пишет: Немн..


SergKis пишет:

 цитата:
Немного поправил


OK, принято
Благодарю за помощь

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2116
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.03.23 10:44. Заголовок: Выложил 4-е обновлен..


Выложил 4-е обновление сборки 23.02 с учетом последних исправлений и дополнений

click here

Благодарю за многолетнюю поддержку и помощь в разработке этого проекта:
Сергея Киселева, Игоря Назарова и Андрея Верченко.

Также я признателен Саше Савову из Болгарии.

До новых встреч

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4263
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.03.23 11:34. Заголовок: gfilatov2002 пишет В..


gfilatov2002 пишет
 цитата:
Выложил 4-е обновление сборки 23.02
- minor corrections in the method UpStable().


 
::lPainted := ::lInitGoTop

IF ::lPainted .AND. ::bChange != NIL
Eval( ::bChange, Self, VK_UP )
ENDIF

::bChange := NIL
::lHitTop := .F.
::lHitBottom := .F.

::GoTop()

::lPainted := .T.

While !( ::cAlias )->( Eof() )

Получается, что прорисовку теперь в :UpStable() нельзя отключить. Наверно, такую возможность надо было оставить, сделать
 
LOCAL nRow := ::nRowPos, ;
...
bChange := ::bChange, ;
nLastPos := ::nLastPos, ;
lPainted := ::lPainted

...
::GoTop()

::lPainted := lPainted

While !( ::cAlias )->( Eof() )


PS
Только сейчас обратил внимание, что
HB_FUNC( RCDATATOFILE )
HB_FUNC( RCDATATOMEM )
достают только из ресурсов своего exe, а из dll внешней - нет,
HMODULE hModule = GetResources();
может есть смысл брать, если задан параметр из него hModule брать

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2117
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.03.23 12:02. Заголовок: SergKis пишет: таку..


SergKis пишет:

 цитата:
такую возможность надо было оставить, сделать

LOCAL nRow := ::nRowPos, ;
...
bChange := ::bChange, ;
nLastPos := ::nLastPos, ;
lPainted := ::lPainted
...
::GoTop()

::lPainted := lPainted

While !( ::cAlias )->( Eof() )


Да, так будет лучше
Благодарю за подсказку

P.S. Уже поправил эту неточность в инсталляторе текущей сборки

P.S.2 Обновил также Unicode архив этой сборки для Сергея...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2118
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.03.23 18:23. Заголовок: Всем кому это интересно


По ходу добавил возможность отображения на кнопке PNG файлов с альфа-каналом.

На картинке ниже видно, как выглядят кнопки в нормальном и отключенном виде.



Кстати, сегодня исполнилось ровно 170 лет со дня рождения Ван Гога...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4264
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.03.23 18:28. Заголовок: gfilatov2002 пишет О..


gfilatov2002 пишет
 цитата:
Обновил также Unicode архив этой сборки для Сергея...


Спасибо , уже взял

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7344
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.03.23 18:43. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Обновил также Unicode архив этой сборки для Сергея


А я тоже хочу....

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1929
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 31.03.23 10:03. Заголовок: SergKis пишет: ..


SergKis пишет:

 цитата:
bChange := ::bChange, ;
nLastPos := ::nLastPos, ;
lPainted := ::lPainted
...
::GoTop()

::lPainted := lPainted



в новой версии как моргал при редактировании ::Upstable() так и моргает в ::GoTop() влетаем со включенным ::lPainted и это вызывает прорисовку , простое решение перед ::Gotop() выключить а после него включить. У себя такую правку делаю, чтоб не править везде bPre(Post)Edit. Но если никто не жалуется , значит не востребовано.
PS или во все методы навигации добавлять параметр , например ::Gotop( lRefresh ) по умолчанию включено.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4265
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.03.23 10:27. Заголовок: Haz пишет в новой ве..


Haz пишет
 цитата:
в новой версии как моргал при редактировании ::Upstable() так и моргает в ::GoTop() влетаем со включенным ::lPainted и это вызывает прорисовку , простое решение перед ::Gotop() выключить а после него включить. У себя такую правку делаю, чтоб не править везде bPre(Post)Edit. Но если никто не жалуется , значит не востребовано


Моргать и должно, ситуация не менялась от пред. версии. То что не востребовано, согласен, т.к. заметно на "тяжелых" таблицах, а таких раз, два и все. Мест, где надо править bPostEdit (отключить :lPainted) с зависимыми строками по Row, от произведенного Edit, тоже мало, так что это не вызывает трудностей. Делать ::Gotop( lRefresh ), по мне так совсем не катит, лишнее. Если доберусь до переделки VO прогр., где таблица с откл. стандартным поведением клавиш перемещения (назначены свои блоки кода), то попробую после 1-го отображения откл. ::lPainted и вкл.\выкл. в своих блоках кода на клавишах перемещения. Но программа VO работает и пока острой замены не требует.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1930
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 31.03.23 10:40. Заголовок: SergKis пишет: зам..


SergKis пишет:

 цитата:
заметно на "тяжелых" таблицах, а таких раз, два и все.


заметно на простой таблице при работе со слабой сеткой. Ну а все невостребованные решения я и так делаю заменой методов на внешние, так что править bPostEdit нужды нет. У остальных , при необходимости трудностей видимо не вызовет

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7345
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.03.23 13:44. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
По ходу добавил возможность отображения на кнопке PNG файлов с альфа-каналом.


А где этот красивый пример ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2119
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 31.03.23 14:17. Заголовок: Andrey пишет: где э..


Andrey пишет:

 цитата:
где этот красивый пример ?


Это пример из папки SAMPLES\BASIC\BUTTON_4 для будущих сборок, поскольку требуется также изменение в ядре библиотеки.

Если же интересует текст сырцов самого примера, то он приведен ниже.

/* 
* MINIGUI - Harbour Win32 GUI library
*/

#include "minigui.ch"

FUNCTION Main()

LOCAL aBtn, n
LOCAL cPngPath := ".\images\"
LOCAL aPng := {}

AEval( { 3, 1, 2, 6, 7, 8, 9, 10 }, {| c | ;
AAdd( aPng, cPngPath + "image" + hb_ntos( c ) + ".png" ) } )

aBtn := Array( Len( aPng ) )

DEFINE WINDOW Form_1 ;
AT 0, 0 ;
WIDTH 80 + 70 * Len( aPng ) ;
HEIGHT 430 ;
MAIN ;
TITLE 'Disabled Buttons Test' ;
NOSIZE ;
NOMAXIMIZE

@ 40, 40 LABEL Lbl_1 VALUE "ENABLED BUTTONS NORMAL LOOK" AUTOSIZE

FOR n := 1 TO Len( aPng )

aBtn[ n ] := "Btn1_" + hb_ntos( n )

DEFINE BUTTON &( aBtn[ n ] )
ROW 70
COL n * 70 - 30
ACTION NIL
PICTURE aPng[ n ]
WIDTH 64
HEIGHT 64
END BUTTON

NEXT

@ 150, 40 LABEL Lbl_2 VALUE "LOADED PICTURES NORMAL LOOK" AUTOSIZE

FOR n := 1 TO Len( aPng )
aBtn[ n ] := "Img2_" + hb_ntos( n )

DEFINE IMAGE &( aBtn[ n ] )
ROW 180
COL n * 70 - 20
ACTION NIL
PICTURE aPng[ n ]
WIDTH 48
HEIGHT 48
STRETCH .T.
IF n == 4
HEIGHT 55
ENDIF
END IMAGE

NEXT

@ 260, 40 LABEL Lbl_3 VALUE "DISABLED BUTTONS" AUTOSIZE

FOR n := 1 TO Len( aPng )
aBtn[ n ] := "Btn3_" + hb_ntos( n )

DEFINE BUTTON &( aBtn[ n ] )
ROW 290
COL n * 70 - 30
ACTION NIL
PICTURE aPng[ n ]
WIDTH 64
HEIGHT 64
END BUTTON

Form_1.&( aBtn[ n ] ).Enabled := .F.

NEXT

END WINDOW

CENTER WINDOW Form_1

ACTIVATE WINDOW Form_1

RETURN NIL


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7346
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.03.23 14:29. Заголовок: Ждём с не терпеньем ..


Ждём с не терпеньем - этот пример !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7359
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.04.23 12:55. Заголовок: Пример MiniGUI\S..


Пример MiniGUI\SAMPLES\Advanced\AESDEMO
Не собирается...
 
Harbour 3.2.0dev (r2301231146)
Copyright (c) 1999-2023, https://harbour.github.io/
D:\TEMP\hbmk_bh65r7.dir\aesdemo.c:
D:\TEMP\hbmk_12kx7d.c:
Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland
Error: Unresolved external '_HB_FUN_ENCRYPTFILEAES' referenced from D:\TEMP\HBMK_BH65R7.DIR\AESDEMO.OBJ
Error: Unresolved external '_HB_FUN_DECRYPTFILEAES' referenced from D:\TEMP\HBMK_BH65R7.DIR\AESDEMO.OBJ
hbmk2[aesdemo]: Error: Running linker. 2

Откуда брать эти функции ?

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7755
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.04.23 15:35. Заголовок: Andrey пишет: Откуд..


Andrey пишет:

 цитата:
Откуда брать эти функции ?


HBAES

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4267
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.04.23 15:41. Заголовок: Andrey build.bat за..


Andrey
build.bat запусти в примере (в нем написано)

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7360
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.04.23 18:35. Заголовок: SergKis пишет: buil..


SergKis пишет:

 цитата:
build.bat запусти в примере (в нем написано)


Не сообразил сразу. Начал как всегда запускать Compile.bat
Спасибо !

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2126
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.04.23 15:49. Заголовок: Всем кому это интересно


Попробовал добавить иконки приложений в список запущенных задач в примере из папки SAMPLES\Advanced\PROCESS_TERMINATOR

И вот что у меня получилось:



Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7362
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.04.23 07:40. Заголовок: Классное решение ! ..


Классное решение !
Пример в новую библиотеку !

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2128
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.04.23 11:06. Заголовок: Выложил апрельскую с..


Выложил апрельскую сборку 23.04 с учетом последних исправлений и дополнений

click here

Что нового (кратко):
Скрытый текст

Желаю всем мирного неба над головой
Берегите себя!

Спасибо: 1 
Профиль
SergKis
постоянный участник




Пост N: 4269
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.23 08:54. Заголовок: gfilatov2002 пишет В..


gfilatov2002 пишет
 цитата:
Выложил апрельскую сборку 23.04 с учетом последних исправлений и дополнений


Unicode сборка будет ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2129
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.04.23 11:21. Заголовок: SergKis пишет: Unic..


SergKis пишет:

 цитата:
Unicode сборка


Выложил Unicode сборку по известному адресу.
Что нового:
- добавил новый пример GOOGLE7 для перевода слов (или предложения) на шесть европейских языков с помощью сервиса Google Translate

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4270
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.23 11:52. Заголовок: gfilatov2002 Спасиб..


gfilatov2002
Спасибо, забрал

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7367
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.04.23 11:24. Заголовок: На новой версии Мини..


На новой версии МиниГуи мой большой проект собрался и работает !
Классно !!!

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2131
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.05.23 11:54. Заголовок: Подготовил 1-е обнов..


Подготовил 1-е обновление для сборки 23.04, которое планируется опубликовать на следующей неделе

Что нового:
Скрытый текст

До новых встреч

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2132
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.05.23 11:24. Заголовок: Всем кому это интересно...


Всем кому это интересно

Выложил 1-е обновление сборки 23.04 с учетом последних исправлений и дополнений

click here

Желаю всем мира и добра

Спасибо: 1 
Профиль
gfilatov2002
moderator




Пост N: 2135
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.05.23 11:44. Заголовок: Всем кому это интересно


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

Что нового:
Скрытый текст


Скачать

До новых встреч

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7401
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.06.23 16:49. Заголовок: Как можно это сообще..


Как можно это сообщение сделать чтобы запускался AlertStop() вместо MsgStop() ?
   _HMG_MESSAGE[4] := "Попытка запуска второй копии программы:" + CRLF + ;  
App.ExeName + CRLF + ;
"Отказано в запуске !" + CRLF + _HMG_MESSAGE[4]
SET MULTIPLE OFF WARNING


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7402
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.06.23 18:09. Заголовок: Григорий, а можно на..


Григорий, а можно написать в группу Harbour что глючит последняя версия ?
И когда будет новая версия Харбора ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2142
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 06.06.23 18:42. Заголовок: Andrey пишет: Как м..


Andrey пишет:

 цитата:
Как можно это сообщение сделать чтобы запускался AlertStop() вместо MsgStop() ?


Можно сделать таким образом:
#translate SET ALERT MULTIPLE <x:ON,OFF> [ <warning: WARNING> ] ; 
=> ;
_HMG_lMultiple := ( Upper(<(x)>) == "ON" ) ; iif ( _HMG_lMultiple == .F. .AND. _HMG_IsMultiple == .T. , ( iif ( <.warning.> , AlertStop( _HMG_MESSAGE\[4\] ) , ) , ExitProcess() ) , )


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2143
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 06.06.23 18:42. Заголовок: Andrey пишет: Как м..


Andrey пишет:

 цитата:
написать в группу Harbour что глючит последняя версия


Это бесполезно, поскольку компилятор BCC не является приоритетным для Харбора.
Таким рекомендуемым Си-компилятором является изначально бесплатный MinGW.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7403
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.06.23 22:19. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Можно сделать таким образом:


Не получается...
Всё равно выходит MsgStop() !
Можно другую команду придумать ?
Чтобы не делать всякие #translate
Типа такой или другой: SET ALERTMULTIPLE OFF WARNING

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4288
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.06.23 22:35. Заголовок: Andrey пишет Всё рав..


Andrey пишет
 цитата:
Всё равно выходит MsgStop() !


Создавай DlgFont и ВСЕГДА окно MAIN в режиме hide (Title можешь делать рабочий, потом переустанавливать)
будет работать AlertStop() и другие Alert... после этого можешь выходить или _SplashWindow() делать со считыванием
данных настроек и т.д. это если хочешь общаться. При повторных запусках (хоть закликайся мышкой) делаю выход из проги
без разговоров\сообщений
PS. Схема такая, например
 
LOCAL nStartPost := 0
...
IF OnlyOneInstance( cAppTitle ) // .T. - 2-ой запуск
nStartPost := 98
ENDIF
...
DEFINE WINDOW ... MAIN ... NOSHOW ... ;
ON INIT {|| DoEvents(), _wPost(nStartPost) } ;
...
o := This.Object
o:Event( 0, {|ow| _SplashWindow(ow, ...) })
...
o:Event(98, {|| AlertStop(...), _wSend(99) })
o:Event(99, {|ow| ow:Release() })
...



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4290
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.06.23 12:54. Заголовок: gfilatov2002 пишет М..


gfilatov2002 пишет
 цитата:
Можно сделать таким образом:
#translate SET ALERT MULTIPLE <x:ON,OFF> [ <warning: WARNING> ] ;
=> ;
_HMG_lMultiple := ( Upper(<(x)>) == "ON" ) ; iif ( _HMG_lMultiple == .F. .AND. _HMG_IsMultiple == .T. , ( iif ( <.warning.> , AlertStop( _HMG_MESSAGE\[4\] ) , ) , ExitProcess() ) , )


Зачем так сложно ?
Достаточно, что то такое
 
#translate SET EXIT MULTIPLE [ <warning: WARNING> ] ;
=> ;
_HMG_lMultiple := !Empty( _HMG_IsMultiple ) ; iif ( _HMG_lMultiple , ( iif ( <.warning.> , AlertStop( _HMG_MESSAGE\[4\] ) , ) , ExitProcess() ) , )

использовать для выхода второго запуска с сообщением
SET EXIT MULTIPLE WARNING
или для выхода без сообщения
SET EXIT MULTIPLE
или такую команду
#translate SET MULTIPLE QUIT [ <warning: WARNING> ] ;
...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2144
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.06.23 19:31. Заголовок: SergKis пишет: #tra..


SergKis пишет:

 цитата:
#translate SET MULTIPLE QUIT [ <warning: WARNING> ]


Благодарю за помощь!
Добавил эту команду в следующее обновление, но дата его выхода неизвестна.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7404
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.06.23 20:36. Заголовок: Возвращаюсь к вопрос..


Возвращаюсь к вопросу управления иконок в кнопке.
Можно ли как то иконку сдвигать влево, если текст расположен справа в кнопке ?
Большие иконки 96х96 просто двигают текст направо и он обрезается.
Можно ли как то повлиять на данную ситуацию.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2145
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 08.06.23 19:03. Заголовок: Andrey пишет: Можно..


Andrey пишет:

 цитата:
Можно ли как то повлиять на данную ситуацию


Можно, например, использовать другую кнопку HMGBUTTON (размер картинки 128х128), как показано ниже.



Вот полный текст этого примера:
Скрытый текст


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7405
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.06.23 21:46. Заголовок: Спасибо ! :sm36: Б..


Спасибо !
Буду пробовать.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4291
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.23 09:41. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшие добавки
 
CLASS TWNDDATA
...
ACCESS Enabled INLINE IsWindowEnabled ( ::nHandle )
ASSIGN Enabled( xVal ) INLINE iif( Empty( xVal ), DisableWindow ( ::nHandle ), EnableWindow ( ::nHandle ) )
METHOD Enabler( cName, xVal ) INLINE SetProperty( ::cName, cName, "Enabled", !Empty(xVal) )

...
*-----------------------------------------------------------------------------*
FUNCTION Do_Obj( nHandle, bBlock, p1, p2, p3 )
*-----------------------------------------------------------------------------*
LOCAL o

IF HB_ISCHAR( nHandle )
nHandle := GetFormHandle( nHandle )
ENDIF

IF hmg_IsWindowObject( nHandle )
o := hmg_GetWindowObject( nHandle )
IF ISBLOCK( bBlock )
IF o:IsWindow // set the environment This window
RETURN Do_WindowEventProcedure ( bBlock, o:Index, o, p1, p2, p3 )
ELSE // set the environment This control
RETURN Do_ControlEventProcedure( bBlock, o:Index, o, p1, p2, p3 )
ENDIF
ELSEIF bBlock != NIL // do not change the environment This
RETURN o:Event( bBlock, o, p1, p2, p3 ) // bBlock - execution key
ENDIF

ENDIF

RETURN o


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2146
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.06.23 11:51. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшие добавки


Принято

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4292
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.23 16:36. Заголовок: gfilatov2002 Предла..


gfilatov2002
Предлагаю добавить для dbf use shared и режима :lRowPosAtRec := .T. обновление первой записи на экране, т.к. при ее модификации (в потоке или др. пользователем) буфер RDD остается прежним, не соответствующим записи на диске, т.е.
 
CLASS TSBrowse FROM TControl
...
DATA lShared AS LOGICAL INIT .F. // dbf file opened shared at .T.

...
METHOD SetDbf( cAlias ) CLASS TSBrowse
...
IF "ADS" $ ::cDriver
...
ELSE
...
::lShared := ( cAlias )->( dbInfo( 36 ) ) // DBI_SHARED 36 /* the file opened shared ? */

ENDIF
...
METHOD Refresh( lPaint, lRecount, lClearHash ) CLASS TSBrowse
LOCAL nOldRec

...
::lNoPaint := .F.

IF ::lIsDbf .and. ::nLen > 0 .and. ::lShared .and. ::lRowPosAtRec .and. HB_ISARRAY( ::aRowPosAtRec )
IF Len( ::aRowPosAtRec ) > 0
nOldRec := ( ::cAlias )->( RecNo() )
( ::cAlias )->( dbGoto( ::aRowPosAtRec[ 1 ] ) )
IF nOldRec != ::aRowPosAtRec[ 1 ]
( ::cAlias )->( dbGoto( nOldRec ) )
ENDIF
ENDIF
ENDIF

RETURN ::Super:Refresh( lPaint )



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2147
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.06.23 17:52. Заголовок: SergKis пишет: доба..


SergKis пишет:

 цитата:
добавить для dbf use shared и режима :lRowPosAtRec := .T. обновление первой записи на экране


Принято с благодарностью
Сейчас готовлю 3-е обновление для сборки 23.04

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4293
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.06.23 16:40. Заголовок: gfilatov2002 Немног..


gfilatov2002
Немного изменить код выше с :lRowPosAtRec (для удобного использования)
 
CLASS TSBrowse FROM TControl
...
ACCESS nAtPos INLINE iif( ::lIsDbf, ( ::cAlias )->( RecNo() ), ::nAt )
ACCESS IsRowPosAtRec INLINE ( ::lIsDbf .AND. ::nLen > 0 .AND. ::lRowPosAtRec .AND. HB_ISARRAY( ::aRowPosAtRec ) .AND. Len( ::aRowPosAtRec ) > 0 )

...
METHOD Refresh( lPaint, lRecount, lClearHash ) CLASS TSBrowse
...
IF ::IsRowPosAtRec .and. ::lShared

nOldRec := ( ::cAlias )->( RecNo() )
( ::cAlias )->( dbGoto( ::aRowPosAtRec[ 1 ] ) )
IF nOldRec != ::aRowPosAtRec[ 1 ]
( ::cAlias )->( dbGoto( nOldRec ) )
ENDIF
ENDIF
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2148
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.06.23 17:15. Заголовок: SergKis пишет: Немн..


SergKis пишет:

 цитата:
Немного изменить код выше


Понял, добавил этот код

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4295
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.06.23 08:50. Заголовок: gfilatov2002 Был не..


gfilatov2002
Был не прав с :IsRowPosAtRec , работает и с массивом ( ::aRowPosAtRec[ xRow ] := ( nAt := ::nAtPos ) ), надо поправить
 
ACCESS IsRowPosAtRec INLINE ( ::lIsDbf .AND. ::nLen > 0 .AND. ::lRowPosAtRec .AND. HB_ISARRAY( ::aRowPosAtRec ) .AND. Len( ::aRowPosAtRec ) > 0 )
и
IF ::lIsDbf .and. ::lShared .and. ::IsRowPosAtRec

nOldRec := ( ::cAlias )->( RecNo() )
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2149
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.06.23 10:53. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо поправить


Поправил, конечно.
Благодарю за помощь

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2150
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.06.23 11:29. Заголовок: Выложил 3-е обновлен..


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

Скачать

Обновил также Unicode архив этой сборки для Сергея...

Ну вот и все

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4300
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.06.23 07:13. Заголовок: gfilatov2002 Возник..


gfilatov2002
Возникла путаница
Было
b := This.(cBtn).Action
...
This.(cBtn).Action := b

Теперь b := This.(cBtn).Action не работает, т.к. (i_this.ch) стало
#xtranslate This . <c> . <p:Refresh,SetFocus,DeleteAllItems,Release,Show,Save,Hide,Play,Stop,Close,Pause,Eject,OpenDialog,Resume,Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick,OnEnter,ColumnsAutoFit,ColumnsAutoFitH> [()] => DoMethod ( _HMG_THISFORMNAME, <(c)> , <"p"> )
...
#xtranslate This . <c> . <p:ReadOnly,DisableEdit,Options,Spacing,Speed,Volume,Zoom,Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick,OnEnter> := <n> => SetProperty ( _HMG_THISFORMNAME, <(c)> , <"p"> , <n> )
...
т.е.
This.(cBtn).Action := b
работает, как и
b := GetProperty(cWnd, cBtn, "Action")
...
SetProperty(cWnd, cBtn, "Action", b)

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2151
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.06.23 11:12. Заголовок: SergKis пишет: Возн..


SergKis пишет:

 цитата:
Возникла путаница


Поправил, прошу проверить результат ниже:
Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4301
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.06.23 11:51. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
прошу проверить


Проверил, с new i_this.ch ошибка компиляции на строке
This.(cBtn).Action := b

Пример тут https://TransFiles.ru/r516c
строки помечены (начало) //!!! new i_this.ch

PS. такое же как i_this.ch содержимое i_window.ch

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2152
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.06.23 12:05. Заголовок: SergKis пишет: с ne..


SergKis пишет:

 цитата:
с new i_this.ch ошибка компиляции на строке


Да, у меня такая же ошибка в этой строке.
Поэтому вернул старый i_this.ch обратно.

SergKis пишет:

 цитата:
такое же как i_this.ch содержимое i_window.ch


Именно так
Я снова проверил эти определения для свойства Action, и они все используют вызов функции DoMethod()
Поэтому для вашего случая надо использовать вызов

 цитата:
b := GetProperty(cWnd, cBtn, "Action")


как и сделано в вашем примере.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4302
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.06.23 12:18. Заголовок: gfilatov2002 тогда ..


gfilatov2002
тогда немного не логично в названиях, т.е. далее идут списком как события OnClick,On..., и к ним Domethod () подходит, а Action выпадает (для события OnAction название подходит).
#xtranslate This . <c> . <p:...,Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick,...
Может тогда сделать дополнительно
OnAction,Click,GotFocus,LostFocus,Change,DblClick => Get\SetProperty(...)
Получается установить можем
This.(cBtn).Action := b
а прочитать, в таком же синтаксисе, нет
b := This.(cBtn).Action

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2153
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.06.23 12:37. Заголовок: SergKis пишет: Полу..


SergKis пишет:

 цитата:
Получается установить можем
This.(cBtn).Action := b
а прочитать, в таком же синтаксисе, нет
b := This.(cBtn).Action


Согласен.
Но для Минигуи основным синтаксисом является Get\SetProperty(...)
Кстати, в официальной версии HMG вообще не существует определений свойства Action для синтаксиса This

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4303
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.06.23 12:51. Заголовок: gfilatov2002 пишет К..


gfilatov2002 пишет
 цитата:
Кстати, в официальной версии HMG вообще не существует определений свойства Action для синтаксиса This


Там много чего удобного нет, потому и не используем ее.
А товарищ пошел дальше и обвязал в MiniGui все _Define... объектами и пишет как в VO (привычка), а oHMG - слабоват был на 2011 г.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4304
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.06.23 16:07. Заголовок: gfilatov2002 Добави..


gfilatov2002
Добавил в i_this.ch
 
#xtranslate This . <c> . Event . <p:Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick,OnEnter> => GetProperty ( _HMG_THISFORMNAME, <(c)> , <"p"> )
#xtranslate This . <c> . Event . <p:Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick,OnEnter> := <n> => SetProperty ( _HMG_THISFORMNAME, <(c)> , <"p"> , <n> )
в примере
b := This.(cBtn).Event.Action
...
This.(cBtn).Action := b
или
This.(cBtn).Event.Action := b

работает

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2155
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.06.23 16:19. Заголовок: SergKis пишет: Доба..


SergKis пишет:

 цитата:
Добавил в i_this.ch


Продублировал у себя эти изменения
SergKis пишет:

 цитата:
работает


Благодарю за помощь

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2160
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.06.23 15:26. Заголовок: По ходу добавил прим..


По ходу добавил пример отображения строки с разным цветом букв (давно был запрос об этой возможности ).

Разноцветная строка рисуется по окну в событии ON PAINT:



Если есть интерес в таком примере - напишите...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4314
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.06.23 16:26. Заголовок: gfilatov2002 пишет Е..


gfilatov2002 пишет
 цитата:
Если есть интерес в таком примере - напишите...


Если бы окно было Transparent к нижним окнам, было бы super. Андрей бы точно с использовал и много раз.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4316
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.06.23 16:08. Заголовок: gfilatov2002 Почему..


gfilatov2002
Почему убрано ?
 
METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse
...
#if 0
ELSEIF nClickRow == -1 .AND. ! Empty( ::lDrawFooters ) // Added 19.05.2020

IF ::bLDblClick != NIL
Eval( ::bLDblClick, uPar1, uPar2, nKeyFlags, Self )
ENDIF
#endif

ELSEIF nClickRow == -2 .AND. ::lDrawSpecHd // SergKis 11.11.21
...

тогда :bLDblClick не работает для Footer

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2161
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 21.06.23 17:56. Заголовок: SergKis пишет: Поче..


SergKis пишет:

 цитата:
Почему убрано ?


Ваш ответ в посте №3211 от 19.05.20 10:57

 цитата:
Выяснил, наверно, почему не было Footers в
METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse
Если одновременно использовать с :LDblClick() :LButtonClick() или :RButtonClick(), то
при нажатии LDblClick делая левый или правый клик "ложно" срабатывает после них LDblClick
Это надо отметить для себя, что можно использовать или :LDblClick() или :LButtonClick(), :RButtonClick().



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4317
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.06.23 18:15. Заголовок: gfilatov2002 Спасиб..


gfilatov2002
Спасибо
Не использовал для Footer LDblClick, но просят, если не отпадет, то решу след. образом Скрытый текст

Это тест, что в oBrw:bLDblClick - не важно, отключен

 цитата:
можно использовать или :LDblClick() или :LButtonClick(), :RButtonClick().


Для Footers :LDblClick() не работает, отключена #if 0 ...
:LButtonClick(), :RButtonClick() не назначены (:lCellBrw := .T.)

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7438
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.06.23 18:49. Заголовок: Григорий, а почему п..


Григорий, а почему при ошибке в программе - заново срабатывает MYINITWIN$() ?
Он же не должен 2 раза вызываться.

Вот лог из моей программы:
 [_fFind] 2: Forms:  ARRAY[4] {"Form_Main", "Form_Table_Abon", "Form_TbrwFiltr", "Form_Find"}    
Вот здесь была ошибка!!!
********** Вызов из: MYINITWIN$(281) --> Source\main.prg
Free Open Source Software: Harbour 3.2.0dev (r2301151017)
Free Compiler: Embarcadero C++ 7.30 (32-bit)
Free Gui library: Harbour MiniGUI Extended Edition 23.01.0 (32-bit) ANSI
... далее показ самой ошибки
Error MGERROR/0 Window: Form_Seek is not defined. Program terminated.
Called from MSGMINIGUIERROR(0)
Called from GETPROPERTY(0)
Called from FORMA_FILTER(878) in module: Source\Tbrw_fFind.prg
Called from MYFINDEDIT(762) in module: Source\Tbrw_fFind.prg


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2162
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 21.06.23 19:26. Заголовок: Andrey пишет: почем..


Andrey пишет:

 цитата:
почему при ошибке в программе - заново срабатывает MYINITWIN$() ?


Точно не могу сказать, но, возможно, эта функция определена как INIT процедура.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4318
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.06.23 19:46. Заголовок: Andrey Сделай STAT..


Andrey
 
Сделай
STATIC lStaticMyInitWin := .F.

INIT PROCEDURE MyInitWin()
IF lStaticMyInitWin ; RETURN
ENDIF
lStaticMyInitWin := .T.
...

может поможет

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7439
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.06.23 23:11. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Точно не могу сказать, но, возможно, эта функция определена как INIT процедура.


Да, у меня в программе эта функция определена, как было вами сделано ещё в 2013 году !
Пример \SAMPLES\BASIC\SPLASHDEMO_3
А она разве должна при ошибке ещё раз вызываться ?
Я считал что инициализация переменных прошла и всё, больше это функция не вызывается.
У меня в этой функции стоит удаление лог-файла.
И получается, что при ошибке лог стирается.

SergKis пишет:

 цитата:
Сделай
STATIC lStaticMyInitWin := .F.


Спасибо !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7441
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.06.23 12:16. Заголовок: Григорий, что делать..


Григорий, что делать с MODAL окнами ?
У меня пропала очередность возврата этих окон.
Я писал об этом в другой теме.

И ещё обнаружил проблемы с этими окнами в другом месте программы.
На экране открыто MODAL окно (1), открываю по кнопке другое MODAL окно (2), видно построение этого окна,
а потом бац и оно пропадает с экрана. Закрываешь все окна программы, а оно (2) обнаруживается под всеми окнами.
Причём фокус на окна совсем пропадает, окно приходиться закрывать по Alt+F4, ну и будет сразу вылет, типа нет такого окна.
Как такое может быть и как исправить ?
До этого года всё отлично работало и юзера не жаловались !!!
Тестировал на BCC 5.5 и MiniGUI 22.12.2

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4319
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.06.23 12:27. Заголовок: Andrey Попробуй пос..


Andrey
Попробуй после
DEFINE WINDOW ... MODAL ...
сделать
This.Topmost := .T.
или
_ChangeWindowTopmostStyle ( This.Handle , .T. )
или
_ChangeWindowTopmostStyle ( GetFormHandle( This.Name ) , .T. )
каждому modal окну
Что будет ?
PS
Проверь, есть Topmost == .T. у окна на котором вызываешь modal, т.е.
DEFINE WINDOW ... TOPMOST ... ON INIT {|| This.Topmost := .F., ... }
на этом окне идет вызов DEFINE WINDOW ... MODAL ...
Есть выделенное цветом ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7442
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.06.23 12:44. Заголовок: Откатился до версии ..


Откатился до версии MiniGUI 21.11.1 - пропали эти проблемы !!!
Т.е. ошибка пошла с версии 21.12

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7443
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.06.23 13:21. Заголовок: SergKis пишет: Есть..


SergKis пишет:

 цитата:
Есть выделенное цветом ?


Сделал ! Помогло ! Спасибо !
Но это всё равно что окна прибить гвоздями...
Оно же по умолчанию MODAL

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4320
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.06.23 14:52. Заголовок: Andrey пишет Но это ..


Andrey пишет
 цитата:
Но это всё равно что окна прибить гвоздями...
Оно же по умолчанию MODAL



 цитата:
— Мы не будем полагаться на случай. Мы пойдем простым логическим путем.
— Пойдем вместе.


Так что, "Если не мы, то кто же ..."


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7444
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.06.23 15:14. Заголовок: У меня в проге было:..


У меня в проге было:
    DEFINE WINDOW Form_YACIMP                          ; 
....
MODAL NOSIZE /*NOSYSMENU*/ ;
ON INIT {|| This.Topmost := .T., aDimInit := InitYACIMP(nYear) ,;
.....

FUNCTION InitYACIMP(nYear,lCreateIndex)
....
WaitThreadCreateIcon( 'Поиск оплат абонента', )
DO EVENTS
...
WaitThreadCloseIcon() // kill the window waiting
DO EVENTS

DbSelectArea(nSel)

RETURN aRetDim

Функция WaitThreadCreateIcon( 'Поиск оплат абонента',) создаёт окно MODAL и назначает This.Topmost := .T.
В версии MiniGUI 21.11.1 - работало отлично, окно не пропадало и возврат вызова чепочки MODAL окон срабатывало как надо.
Ошибка пошла с версии 21.12, я в эти модули не лазил, юзера начали жаловаться...
Я перепроверил, собираешь с новой версии 21.12 и выше - ошибка, окно убегает, т.е. теряет Topmost := .T.
И что делать ? Приколачивать каждое окно, это не выход ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7445
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.06.23 15:20. Заголовок: Собираю с новой верс..


Собираю с новой версии BCC 7.30 вообще фигня получается...
    .... 
WaitThreadCloseIcon() // kill the window waiting
DO EVENTS

DbSelectArea(nSel)

Form_YACIMP.Topmost := .T. // добавил так !!!

RETURN aRetDim

Окно на переднем плане, но НЕТ возможности нажать на кнопки на форме !!!
Прога висит !
Нажатие Alt+F4 тоже не помогает...
Потыкаешь и прога сваливается с ошибкой...
Повторюсь - при сборке MiniGUI 21.11.1 - работает отлично !

P.S. убрал WaitThreadCreateIcon() - тогда всё заработало !!!
Функцию WaitThreadCreateIcon() вместе писали...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4321
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.06.23 15:39. Заголовок: Andrey Смотрю в Tsb..


Andrey
Смотрю в Tsb_DemoMdi WaitThreadCreateIcon( cTitle, cIndicator ), если у тебя такой же, то неточности есть:
- нет _HMG_InplaceParentHandle
- на передний план ставил бы сразу после
 
DEFINE WINDOW &cFormName ;
CLIENTAREA nMaxWidth, 104 ;
MODAL NOCAPTION ;
...
This.Topmost := .T.
...
- в ON INIT можно делать This.Topmost := .F. (что бы можно было на excel окно, или другое не твое, переключиться)

Так как нет _HMG_InplaceParentHandle, то после Release фокус идет на MAIN окно, а на передний план ты переводишь Form_YACIMP
В целом все объяснимо

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4322
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.06.23 15:42. Заголовок: Andrey пишет Функцию..


Andrey пишет
 цитата:
Функцию WaitThreadCreateIcon() вместе писали...


Тогда я говорил, что ЭТО плохая затея с потоками, т.к. надо использовать нормальное окно modal и внутри его исполнять, например, блок кода, для длит. операций и было бы значительно проще
 
FUNC Wait_Modal(..., bBlock )
LOCAL cForm := ...
...
_HMG_InplaceParentHandle := ThisWindow:Handle
...
DEFINE WINDOW ... MODAL ... ON INIT {|| This.Topmost := .F., This.TimerSetIcon.Enabled := .T., DoEvents(), _wPost(0) }
This.Topmost := .T.
...
DEFINE TIMER TimerSetIcon ... ACTION {|| SetProperty(cForm, "TimerSetIcon", "Enabled", .F.), ;
CheckTimerSetIcon(cForm), SetProperty(cForm, "TimerSetIcon", "Enabled", .T.) }
This.TimerSetIcon.Enabled := .F.
This.TimerSetIcon.Visible := .F.
...
(This.Object):Event( 0, bBlock )
...
END WINDOW
...
_HMG_InplaceParentHandle := 0
RETURN Nil
STATIC FUNC CheckTimerSetIcon( cForm )
...


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7446
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.06.23 22:14. Заголовок: Что-то в МиниГуи пош..


Что-то в МиниГуи пошло не так.
У меня 2 проекта, один полный (вес ехе-ника 26 Мб),
второй сокращённый для отладки модулей (вес ехе-ника 16 Мб).

Собираю оба проекта на:
Harbour 3.2.0dev (r2301231146)
Borland C++ 5.8.2 (32-bit)
Harbour MiniGUI Extended Edition 23.01.0 (32-bit) ANSI


Сокращённый проект собирается быстрей, да и удобней с ним отлаживать.
В обоих проектах есть меню (модальное окно с выбором 4 кнопки)
Сокращённый проект прекрасно работает с этими кнопками и выбор/возврат есть по этим кнопкам.

Если запускаю полный проект, то кнопки отрабатывают ТОЛЬКО один раз, а потом при возврате
на это окно - оно ТУПО ВЕШАЕТСЯ.... ни мышкой окно подвинуть, ни кнопки не доступны.
Срабатывает только клавиша ESC, потому что назначил эту клавишу сам.
Вопрос на засыпку, почему такое СТРАННОЕ поведение окна ?
Как это побороть ?


Окно обычное, без всяких наворотов.
Сделал назначение AlertInfo() по клавише F2 - то в полном проекте, ТОЖЕ СРАЗУ ВЕШАЕТ окно...

Вот такой простой код:
Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4323
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.06.23 05:55. Заголовок: Andrey Сделай так ..


Andrey
Сделай так
 
...
ON KEY F2 OF Form_NZ ACTION _wPost(87, ThisWindow.Name)
...
:Event( 87, {|ow| _HMG_InplaceParentHandle := This.Handle , HelpThisWindow(), ;
_HMG_InplaceParentHandle := 0 , DoEvents(), _wPost(90, ow) } )

Используемая AlertInfo() -> HMG_Alert() - MODAL окно и нет заданого _HMG_InplaceParentHandle

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4324
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.06.23 10:32. Заголовок: gfilatov2002 Может ..


gfilatov2002
Может добавить что такое для окна modal (_HMG_InplaceOwnerHandle - new variable)
 
#xtranslate SET WINDOW MODAL [ PARENT ] HANDLE <x:ON,OFF> => _HMG_InplaceOwnerHandle := ( Upper(<(x)>) == "ON" )

FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ;
...
IF ! Empty( _HMG_InplaceOwnerHandle )
_HMG_InplaceParentHandle := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() )
ENDIF

IF _HMG_InplaceParentHandle <> 0
Parent := _hmg_InplaceParentHandle
ELSEIF ! _HMG_BeginWindowMDIActive
Parent := _hmg_MainHandle
ENDIF
...
IF ! Empty( _HMG_InplaceOwnerHandle )
_HMG_InplaceParentHandle := 0
ENDIF

RETURN ( FormHandle )


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2163
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 24.06.23 12:44. Заголовок: SergKis пишет: для ..


SergKis пишет:

 цитата:
для окна modal (_HMG_InplaceOwnerHandle - new variable)


Сделаю, конечно.

Только хочу дать этой переменной имя _HMG_OwnerModalHandle

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7447
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.06.23 13:24. Заголовок: SergKis пишет: Сдел..


SergKis пишет:

 цитата:
Сделай так


Сделал. Не помогает.
Цепочка старта окон WINDOWTYPE STANDARD TOPMOST, затем MODAL 1, затем MODAL 2 и вот на нём виснет.
Хотя в других местах программы есть такое же и не виснет...

Убрал ВСЕ ресурсы из полного проекта, ехе-ник стал весить 10 Мб, проблема осталась.
Видно всё таки что-то в полном проекте - построение модулей типа как в SAMPLES\BASIC\SPLASHDEMO_3 ?
Или ограничение по коду в Харборе ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4325
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 11:18. Заголовок: gfilatov2002 Вроде ..


gfilatov2002
Вроде поймал ситуацию, которая возникает у Андрея.
Пример на базе SPLASHDEMO_3: https://TransFiles.ru/vz2sa
На кнопках входим в окно STANDARD с тсб, выбираем запись и входим в окно AlertInfo(...)
Не смотря на заданный _HMG_InplaceParentHandle при первом входе в окно по кнопке, выбора записи и выхода из AlertInfo(), окно с тсб убегает под окно MAIN. Окно STANDARD имеет родителя окно DeskTop. Повторные выборы записи и все ok! окно STANDARD на переднем плане, но закрыв его и снова жмем кнопку, та же картина, окно под main. Т.е. поведение окна STANDARD первый раз правильное, раз привязана к desktop, то на desktop и убежало (хоть и было поверх main), тогда надо дать возможность, как и у модал, привязывать родителя, может через тот же _HMG_InplaceParentHandle, сейчас стоит в _DefineWindow()
ParentHandle := iif( child == .T., _HMG_MainHandle, 0 )

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2164
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.06.23 11:54. Заголовок: SergKis Большое спа..


SergKis
Большое спасибо за Ваш пример
Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна.
      (This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) }) 

где вспомогательная функция определена в одну строку:
DECLARE DLL_TYPE_VOID SwitchToThisWindow( DLL_TYPE_LONG hWnd, DLL_TYPE_BOOL lRestore ) ; 
IN USER32.DLL


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4326
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 12:53. Заголовок: gfilatov2002 пишет Р..


gfilatov2002 пишет
 цитата:
Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна


Дело не в этом, а во внутренней работе hmg (ф-я events()), которая перемещает окно standard на desktop после первого вызова, т.е. убирает окно с переднего плана, окно должно оставаться как было на переднем плане или привязывать parentHandle к main например. Поднять окно после модального можно и To_Focus(...) можно
 
FUNCTION my_Modal( oWnd )
LOCAL nBrw, oBrw, cBrw, cAls, cWnd
LOCAL cMsg := ""
LOCAL o := oWnd:Cargo

cWnd := oWnd:Name
nBrw := o:nBrw
oBrw := o:oBrw
cBrw := o:cBrw
cAls := o:cAls

cMsg := hb_valtoexp({cWnd, nBrw, cBrw, cAls, oBrw:cControlName})

AlertInfo(cMsg, "INFO - "+cWnd)

To_Focus(cWnd, cBrw)

RETURN Nil

Последующие выборы строки (не выходя из STANDARD) работают не перемещая окно STANDARD после modal

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4327
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 13:32. Заголовок: PS Проявление ситуац..


PS
Проявление ситуации хорошо видно на следующем примере (добавил модальное окно на выбор записи с таблицей тсб). Выбор в этом окне и выход из окна AlertInfo() дает перенос окна STANDARD под main, т.е. с окна модального с таблицей улетели под main.
Пример https://TransFiles.ru/0s7wp

PS
Попробовал простое (для теста) в
 
FUNCTION _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, ;
...
//ParentHandle := iif( child == .T., _HMG_MainHandle, 0 )
ParentHandle := iif( child == .T., _HMG_MainHandle, _HMG_InplaceParentHandle )
...
и в примере в ф-ии (цветом)
STATIC FUNCTION my_Btn( nEvnt, cButt, oWnd )
LOCAL cBtn, cWnd, o, cForm, y, x

cWnd := oWnd:Name
cBtn := "ButtonEX_" + hb_ntos(nEvnt)
cForm := "w"+cBtn

IF cBtn != cButt
? ProcName(), "ERROR", cBtn, "!=", cButt
RETURN .F.
ENDIF

SET WINDOW THIS TO cWnd

o := This.(cBtn).Cargo
cAls := "CUST_"+hb_ntos(o:nBtn)
cTitle := cBtn+": "+hb_ntos(o:nBtn)+" "+o:cCap
y := o:nY - 100
x := o:nX + 50

_HMG_InplaceParentHandle := This.Handle

? ProcName(), nEvnt, cBtn, o:cBtn, o:nBtn, o:cCap, cForm, cTitle

my_Standard( cForm, o:nBtn, cTitle, o:aBClr, y, x, o:nW, o:nH, cAls )

_HMG_InplaceParentHandle := 0

SET WINDOW THIS TO

RETURN .T.

Окна не убегают под main, но при выходе из окна modal с тсб, окно STANDARD без фокуса (это все про первый вход с кнопки, потом все ok!)

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4328
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 14:39. Заголовок: Григорий Есть эффект..


Григорий
Есть эффект не оч. красивый, если в последнем примере, например кнопку "Sample 2" нажать, сделать выбор строки, попадаем на окно модал с таблицей, теперь, если кликнуть мышкой по заголовку окна STANDARD (пред. таблица), то будет мелькание окон и только потом звук с возвратом фокуса на тек. модальное окно

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4329
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 15:32. Заголовок: gfilatov2002 пишет Р..


gfilatov2002 пишет
 цитата:
Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна.
(This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) })


Тогда получается, что код в ф-ии Events(...), для окна modal, не работает
 
...
****************************************************************************
CASE WM_CLOSE
****************************************************************************
...
_hmg_OnHideFocusManagement ( i )
...
*-----------------------------------------------------------------------------*
PROCEDURE _hmg_OnHideFocusManagement ( i )
*-----------------------------------------------------------------------------*
...
* Modal

IF ( x := AScan ( _HMG_aFormHandles, _HMG_aFormParenthandle [ i ] ) ) > 0

IF _HMG_aFormType [ x ] == "M"

* Modal Parent

_HMG_IsModalActive := .T.
_HMG_ActiveModalHandle := _HMG_aFormParenthandle [ i ]

EnableWindow ( _HMG_aFormParenthandle [ i ] )

SetFocus ( _HMG_aFormParenthandle [ i ] )

ELSE
...

Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] )
SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 )

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2165
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.06.23 16:03. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] )
SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 )


Да, тоже подумываю об этом.
Благодарю за наводку

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2167
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.06.23 18:22. Заголовок: Добавил в ядро библи..


Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]).
По умолчанию значение lRestore = .T.
Теперь конструкции вида

 цитата:
IF IsIconic( hForm ) ; _Restore( hForm )
ENDIF

можно заменить на

 цитата:
SwitchToThisWindow( hForm )



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4330
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.06.23 09:52. Заголовок: gfilatov2002 Малень..


gfilatov2002
Маленькая добавка
 
METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel, aHeadSel ) CLASS TSBrowse
...
ATail( ::aColumns ):nFieldDec := aStru[ nE, 4 ] // 18.07.2018

IF aStru[ nE, 2 ] $ "=@T^+"
ATail( ::aColumns ):lEdit := .F.
ENDIF

IF HB_ISARRAY( aNameSel ) .AND. Len( aNameSel ) > 0 .AND. n <= Len( aNameSel )
...
для режима SET DELETED OFF
METHOD DeleteRow( lAll, lUpStable ) CLASS TSBrowse
...
::lHasChanged := .T.
::DrawSelect()


CASE ::lIsArr
...

Без этой строки надо
oBrw:bPostDel := {|ob| ob:DrawSelect() }
добавлять

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2168
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.06.23 10:38. Заголовок: SergKis пишет: Мале..


SergKis пишет:

 цитата:
Маленькая добавка


Принято

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7448
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.06.23 10:59. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]).


Когда обновление будет ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2169
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.06.23 11:02. Заголовок: Andrey пишет: Когда..


Andrey пишет:

 цитата:
Когда обновление будет ?


Послезавтра, в среду

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4331
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 01:55. Заголовок: gfilatov2002 Поймал..


gfilatov2002
Поймал ситуацию, как у Андрея. Не лечится To_Focus(), SwitchToThisWindow( hForm, 1 )
Пример https://TransFiles.ru/eudq8
После запуска, например, жмем "Sample 1", потом "Sample 2"
Снова жмем "Sample 1", что бы перевести окно STANDARD на передний план.
Не получается, окно приходит поверх main и опять прячется под него, т.е. мелькает
Так же ведет себя и кнопка "Sample 2" и остальные тоже.
Мышкой или Alt+TAB все работает
Ф-я my_Btn() находится в table.prg. Работает для всех кнопок окна standard.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2170
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.06.23 11:00. Заголовок: SergKis пишет: Пойм..


SergKis пишет:

 цитата:
Поймал ситуацию, как у Андрея.


Благодарю за пример!
SergKis пишет:

 цитата:
Мышкой или Alt+TAB все работает


Не понятен выбор окон типа STANDARD для внутренних окон приложения.
Окна STANDARD являются самостоятельными по отношению к главному окну.
Для внутренних окон, конечно, надо использовать окна CHILD.
Думаю, это решит проблему с иерархией окон в приложении.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4332
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 12:07. Заголовок: gfilatov2002 пишет Д..


gfilatov2002 пишет
 цитата:
Думаю, это решит проблему с иерархией окон в приложении.


У Андрея, я так понимаю, запускается ~5 окон STANDARD, которые получают фокус для работы пользователем по выбору в TaskBar, все работает на один раз открытые базы (наверно исторически так сложилось).

 цитата:
Окна STANDARD являются самостоятельными по отношению к главному окну


Это да, но это не значит, что Main окно, должно захватывать фокус. Немного подработал, почистил пример и сделал TABSTOP на кнопки main окна и стало видно, что повторно поднять окно standard кнопкой не получается, оно мелькает и фокус на main визуально, реально не понятно, т.к. (добавил в my_Standard() на входе)
 
IF _IsWindowDefined(cForm)
hW := GetFormHandle(cForm)
nI := GetFormNameByHandle( hW, @cVal )
? "*Form =", hW, nI, cVal
hW := GetFocus()
cVal := ""
nI := -1
IF hW <> 0
nI := GetFormNameByHandle( hW, @cVal )
ENDIF
? "*Focus=", hW, nI, cVal
To_Focus(cForm)
hW := GetFocus()
cVal := ""
nI := -1
IF hW <> 0
nI := GetFormNameByHandle( hW, @cVal )
ENDIF
? "#Focus=", hW, nI, cVal

IF select(cAls) > 0 ; dbSelectArea(cAls)
ENDIF
RETURN Nil
ENDIF
...
выдает следующее
*Form = 23594206 2 wButton_1
*Focus= 6030820 0 ''
Call from: TO_FOCUS(20) --> main_misc.prg wButton_1 23594206 NIL
#Focus= 45286518 0 ''
...

Если интересно, пример с правками тут https://TransFiles.ru/hjqmk

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4333
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 12:41. Заголовок: PS Заменил ссылку на..


PS
Заменил ссылку на пример, т.к. потерял bmp в ресурсах для индикации удаленных записей

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7449
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.06.23 12:51. Заголовок: Не понятен выбор око..


gfilatov2002 пишет:

 цитата:
Не понятен выбор окон типа STANDARD для внутренних окон приложения.
Окна STANDARD являются самостоятельными по отношению к главному окну.
Для внутренних окон, конечно, надо использовать окна CHILD.
Думаю, это решит проблему с иерархией окон в приложении.


Во многих приложениях есть главное окно, с которого юзер запускает нужные ему окна для работы.
У меня юзер запускает STANDARD окна с заявками, договорами, абонентами и т.д.
Заставить юзера работать только с одним окном это не по современному, пускай что хочет, то и делает.
STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться.
Пример SAMPLES\Advanced\Tsb_5Win тоже такой же, и я думаю его так же можно поломать - поставив окно ожидания с прелодером и вызовом нескольких MODAL окон.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4334
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 12:55. Заголовок: gfilatov2002 Есть е..


gfilatov2002
Есть еще интересное поведение modal окон.
Запускаем "Sample 1", "Sample 2"
Поднимаем фокус на "Sample 1" (оба окна Sample над main)
Жмем Enter на "Sample 1" -> попадаем на окно modal, кусочек окна "Sample 2" виден
Жмем мышкой на видимый заголовок окна "Sample 2"
Активируется окно "Sample 1" как будто на нем нажали Enter несколько раз -> попадаем на окно modal AlertInfo()


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4335
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 13:06. Заголовок: Andrey пишет STANDAR..


Andrey пишет
 цитата:
STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться.


Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2), т.е.
0. main 0 // main окно с кнопками запуска в потоке пунктов ниже
1. main 1 // main окно заменяющее окно STANDARD 1
...
5. main 5 // main окно заменяющее окно STANDARD 5
программа бы сильно упростилась, по мне

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7450
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.06.23 13:19. Заголовок: SergKis пишет: Ты п..


SergKis пишет:

 цитата:
Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2),


Нужно тогда менять иконку и титул окна задачи.
Время запуска и открытия баз при запуске нового ехе-ника намного БОЛЬШЕ чем создание STANDART окна, базы все уже открыты.
А так юзер будет нервничать, при каждом запуске ругаясь на "тормозную" программу.
Уже такое видел и не раз.

И логику программирования свою менять.
Это можно, но уже в новых проектах.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4336
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 13:40. Заголовок: Andrey пишет А так ю..


Andrey пишет
 цитата:
А так юзер будет нервничать, при каждом запуске ругаясь на "тормозную" программу


Все в твоих руках.
Можно без потоков запустить все 5 окон под splash в hide и все - переключай фокус между приложениями с главной
main или после splash, из памяти убирай когда выходят из главной main, а так делай по X hide. Время на запуск будет тоже


 цитата:
И логику программирования свою менять.
Это можно, но уже в новых проектах.


У тебя уже все есть в твоем модуле (ты его один и запускай с разными параметрами с главного main). С окнами Standard, думаю, провозишься дольше. Вместо STANDARD у тебя будут MAIN окна и разный запуск

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2171
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.06.23 10:03. Заголовок: Всем кому это интересно...


Выложил 4-е обновление сборки 23.04 с учетом последних исправлений и дополнений

Скачать

Обновил также Unicode архив этой сборки для Сергея

Желаю всем хорошего дня

Спасибо: 0 
Профиль
i3t4j6



Пост N: 145
Зарегистрирован: 12.06.06
ссылка на сообщение  Отправлено: 30.06.23 12:04. Заголовок: Появилась необходимо..


Появилась необходимость в TsBrowse написать oBrw:cMsg:= ' ↓ -добавить F10 -выход '.
Так вот - "стрелка вниз" - не отображается, как и chr(25) . Это как-то можно победить?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4340
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.06.23 17:14. Заголовок: i3t4j6 Сделайте, чт..


i3t4j6
Сделайте, что то такое
 
1. oBrw:cMsg:= ' <Dn> - добавить F10 -выход '
2. oBrw:cMsg := {|ob,nc| my_cMsg(ob, nc) }
FUNC my_cMsg( oBrw, nCol)
LOCAL cMsg := "", oWnd
LOCAL cImg := "Dn" // image в ресурсах
SET WINDOW THIS TO oBrw
oWnd := This.Object
IF nCol == ...
cMsg := "..."
cImg := "..."
ELSE
cMsg := "- добавить F10 -выход "
cImg := "Dn"
ENDIF
//oWnd:StatusBar:Say(cMsg, 1)
oWnd:StatusBar:Icon(cImg, 1)
SET WINDOW THIS TO
RETURN cMsg

Это схема
PS
Если колонки не обрабатывать, то
oBrw:cMsg := {|ob| SetProperty(ob:cParentWnd, "StatusBar", "Icon", 1, "Dn"), "- добавить F10 -выход " }

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7456
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.07.23 00:50. Заголовок: А есть функция в Мин..


А есть функция в МиниГуи, которая возвращает фокус текущей формы в программе ?
И фокус объекта на этой текущей форме ?
А то делаю так:
         Local aFocu := { ThisWindow.Name, This.FocusedControl } // текущее окно и фокус в окне 
......
To_Focus(aFocu[1], aFocu[2]) // восстановим текущее окно и фокус в окне
Return Nil
}

и получаю вылет из программы с такой ошибкой:
Error BASE/1081  Неверный аргумент: + 
Args:
[1] = C Window:
[2] = U
Called from GETPROPERTY(0)
Called from (b)SHOW_SITE(227) in module: Source\form_site.prg
Called from EVENTS(0)
Called from MYEVENTSHANDLER(1833) in module: Source\main.prg
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(0)

Причём тут + ? вообще непонятно...

Спасибо: 0 
Профиль
i3t4j6



Пост N: 146
Зарегистрирован: 12.06.06
ссылка на сообщение  Отправлено: 03.07.23 07:38. Заголовок: SergKis пишет: Если..


SergKis пишет:

 цитата:
Если колонки не обрабатывать, то


Я скорее всего привел неудачный пример. Вот другой :
DEFINE TBROWSE oBrw AT 0,0 OF Form_3 celled ALIAS cFile ;
WIDTH 1008 HEIGHT 612 SIZE 9 ;
MESSAGE ' ↓ -добавить F10 -выход '.
"Стрелка вниз" - не отображается !??

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4343
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.07.23 08:23. Заголовок: 3t4j6 пишет "Стр..


3t4j6 пишет
 цитата:
"Стрелка вниз" - не отображается !??


И не будет, в ToolTip так же не отобразится (код < 32). Надо менять на картинку. Подберите вариант стрелки вниз и делайте как написал выше. Слева будет картинка "Стрелка вниз", потом текст ' -добавить F10 -выход '. Возможно блок кода будет чуть сложнее, т.к. картинку и текст, по мне, надо отображать когда в фокусе тсб будет последняя строка LastRec(), для TsBrowse - это ob:nLen.
Что бы не связываться с MESSAGE TsBrowse, можно в StatusBar сделать все варианты режимов работы с записью, т.е. разбить StatusBar на Item-ы (самый левый не занимать) в которых вывести с картинками, например так:
<для Message тсб или свои> |<картинка> Добавить |<картинка> Удалить |<картинка> Edit | ... | <картинка> Выход | ...
можно установить для каждого Item StatusBar FontColor и BackColor + назначить блок кода ACTION {|| ... } по клику по Item он сработает и выполнит соответствующий блок\режим. + эти режимы продублировать на клавиши Ins, Del, F4 или Enter ... Получите аналог кнопок в StatusBar. Каждому StatusBar Item можно задать ToolTip, где написать текст-расшифровку, он будет высвечиваться при наведении мыши на каждый Item, где задан, т.е. навели на Item "Выход", получили типа "Нажмите кл. F10 или Esc для завершения работы"

Спасибо: 0 
Профиль
i3t4j6



Пост N: 147
Зарегистрирован: 12.06.06
ссылка на сообщение  Отправлено: 03.07.23 12:42. Заголовок: Спасибо !!!..


Спасибо !!!

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7488
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.07.23 08:34. Заголовок: Есть пример SAMPLES&..


Есть пример SAMPLES\BASIC\Icons
Если хочу добавить общую иконку для проги так:
demo.res 
1_MAIN ICON 1Mg.ico
IconVista ICON IconVista.ico

То ехе-ник не собирается, выдаёт ошибку:
Borland Resource Compiler  Version 5.40 
Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved.
Error demo.rc 2 40: Allocate failed
Resource compile error.

Почему ? Что не хватает для BCC 5.8 ?

И не собирается \BASIC\Icons\MyIcons\build.bat
myicons.c: 
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
или
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland

Error: Unresolved external '_hb_dynsymToNum' referenced from C:\MINIGUI-23.04.4\HARBOUR\LIB\HBWIN.LIB|hbolesrv
Error: Unresolved external '_hb_dynsymFromNum' referenced from C:\MINIGUI-23.04.4\HARBOUR\LIB\HBWIN.LIB|hbolesrv
Error: Unresolved external '_hb_errRT_New' referenced from C:\MINIGUI-23.04.4\HARBOUR\LIB\HBWIN.LIB|hbolesrv
Error: Unresolved external '_hb_pcount' referenced from C:\MINIGUI-23.04.4\HARBOUR\LIB\HBWIN.LIB|hbolesrv
Error: Unresolved external '_hb_arrayBaseParams' referenced from C:\MINIGUI-23.04.4\HARBOUR\LIB\HBWIN.LIB|hbolesrv
Error: Unresolved external '_hb_errPutArgsArray' referenced from C:\MINIGUI-23.04.4\HARBOUR\LIB\HBWIN.LIB|hbolesrv
..... и далее куча сообщений


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2177
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 31.07.23 10:26. Заголовок: Ну вот и все! Вылож..


Ну вот и все!

Выложил июльскую сборку 23.07 с учетом последних исправлений и дополнений

скачать

После 18-ти лет активной разработки этот проект подошел для меня к концу по понятным причинам.

В заключение хотел бы отметить важные этапы в истории Минигуи:

- прекрасный старт на основе кода автора библиотеки Роберто Лопеза;
- обеспечена совместимость кода со всеми бесплатными Си-компиляторами: MinGW, MS VC, Pelles C, Open Watcom;
- поддержка 64-битной архитектуры;
- поддержка Unicode;
- адаптация FiveWin класса TSBrowse (автор - Мануэл Меркадо);
- HMGS-IDE Project Manager and Two-Way Visual Form Designer (автор - Уолтер Формигони);
- улучшенные версии библиотек Харбора (hbsqldd, hbziparc, hbmysql, hbpqsql, hbsqlite3, hbcrypto);
- множество примеров использования (от самых простых и до готовых приложений).

Большое спасибо всем форумчанам за интерес и поддержку библиотеки

Желаю всем удачи!

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1945
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 31.07.23 11:19. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Большое спасибо всем форумчанам за интерес и поддержку библиотеки

Желаю всем удачи!


Григорий, спасибо за Ваш многолетний труд и поддержку проекта

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4359
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.07.23 11:23. Заголовок: gfilatov2002 СПАСИБ..


gfilatov2002
СПАСИБО

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7493
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.07.23 12:02. Заголовок: gfilatov2002 Спасиб..


gfilatov2002
Спасибо ОГРОМНОЕ за ваш проект и вашу помощь !

P.S. Зря не добавили пример - Tsb_array_image, в нём все варианты чтения и показа картинок в ТСБ.
И в качестве добавки - сборка своих DLL с ресурсами через BCC.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2178
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 31.07.23 16:53. Заголовок: Andrey пишет: Зря ..


Andrey пишет:

 цитата:
Зря не добавили пример - Tsb_array_image


Мне тоже понравился этот пример, но не хотелось значительно увеличивать размер дистрибутива за счет большого количества картинок. К тому же, к этому времени уже был готов финальный инсталлятор этой сборки.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4360
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.08.23 11:30. Заголовок: gfilatov2002 пишет у..


gfilatov2002 пишет
 цитата:
уже был готов финальный инсталлятор этой сборки


Unicode версия есть ?
Если есть, можно получить ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2179
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 01.08.23 14:47. Заголовок: SergKis пишет: Unic..


SergKis пишет:

 цитата:
Unicode версия есть ?


Уже есть.
Выложил ее по старому адресу, как обычно

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4363
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.08.23 16:13. Заголовок: gfilatov2002 Спасиб..


gfilatov2002
Спасибо !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7496
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.08.23 22:35. Заголовок: Григорий, я высылал ..


Григорий, я высылал тебе для ErrorSys.prg новую секцию для анализа ошибок:
---------------------------- List of open windows -----------------------------
Удобная штука, сразу видно сколько окон в программе открыто.
Жалко что туда нельзя прикрутить в каком окне произошла ошибка.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4370
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.08.23 20:02. Заголовок: gfilatov2002 пишет Н..


gfilatov2002 пишет
 цитата:
На следующей неделе выложу обновление


Добавки небольшие
 
METHOD Set( xKey, xVal ) CLASS THmgData
...
IF HB_ISHASH( xKey )
...
ELSEIF HB_ISARRAY( xKey ) .and. HB_ISARRAY( xVal )
FOR EACH k, v IN xKey, xVal
Default k := hb_enumIndex( k )
hb_HSet( ::aKey, ::Upp( k ), v )
NEXT
ELSEIF HB_ISARRAY( xKey )
FOR EACH v IN xKey
IF HB_ISARRAY( v ) .and. Len( v ) > 1
hb_HSet( ::aKey, ::Upp( v[1] ), v[2] )
ENDIF
NEXT

ELSE
hb_HSet( ::aKey, ::Upp( xKey ), xVal )
ENDIF
...
// Допустил неточность в названии переменной ( oParam:bDblClick вместо oParam:bLDblClick) и уже использовал, думаю надо поправить
...
FUNCTION _TBrowse( oParam, uAlias, cBrw, nY, nX, nW, nH )
...
IF HB_ISBLOCK( oParam:bBody ) ; EVal( oParam:bBody, oBrw, oParam ) // 2. call your customization functions
ENDIF

IF HB_ISLOGICAL( oParam:bLDblClick ) .or. HB_ISLOGICAL( oParam:bDblClick )
:bLDblClick := {|p1, p2, p3, ob| p1:=p2:=p3, ob:PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) }
ELSEIF HB_ISBLOCK( oParam:bLDblClick ) // :bLDblClick := {|p1,p2,p3,ob| ... }
:bLDblClick := oParam:bLDblClick
ELSEIF HB_ISBLOCK( oParam:bDblClick ) // :bLDblClick := {|p1,p2,p3,ob| ... }
:bLDblClick := oParam:bDblClick
ENDIF

IF HB_ISBLOCK( oParam:bRClicked )
:bRClicked := oParam:bRClicked // :bRClicked := {|p1,p2,p3,ob| ... }
ENDIF
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2184
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.08.23 21:13. Заголовок: SergKis пишет: Доба..


SergKis пишет:

 цитата:
Добавки небольшие


OK

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4371
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.08.23 11:09. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение
 
FUNCTION Events ( hWnd, nMsg, wParam, lParam )
...
****************************************************************************
CASE WM_TIMER
****************************************************************************

i := AScan ( _HMG_aControlIds , wParam )

IF i > 0

#ifdef _NAMES_LIST_
x := _SetGetNamesList( "bWM_TIMER" )
IF HB_ISBLOCK( x )
IF !Empty( Eval( x, _HMG_aControlNames [ i ], GetParentFormName( i ), i ) )
EXIT // return 1 => everything is done
ENDIF
ENDIF
#endif

IF _HMG_aControlPicture [ i ] == .T. // Once
...
****************************************************************************
CASE WM_COPYDATA
****************************************************************************

#ifdef _NAMES_LIST_
x := _SetGetNamesList( "bWM_COPYDATA" )
IF HB_ISBLOCK( x )
Eval( x, hWnd, nMsg, wParam, lParam )
ENDIF
#endif
EXIT

****************************************************************************
CASE WM_QUERYENDSESSION
CASE WM_POWERBROADCAST

****************************************************************************
i := 0
#ifdef _NAMES_LIST_
x := _SetGetNamesList( "bWM_PowerEndSession" )
IF HB_ISBLOCK( x )
i := Eval( x, hWnd, nMsg, wParam, lParam )
ENDIF
#endif
IF Empty( i )
__Quit()
ENDIF

EXIT

****************************************************************************
CASE WM_CLOSE
****************************************************************************
...
или WM_POWERBROADCAST отделить от WM_QUERYENDSESSION, т.е.
...
****************************************************************************
CASE WM_QUERYENDSESSION
****************************************************************************

__Quit()
EXIT

****************************************************************************
CASE WM_POWERBROADCAST
****************************************************************************
#ifdef _NAMES_LIST_
x := _SetGetNamesList( "bWM_POWERBROADCAST" )
IF HB_ISBLOCK( x )
i := Eval( x, hWnd, nMsg, wParam, lParam )
ENDIF
#endif
EXIT

...

PS
Для разных таймеов можно делать один обработчик, назначив _SetGetNamesList( "bWM_TIMER", bBlock ) без исп. This среды, например для запуска выполнения в потоке
DEFINE TIMER <name> INTERVAL <interval>

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2185
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.08.23 13:27. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение


Это предложение мне очень нравится, но оно вносит в систему новые недокументированные глобальные статические переменные, знание имен которых будет требоваться от разработчика. Поэтому пока я отказался от этого дополнения в пользу универсального обработчика, который легко заменить на собственный менеджер событий по команде SET EVENTS FUNC TO <имя функции>
Поскольку новая сборка уже собрана, буду рассматривать это предложение как задел на будущее...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4372
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.08.23 23:01. Заголовок: gfilatov2002 пишет б..


gfilatov2002 пишет
 цитата:
буду рассматривать это предложение как задел на будущее...


Вариант работы с сообщениями, как пример:
 
STATIC s_oWM_Names, s_oWM_Events
MEMWAR p_oWM_Message
...
PUBLIC p_oWM_Message
...
s_oWM_Names := oHmgData()
s_oWM_Names:Set( { ;
{WM_MBUTTONDOWN , "WM_MBUTTONDOWN "}, ;
{WM_RBUTTONDOWN , "WM_RBUTTONDOWN "}, ;
{WM_LBUTTONDOWN , "WM_LBUTTONDOWN "}, ;
{WM_MOUSEMOVE , "WM_MOUSEMOVE "}, ;
{WM_MOVE , "WM_MOVE "}, ;
{WM_HOTKEY , "WM_HOTKEY "}, ;
{WM_KEYDOWN , "WM_KEYDOWN "}, ;
{WM_KEYUP , "WM_KEYUP "}, ;
{WM_MOUSEWHEEL , "WM_MOUSEWHEEL "}, ;
{WM_INITMENUPOPUP , "WM_INITMENUPOPUP "}, ;
{WM_UNINITMENUPOPUP, "WM_UNINITMENUPOPUP"}, ;
{WM_SETFOCUS , "WM_SETFOCUS "}, ;
{WM_HELP , "WM_HELP "}, ;
{WM_HSCROLL , "WM_HSCROLL "}, ;
{WM_VSCROLL , "WM_VSCROLL "}, ;
{WM_TASKBAR , "WM_TASKBAR "}, ;
{WM_WND_LAUNCH , "WM_WND_LAUNCH "}, ;
{WM_CTL_LAUNCH , "WM_CTL_LAUNCH "}, ;
{WM_NEXTDLGCTL , "WM_NEXTDLGCTL "}, ;
{WM_DROPFILES , "WM_DROPFILES "}, ;
{WM_CONTEXTMENU , "WM_CONTEXTMENU "}, ;
{WM_SIZE , "WM_SIZE "}, ;
{WM_COMMAND , "WM_COMMAND "}, ;
{WM_NOTIFY , "WM_NOTIFY "}} )

s_oWM_Events := oHmgData()
FOR EACH nMsg IN s_oWM_Message:Keys()
s_oWM_Events:Set( nMsg, NIL ) // или блок кода для исполнения можно заносить на ключ nMsg, потом читать для выполнения
NEXT

p_oWM_Message := oHmgData()
p_oWM_Message:oNames := s_oWM_Names
p_oWM_Message:oEvents := s_oWM_Events
...
добываем
...
o := p_oWM_Message:oNames
cMsg := "Event arrived - " + o:Get(nMsg, "?")
? HB_TSTOSTR( HB_DATETIME() ), cMsg, ProcNL()
...
o := p_oWM_Message:oEvents
IF HB_ISBLOCK( o:Get(nMsg, Nil) )
x := Eval( o:Get(nMsg), hWnd, nMsg, wParam, lParam )
IF !Empty( x )
RETURN 1
ENDIF
ENDIF
...

Можно подумать и убрать из prg в ресурсы языковые тексты. Например в формат ini,
т.е. имеем в RESOURCE ini файлы, например, в utf8 с BOM
en.ini
ru.ini
cs.ini
...
в rc файле имеем
EN RCDATA en.ini
RU RCDATA ru.ini
CS RCDATA cs.ini
...
Пример Ini варианта для переменных _HMG_... как секции для языков EN и RU тут https://TransFiles.ru/icjjs

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2186
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.08.23 10:04. Заголовок: SergKis пишет: Вари..


SergKis пишет:

 цитата:
Вариант работы с сообщениями, как пример


Спасибо!

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2187
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.08.23 10:09. Заголовок: Выложил последнюю сб..


Выложил последнюю сборку 23.09 с учетом последних исправлений

Скачать

Желаю всем форумчанам доброго здоровья!

Мира вам, добра и процветания

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7526
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.08.23 09:24. Заголовок: Собрал на новой верс..


Собрал на новой версии свою большую систему.
: Harbour 3.2.0dev (r2307062207)    
: Borland C++ 5.8.2 (32-bit)
: Harbour MiniGUI Extended Edition 23.09.0 (32-bit) ANSI

Работает, у меня Win10
У заказчика в Николаеве тоже Win10, вылетает на ВСЕХ таблицах...
Вот такая ошибка:
Error BASE/1001  Неизвестная функция: EVENTS 
Args:
[1] = N 67202
[2] = N 129
[3] = N 0
[4] = N 1695368
Called from EVENTS(0)
Called from _CREATEWINDOWEX(0)
Called from TSBROWSE:CREATE(0)
Called from TSBROWSE:NEW(0)
Called from _DEFINETBROWSE(0)
Called from FORM_MYTABLE(324) in module: Source\Tbrw_table.prg
Called from TBRWDOGOVOR(16) in module: Source\Tbrw_1Run.prg
Called from (b)HB_MACROBLOCK(0)

Почему так ?

У меня в коде так:
 
SET EVENTS FUNCTION TO MyEventsHandler
DEFINE WINDOW Form_Main ;
....
// этот обработчик вызывается всегда вместо Events(...)
FUNCTION MyEventsHandler( hHwnd, nMsg, wParam, lParam )
...
RETURN Events( hHwnd, nMsg, wParam, lParam)


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7798
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.08.23 15:06. Заголовок: Andrey У тебя с 201..


Andrey
У тебя с 2019 года глюки какие то с MyEventsHandler и Пётр писал тебе что нужно сделать.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7527
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.08.23 16:28. Заголовок: Dima пишет: У тебя ..


Dima пишет:

 цитата:
У тебя с 2019 года глюки какие то с MyEventsHandler и Пётр писал тебе что нужно сделать.


Что-то по форуму поискал и не нашёл это сообщение.
Покажи пожалуйста его.

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7799
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.08.23 18:35. Заголовок: Тема http://clipper...

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7528
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.08.23 20:54. Заголовок: Dima пишет: сообщен..


Dima пишет:

 цитата:
сообщение 1318



Петр пишет:

 цитата:

Напишите корректный обработчик MYEVENTS, не перехватывайте ненужные события,
перенаправьте их стандартному обработчику HMG (если, что Events() называется).
Опять задание для телепатов.



Дима - ошибка в другом:
Error BASE/1001  Неизвестная функция: EVENTS  
Args:
[1] = N 67202
[2] = N 129
[3] = N 0
[4] = N 1695368
Called from EVENTS(0)
Called from _CREATEWINDOWEX(0)

Обработчик нормальный !!! У меня работает, у заказчика НЕТ !
3 раза перепроверил только что - Версия 23.07 работает, а 23.09 вылетает

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4373
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.08.23 21:12. Заголовок: Andrey Когда то дав..


Andrey
Когда то давно предлагал вариант, который у меня в версии от 2012 года, попробуй сейчас у себя
Добавка в h_events.prg
 
STATIC s_bEvents

*-----------------------------------------------------------------------------*
FUNCTION Set_bEvents ( bBlock )
*-----------------------------------------------------------------------------*
LOCAL b := s_bEvents

IF HB_ISCHAR( bBlock )
IF "(" $ bBlock
bBlock := "{|...| " + bBlock + " }"
ELSE
bBlock := "{|...| " + bBlock + "(...)" + " }"
ENDIF
bBlock := &( bBlock )
ENDIF

s_bEvents := bBlock

RETURN b

*-----------------------------------------------------------------------------*
FUNCTION Events ( hWnd, nMsg, wParam, lParam )
*-----------------------------------------------------------------------------*
...
#endif

IF HB_ISBLOCK( s_bEvents )
IF !Empty( Eval( s_bEvents, hWnd, nMsg, wParam, lParam ) )
RETURN 1
ENDIF
ENDIF

SWITCH nMsg
****************************************************************************
CASE WM_MEASUREITEM
****************************************************************************
...
В программе делаешь
//SET EVENTS FUNC TO App_OnEvents // или MyEventsHandler
Set_bEvents("App_OnEvents") // Set_bEvents("MyEventsHandler")
...
FUNCTION App_OnEvents( hWnd, nMsg, wParam, lParam ) // или MyEventsHandler( hWnd, nMsg, wParam, lParam )
...
wParam := lParam // что бы компилятор не ругался, если не используются

RETURN 0 // Events( hWnd, nMsg, wParam, lParam) // nMsg НЕ выполненно


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7800
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.08.23 21:13. Заголовок: Andrey пишет: 3 раз..


Andrey пишет:

 цитата:
3 раза перепроверил только что - Версия 23.07 работает, а 23.09 вылетает


Вероятно Григорий где то не тот код написал.........
Так бывает..

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7529
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.08.23 10:17. Заголовок: Проверил у другого з..


Проверил у другого заказчика. У него Win7 Core i3 4Gb ОЗУ
Пару раз слетало за день вот примерно с такой ошибкой.
Time from start: 0 days 0 hours 2 mins 0 secs 
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 262796 [2] = N 129 [3] = N 0 [4] = N 1240660
--------------------------------- Stack Trace ---------------------------------
Called from EVENTS(0)
Called from _CREATEWINDOWEX(0)
Called from TSBROWSE:CREATE(0)
Called from TSBROWSE:NEW(0)
Called from _DEFINETBROWSE(0)
Called from WINFORM3(48) in module: Source\mWinForm3.prg
Called from START3WIN(57) in module: Source\mWin3Start.prg


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7804
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 31.08.23 19:41. Заголовок: Andrey а что если с..


Andrey
а что если сделать не большой примерчик , ну там окно , меню и твой MyEventsHandler
тоже будет падать ?

ps
такой пример могу затестить у себя , у меня win7

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7530
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.09.23 13:59. Заголовок: Dima пишет: а что е..


Dima пишет:

 цитата:
а что если сделать не большой примерчик , ну там окно , меню и твой MyEventsHandler
тоже будет падать ?


Не выйдет !
Короткие примеры работают ОЧЕНЬ четко, никогда не валятся.
А вот когда ехе-ник большой (у меня 25 Мб) и юзер целый день сидит в программе, то начинаются чудеса.
Вот на сервере терминалов прога вчера повисла и сутки висела, почему не знаю.
Прога висит (выполняется, таймер каждые 5 минут в лог пишет), а на менюшках тыкать бесполезно.
И юзер не может прогу снять, так как это сервер-терминалов, помогает только заход на сервер и снятие программы юзера на сервере.
Т.е. в проге опять ОКНО ушло с фокуса и из-за этого прога ВИСИТ, хотя и работает.
Уходит окно скорее всего из-за таймера, у меня в проге 3 таймера.
Смотрю лог файл, там срабатывает таймер и всё, больше нет ничего, т.е. уход на таймер и окно проги потеряно.
Как от этого избавиться - хз
Самый длительный вариант избавления - выкинуть эту функцию по таймеру в отдельную программу,
но это столько переписывать нужно..... работа на месяц...

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7533
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.09.23 15:30. Заголовок: Прога на новом МиниГ..


Прога на новом МиниГуи 23.09 на отличном сервере WinServer 2008 16Гб озу - СТАБИЛЬНО ПАДАЕТ раза
два за день в одном и том же месте программы....
То работает, то падает...
Date: 29.08.2023 Time: 17:05:43 
Time from start: 0 days 0 hours 20 mins 3 secs
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 5048360 [2] = N 129 [3] = N 0 [4] = N 1630660

Date: 29.08.2023 Time: 14:01:00
Time from start: 0 days 0 hours 17 mins 43 secs
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 7406422 [2] = N 129 [3] = N 0 [4] = N 1630660

Date: 30.08.2023 Time: 09:23:19
Time from start: 0 days 0 hours 20 mins 13 secs
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 1836998 [2] = N 129 [3] = N 0 [4] = N 1630660

Date: 31.08.2023 Time: 16:01:08
Time from start: 0 days 7 hours 11 mins 6 secs
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 5703460 [2] = N 129 [3] = N 0 [4] = N 1630660

--------------------------------- Stack Trace ---------------------------------
Called from EVENTS(0)
Called from _CREATEWINDOWEX(0)
Called from TSBROWSE:CREATE(0)
Called from TSBROWSE:NEW(0)
Called from _DEFINETBROWSE(0)
Called from FORM_MYTABLE(324) in module: Source\Tbrw_table.prg
Called from TBRWZAIVKA(116) in module: Source\Tbrw_1Run.prg
Called from (b)HB_MACROBLOCK(0)

Почему ?

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7806
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.09.23 19:37. Заголовок: Andrey А если заком..


Andrey
А если закоментить строку и пересобрать , тоже упадет ?
SET EVENTS FUNCTION TO MyEventsHandler

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4376
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.09.23 20:21. Заголовок: Andrey пишет Самый д..


Andrey пишет
 цитата:
Самый длительный вариант избавления - выкинуть эту функцию по таймеру в отдельную программу,
но это столько переписывать нужно..... работа на месяц...


Не соглашусь, т.к. таймер это отдельный вход-запуск, значит можно его запуск повторить с др. места, т.е. запускаем твою же программу с параметрами. Делаем (все ф-ии в твоей проге как были доступны, так и остались):
1 новые параметры входа, данные для таймера сохранили в базе, файле ...
2 создаем событие, аналог запуска таймера, например :Event( 0, {|...| ... }) // запуск ф-ии, которая была по таймеру
3 Main window другое, по параметрам 1 на него попадаем
4 на ON INIT {|| DoEvents(), _wPost(0) }
5 в событии прочитали данные из базы, файла ..., отработали

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7535
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.09.23 21:25. Заголовок: Dima пишет: А если ..


Dima пишет:

 цитата:
А если закоментить строку и пересобрать , тоже упадет ?
SET EVENTS FUNCTION TO MyEventsHandler


Не могу - пропадёт отправка записей на сайт в PostgreSql, да и некоторые вызовы функций из терминалки пропадут.
У меня SendMessageData активно используется.
Юзер останется с частично рабочей программой.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1957
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.09.23 12:45. Заголовок: Andrey пишет: из-за..


Andrey пишет:

 цитата:
из-за таймера, у меня в проге 3 таймера.


Вместо таймера лучше использовать зацикленный поток и из него посылать событие окну , которое вызывает нужную процедуру
Еще лучше - обрабатывать отдельным потоком, но при этом не забываем что рабочие области в потоках не видны постоянно нужно передавать через зеро спэйс или открывать свои в потоке ( можно с тем же алиасом )
Переделка быстрая, к примеру этот поток контролирует oBrw:bCahange и вызывает процедуру только когда пользователь оторвал палец от клавиатурных стрелок ( есть любители ездить вверх-вниз по бровсе без остановок , что вызывает бесконечное число ненужных вызовов bChenge )
 



...
__objAddData (oBrw, 'tTs' )
__objAddData (oBrw, 'lChange' )
oBrw:tTs := HB_DateTime()
oBrw:lChange := .f.
oBrw:bChange := {|| oBrw:tTs := HB_DateTime(), oBrw:lChange := .t. }
...

Func Change()
local lMore := .t.
local tTs := HB_DateTime()
local nTick := 0.041667 / ( 3600 * 4 ) // кждую 1/4 секунды, 0,041667 это разница во времени в 1 час

while lMore
if oBrw:lChange
if HB_DateTime() - oBrw:tTs > nTick
oBrw:lChange := .f.
_wpost(100, "Form_0")
end
end
HB_ReleaseCPU()
end
return nil



Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1960
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.09.23 12:45. Заголовок: Andrey пишет: из-за..


Andrey пишет:

 цитата:
из-за таймера, у меня в проге 3 таймера.


Вместо таймера лучше использовать зацикленный поток и из него посылать событие окну , которое вызывает нужную процедуру
Еще лучше - обрабатывать отдельным потоком, но при этом не забываем что рабочие области в потоках не видны постоянно нужно передавать через зеро спэйс или открывать свои в потоке ( можно с тем же алиасом )
Переделка быстрая, к примеру этот поток контролирует oBrw:bCahange и вызывает процедуру только когда пользователь оторвал палец от клавиатурных стрелок ( есть любители ездить вверх-вниз по бровсу без остановок , что вызывает бесконечное число ненужных вызовов bChenge )
 



...
__objAddData (oBrw, 'tTs' )
__objAddData (oBrw, 'lChange' )
oBrw:tTs := HB_DateTime()
oBrw:lChange := .f.
oBrw:bChange := {|| oBrw:tTs := HB_DateTime(), oBrw:lChange := .t. }
...
hb_threadDetach( hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @Change() ))
...

Func Change()
local lMore := .t.
local tTs := HB_DateTime()
local nTick := 0.041667 / ( 3600 * 4 ) // кждую 1/4 секунды, 0,041667 это разница во времени в 1 час

while lMore
if oBrw:lChange
if HB_DateTime() - oBrw:tTs > nTick
oBrw:lChange := .f.
_wpost(100, "Form_0")
end
end
HB_ReleaseCPU()
end
return nil



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4377
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.23 13:05. Заголовок: Haz пишет Переделка ..


Haz пишет
 цитата:
Переделка быстрая, к примеру этот поток контролирует oBrw:bCahange и вызывает процедуру


Не забываем, для доступа к одним и тем же Public переменным (особенно при изменении значений) надо делать блокировки доступа.
Можно делать:
в основном потоке
PUBLIC p_oThr := oThrData():New() // блокировка доступов на уровне класса
p_oThr:oBrw := oBrw
в основном потоке и Thread работаем безопасно с oBrw
p_oThr:oBrw:lChange := .f.
...

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7536
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.23 18:41. Заголовок: Andrey пишет: Вот т..


Andrey пишет:

 цитата:
Вот такая ошибка:
Error BASE/1001 Неизвестная функция: EVENTS


Разобрался почему так происходит.
Большое СПАСИБО Сергею за его помощь.

Нельзя использовать БОЛЬШОЙ ON INIT для окна, плюс в нём делал ОКНО запроса пароля !
А это получается большая вложенность. Разбил на 2-3 части и всё заработало.
Пропала ошибка !
Было:
   SET EVENTS FUNCTION TO MyEventsHandler   

DEFINE WINDOW Form_Main ;
MAIN NOSHOW ;
ON INIT {|| MyInitForm() } ;
Сделал:
Set_bEvents("MyEventsHandler") // новый синтаксис

ON INIT {|| DoEvents(), _wPost(0) } ;
...
WITH OBJECT This.Object
:Event( 0, {|ow| // запуск при инициализации окна
myInitForm()
DO EVENTS
_wPost(1, ow) // запуск события 1
Return Nil
})

:Event( 1, {|ow| // запуск при инициализации окна
myInitForm2(ow)
DO EVENTS
Return Nil
})
....


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4378
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.23 19:22. Заголовок: SergKis пишет в осно..


SergKis пишет
 цитата:
в основном потоке и Thread работаем безопасно с oBrw
p_oThr:oBrw:lChange := .f.


К TsBrowse это не относится, т.к в осн. потоке Tsb работает с oBrw и ему глубоко до лампочки наша переменная p_oThr, по мне, надо все делать в осн. потоке с oBrw, т.е. из потока к тсб нет прямого доступа, только, примерно, такой, на окне имеем
:Event(101, {|ow,ky,lval,obr| obr := This.oBrw.Object, obr:lChange := lVal, ky := ow })
:Event(102, {|ow,ky,lval,obr| obr := This.oBrw.Object, obr:Refresh(lval), ky := ow })
в потоке делаем вместо oBrw:lChange := .f.
_wSend(101, oBrw, .F.)
_wPost(100, oBrw)
или если надо refresh с полной прорисовкой, то
_wSend(102, oBrw, .T.)
oBrw идет для чтения, потому блокировка не нужна, т.к. адрес объекта oBrw не меняется
похожим образом поступаем с Label и др. контролами (можно списком), в потоке в p_oThr:cLabel_1, ... заносим значения
p_oThr:cLabel_1 := ...
p_oThr:cLabel_2 := ...
...
p_oThr:cLabel_N := ...
_wPost(200, oBrw)
на окне есть событие
 
:Event(200, {|ow|
Local cNm
FOR EACH cNm IN {"Label_1","Label_2",...,"Label_N"}
cVal := p_oThr:&("c"+cNm)
SetProperty(ow:Name, cNm, "Value", cVal)
NEXT
Return Nil
}


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1961
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.09.23 19:23. Заголовок: Andrey пишет: Не за..



 цитата:
Не забываем, для доступа к одним и тем же Public переменным


Само собой с семафорами там где нужно, привел упрощённый пример в котором переменной пользуется сам поток и все

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4379
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.23 20:21. Заголовок: gfilatov2002 Сделал..


gfilatov2002
Сделал изменения у себя в minigui.lib (h_events.prg, h_objects.prg, h_objmisc.prg)
- перевел bEvents с блока кода на ф-ю hb_ExecFromArray()
- сделал возможность задавать и работать с событиями в мнемонике, а не только в числах, т.е. задаем
. :Events({0, "InitWindow"}, {|...| ... })
. :Events({1, "Main-Menu"}, {|...| ... })
в сообщениях исп. символьное имя вместо числового кода (если ставим много событий, то с мнемоникой легче)
_wPost("InitWindow") или _wPost(0)
_wPost("Main-Menu") или _wPost(1)
добавил ф-ии
_pPost(...), _pSend(...) для посылки сообщений App.Object параметры аналогичны _wPost(...), _wSend(...)
oThis := _oThis() - вернет объект контейнер уст. This среды
oThis := _oThis("Form_5") или oThis := _oThis(ow) - поставит среду окна из параметра и вернет объект контейнер уст. This среды
oThis := _oThis(oThis) - вернет что было в тек. This, поставит из oThis
Переменные объекта контейнера для работы
oThis:nFormIndex
oThis:cEventType
oThis:cType
oThis:nIndex
oThis:cFormName
oThis:cControlName

не знаю, надо это или нет ?
Пример кода Скрытый текст


Спасибо: 0 
Профиль
PSP
постоянный участник


Пост N: 1662
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 03.09.23 20:46. Заголовок: SergKis пишет: не з..


SergKis пишет:

 цитата:
не знаю, надо это или нет ?


Хоть я и не в теме minigui, но могу точно сказать: надо!) Это читается и воспринимается легче. #define тоже не просто так придумали когда-то)

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2188
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.09.23 14:59. Заголовок: SergKis пишет: Сдел..


SergKis пишет:

 цитата:
Сделал изменения у себя


SergKis
Как я уже ранее писал на форуме, любые Ваши изменения интересны и познавательны, поскольку они основаны на практическом опыте. Но очень важно иметь в библиотеке пример применения этих изменений (например, как Tsb_Basic_3 или Tsb_Basic_4), так как это другой стиль написания кода, который требует понимания взаимосвязи функций и событий.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2189
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.09.23 16:56. Заголовок: Andrey пишет: Вот ..


Andrey пишет:

 цитата:

Вот такая ошибка:
Error BASE/1001 Неизвестная функция: EVENTS


Уже поправил код, чтобы такая ошибка не возникала и функция EVENTS() не терялась

Спасибо: 1 
Профиль
SergKis
постоянный участник




Пост N: 4380
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.09.23 10:04. Заголовок: gfilatov2002 пишет Н..


gfilatov2002 пишет
 цитата:
Но очень важно иметь в библиотеке пример применения этих изменений (например, как Tsb_Basic_3 или Tsb_Basic_4), так как это другой стиль написания кода, который требует понимания взаимосвязи функций и событий.


Сделаю, надо на подумать время

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7541
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.09.23 04:18. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Уже поправил код, чтобы такая ошибка не возникала и функция EVENTS() не терялась


Григорий, когда обновление будет ?
Добавил в код ещё пару форм и всё труба, опять у заказчика лезет ошибка:
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 524726 [2] = N 129 [3] = N 0 [4] = N 1632052  
--------------------------------- Stack Trace ---------------------------------
Called from EVENTS(0)
Called from _CREATEWINDOWEX(0)
Called from TSBROWSE:CREATE(0)
Called from TSBROWSE:NEW(0)
Called from _DEFINETBROWSE(0)
Called from FORM_MYTABLE(324) in module: Source\Tbrw_table.prg
Called from TBRWDOGOVOR(16) in module: Source\Tbrw_1Run.prg
Called from EXECTASK(172) in module: Source\ExecTask.prg
Called from HB_EXECFROMARRAY(0)
Called from (b)METRO_BUTTON(455) in module: Source\main_forms.prg
Called from DO_WINDOWEVENTPROCEDURE(82) in module: h_objmisc.prg
Called from TWNDDATA:DOEVENT(1233) in module: h_objects.prg
Called from DO_ONWNDLAUNCH(256) in module: h_objmisc.prg
Called from (b)INIT(126) in module: h_init.prg

Разбил свой ON INIT на 4 события, не помогает...
Блин заколдованный круг, у меня работает у заказчика нет.
У заказчика на сервере 16 Гб оперативки, а прога не может найти функцию в ядре программы.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 1521
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 06.09.23 08:54. Заголовок: Andrey пишет: прога..


Andrey пишет:

 цитата:
прога не может найти функцию в ядре программы.



Я не имею представления о внутренностях Minigui, но с подобным сталкивался - в моем HbEdit. Это происходило иногда во время выполнения кода в Idle - состоянии. Пришлось, в конце концов, отказаться от использования Idle и реализовать нужную функциональность другим образом. Так что, похоже, проблема где-то во внутренностях Harbour.

Еще один похожий эпизод был с использованием таймера в программе на HwGUI, тогда, правда, это не проявлялось в "забывании" имени функции. Иногда, ровно в 24:00, программа вылетала в функции - обработчике таймера. Проверял сто раз - вылетала программа в самом начале выполнения функции, до всяких действий. Пришлось сделать глупейшую вещь: перед полуночью временно изменял интервал таймера, чтобы он не срабатывал в 24:00. Помогло). Здесь я грешу на Windows. Harbour и HwGUI, полагаю, тут не замешаны.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7542
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.09.23 13:10. Заголовок: Новая версия МиниГуи..


Новая версия МиниГуи 23.09
Опять засада в работающем коде. В старой версии 23.04.4 ни разу такого не было !!!
У юзера за сегодня ПЯТЫЙ раз (это только 13:00) за сегодня падает программа вот с такой ошибкой:
DbInfo: Alias - USER2LOG, Recno - 138035/138035 
Time from start: 0 days 0 hours 0 mins 59 secs
Error BASE/1003 Переменная не существует: EVENT
--------------------------------- Stack Trace ---------------------------------
Called from USER2LOGWRITE(103) in module: Source\users2log.prg
Called from USERLOGGETBOXCARD(4702) in module: Source\Tbrw_fCard.prg
Called from MYWRTGETUSERLOG(2742) in module: Source\Tbrw_fCard.prg
Called from (b)MYCARDFIELDGETBOX(2611) in module: Source\Tbrw_fCard.prg
Called from _DOCONTROLEVENTPROCEDURE(1993) in module: h_windows.prg
Called from EVENTS(2146) in module: h_events.prg
Called from DOMESSAGELOOP(0)

Вот мой код:
      nSel := SELECT("User2Log") 
IF nSel == 0
cMsg := ";;БАЗА ЖУРНАЛА-действий закрыта !;"
WaitWindowError( cMsg )
ELSE
SELECT User2Log
APPEND BLANK // добавить запись
dDT := User2Log->DT_MODIFY
IF User2Log->( RLock() )
User2Log->EVENT := dDT // 3 TimeStamp 8 0 - строка 103
User2Log->NEVENT := nEvtn // 6 Numeric 6 0

Да, имел неосторожность назвать поле EVENT
И что теперь делать ? Переименовывать ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4384
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.09.23 13:33. Заголовок: Попробуй 1. User2Lo..


Попробуй (alias уже установлен ссылку можно не делать)
1. FieldPut(FieldPos('EVENT'), dDT)
2. REPLACE EVENT with dDT или REPL EVENT with dDT // тут может FIELD-><имя> добавлять надо
3.
hRec := { "EVENT" => dDT, "NEVENT" => nEvtn }
lRet := HMG_HashToRec( hRec )
RLock\UnLock внутри есть, можешь проверить lRet -> .T. - Ok!

PS
Можешь читать запись в Hash. hRec := HMG_RecToHash( cFieldList, cNames ) (данные получает по макро, лучше бы через FieldGet(FieldPos(...)))
Можешь писать запись из Hash. HMG_HashToRec( hRec, cFieldList )
Можешь получить запись в контейнере
oRec := oHmgData() ; oRec:Set(HMG_RecToHash(), .T.) или oRec := oHmgData():Set(HMG_RecToHash(), .T.) и работать
? oRec:Event, oRec:NEvent
oRec:Event := dDT
oRec:NEVENT := nEvtn
lRet := HMG_HashToRec(oRec:CloneHash())
если названия полей не совпадут с методами

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2190
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 08.09.23 11:38. Заголовок: Всем кому это интересно


Подготовил 1-е обновление для сборки 23.09 с последними исправлениями и дополнениями, которое будет опубликовано на следующей неделе

Что исправлено:

 цитата:
* Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG:
- fixed an incorrect call of the Events() function when changing
of the main event listener with the SET EVENTS FUNCTION TO <name>
command.
The bug was reported by Verchenko Andrey


Благодарю Андрея за настойчивость и Сергея - за точное определение причины этой ошибки

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4385
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.09.23 12:37. Заголовок: gfilatov2002 Немног..


gfilatov2002
Немного модифицируйте ф-ю в Excel (я не работаю с ole совсем, потому сделать ... ), добавить вывод строк заголовков и подножия, т.е. что то такое
 
*-----------------------------------------------------------------------------*
FUNCTION HMG_DbfToExcel( cFieldList, aHeader, bFor, bWhile, nNext, nRec, lRest )
*-----------------------------------------------------------------------------*
LOCAL nRecNo := RecNo()
LOCAL bLine, aFooter, aTitle, o
LOCAL oExcel, oBook, oSheet, oRange
LOCAL nCols
LOCAL nRow := 1

IF HB_ISOBJECT( aHeader ) .and. aHeader:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA"
o := aHeader
aHeader := o:aHeader
aFooter := o:aFooter
aTitle := o:aTitle
ELSEIF HB_ISARRAY( aHeader )
o := ASize( AClone( aHeader ), 3 )
aHeader := o[1]
aFooter := o[2]
aTitle := o[3]
ENDIF

...
далее добавить строки из aTitle фонт bold, если заданы (колонки объединить)
в конце таблицы строки из aFooter фонт bold, если заданы (как колонки aHeader)


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4386
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.09.23 12:53. Заголовок: PS Ф-я HMG_HashToRec..


PS
Ф-я HMG_HashToRec( hRec, cFieldList ) не учитывает наличие защищенных полей и что ключ может быть не символьный, а значение к ключу NIL, т.е. из ф-ии oRecPut(oRec, aFieldList) обрывок
 
FOR EACH aFld IN oRec:GetAll()
cFld := aFld[1]
IF !HB_ISCHAR( cFld ) .or. aFld[2] == NIL
LOOP
ENDIF
IF ( nPos := FieldPos( cFld ) ) > 0
IF FieldType( nPos ) $ "+^="
LOOP // write protection
ENDIF
FieldPut( nPos, aFld[2] )
nCnt++
ENDIF
NEXT


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7543
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.09.23 18:14. Заголовок: Что-то непонятная ош..


Что-то непонятная ошибка начала показываться:

Какая картинка, строка вызова - ничего нет.
Гадание на кофейной гуще...
Да я что-то забыл указать, а где искать то ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7544
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.23 15:45. Заголовок: Нашёл в исходнике h_..


Нашёл в исходнике h_tbrowse.prg эту ошибку:
   IF uBitMap != NIL .AND. ValType( uBitMap ) != "L" 

DEFAULT lNoLines := .T.
cHeading := iif( ValType( uBitMap ) == "B", Eval( uBitMap ), uBitMap )
cHeading := iif( ValType( cHeading ) == "O", Eval( ::bBitMapH, cHeading ), cHeading )
IF Empty( cHeading )
MsgStop( "Image is not found!" + CRLF + "cHeading=???????" + CRLF + ProcNL(), "Error" )
RETURN NIL
ENDIF
nLHeight := SBmpHeight( cHeading )

Добавить так можно ?
Ещё бы указать какой картинки нет. Только я не знаю как ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4387
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.09.23 18:20. Заголовок: SergKis пишет Сделаю..


SergKis пишет
 цитата:
Сделаю, надо на подумать время


Пример тут https://TransFiles.ru/cin6x

Что сделано Скрытый текст


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2191
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.09.23 22:08. Заголовок: SergKis пишет: Что ..


SergKis пишет:

 цитата:
Что сделано


ОК, принято
Пример demo3 работает нормально с учетом всех правок

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4388
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.09.23 04:43. Заголовок: gfilatov2002 Правки..


gfilatov2002
Правки в примере, упустил чуток
 
1.
INIT PROCEDURE Sets_ENV()
... (App.Object):IsError правильнее применять чем (App.Object):lError , т.е. можно оба варианта
IF (App.Object):IsError // ошибка создания обработчика сообытий App.Object
MsgStop( (App.Object):cError, "ERROR" )
QUIT
ENDIF
...
END WITH

fErase( App.Cargo:cTimer1Log )
fErase( App.Cargo:cTimer2Log )

RETURN
2. для сортировки колонок по двойному клику
STATIC FUNCTION TsbReport( oWnd, nEvent, aArray, cColName )
...
:UserKeys( VK_F6, {|ob| _wPost(/*2*/"Excel", ob) } )

:lNoChangeOrd := .F.
AEval( :aColumns, {|oc,nc| oc:lFixLite := .T., ;
oc:lIndexCol := nc > 1 })

:AdjColumns({3, 4, 5, 6}) // :AdjColumns()
...
3. сместить вложенные данные при выводе
FUNCTION o2Log( o, nLen, cMsg )
...
IF HB_ISOBJECT( a[2] ) ; o2Log( a[2], nLen + 5 )
ELSE ; ?? a[2]
ENDIF
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2192
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.09.23 10:52. Заголовок: SergKis пишет: Прав..


SergKis пишет:

 цитата:
Правки в примере


Принято.
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4389
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.09.23 19:44. Заголовок: gfilatov2002 Еще не..


gfilatov2002
Еще небольшая правка (подумал, что информация о контроле в фокусе должна быть всегда)
 
FUNCTION _oThis( oThis, lSets ) // Snapshot of current data This or Sets
...
o:FocusedForm := ""
o:FocusedControl := ""
o:FocusedControlIndex := 0

IF !Empty( c := GetFocus() )
IF ( k := AScan( _HMG_aControlHandles, c ) ) > 0
o:FocusedControlIndex := k

o:FocusedControl := _HMG_aControlNames [ k ]
...
ENDIF
k := iif( Empty( _HMG_ThisControlName ), o:FocusedControlIndex, _HMG_ThisIndex )
IF !Empty( k )

o:ControlCargo := _HMG_aControlMiscData2 [ k ]
o:ControlHandle := _HMG_aControlHandles [ k ]
o:ControlParentHandle := _HMG_aControlParenthandles [ k ]
o:ControlParentName := GetParentFormName ( k )
ENDIF
IF _HMG_ThisFormIndex > 0
...
и в примере правка, обсчитался в max длине имени переменной
FUNCTION myTimer_1( oThis )
...
o2Log(oThis, 19, "*** oThis =>")
...
FUNCTION myTimer_2( oThis )
...
o2Log(oThis, 19, "*** oThis =>")
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2193
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.09.23 19:48. Заголовок: SergKis пишет: Еще ..


SergKis пишет:

 цитата:
Еще небольшая правка


OK

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7545
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.09.23 15:50. Заголовок: Вот такая ошибка поя..


Минигуи 23.09 Вот такая ошибка появляется:[pre2]

Как это понять ?
Может есть переключатель для вывода ошибок ТОЛЬКО на английском ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4390
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.09.23 06:05. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение по _LogFile(...). 1-й параметр сделать не только Logical, а Array или Char, для того, что бы на таймерах можно было использовать для них свои имена файлов log
 
*-----------------------------------------------------------------------------*
#ifndef __XHARBOUR__
FUNCTION _LogFile( lCrLf, ... )
#else
FUNCTION _LogFile( ... )
#endif
*-----------------------------------------------------------------------------*
LOCAL hFile, i, xVal, cTp
LOCAL aParams := hb_AParams()
LOCAL nParams := Len( aParams )
LOCAL cFile := hb_defaultValue( _SetGetLogFile(), GetStartUpFolder() + hb_ps() + "_MsgLog.txt" )
#ifdef __XHARBOUR__
LOCAL lCrLf
#endif

IF nParams > 0
IF HB_ISCHAR( aParams[1] )
aParams[1] := { .T., aParams[1] }
ENDIF
IF HB_ISARRAY( aParams[1] )
IF Len( aParams[1] ) > 1
IF HB_ISLOGICAL( aParams[1][1] ) // { .T.\.F. , cFile }
cTp := aParams[1][2]
aParams[1] := aParams[1][1]
ELSEIF HB_ISLOGICAL( aParams[1][2] ) // { cFile , .T.\.F. }
cTp := aParams[1][1]
aParams[1] := aParams[1][2]
ELSE // errors
aParams[1] := .T.
ENDIF
IF !Empty( cTp )
IF !hb_ps() $ cTp
cTp := GetStartUpFolder() + hb_ps() + cTp
ENDIF
cFile := cTp
ENDIF
ELSE // errors
aParams[1] := .T.
ENDIF
cTp := NIL
lCrlf := aParams[1]
ENDIF
ENDIF

IF !Empty( cFile )
...
В примере APP_OOPREPORT\demo3.prg можно сделать (для примера по одной строке, например)
*-----------------------------------------------------------------------------*
FUNCTION myTimer_1( oThis )
*-----------------------------------------------------------------------------*
...
LOCAL cLog := "_timer_1.log"
...
_LogFile({.T., cLog}, "@@@ Timer_1 - 1", HB_DATETIME(), ProcName(), nCnt)
_LogFile(cLog, "@@@ Timer_1 - 2", HB_DATETIME(), ProcName(), nCnt)
_LogFile({cLog, .T.}, "@@@ Timer_1 - 3", HB_DATETIME(), ProcName(), ProcLine(), nCnt)
? "@@@ Timer_1", HB_DATETIME(), ProcName(), nCnt
...
*-----------------------------------------------------------------------------*
FUNCTION myTimer_2( oThis )
*-----------------------------------------------------------------------------*
...
LOCAL cLog := "_timer_2.log"
...
_LogFile({.T., cLog}, "@@@ Timer_2 - 1", HB_DATETIME(), ProcName(), nCnt)
_LogFile(cLog, "@@@ Timer_2 - 2", HB_DATETIME(), ProcName(), nCnt)
_LogFile({cLog, .T.}, "@@@ Timer_2 - 3", HB_DATETIME(), ProcName(), ProcLine(), nCnt)
? "@@@ Timer_2", HB_DATETIME(), ProcName(), nCnt
...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4391
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.09.23 07:49. Заголовок: PS Возможно, для сте..


PS
Возможно, для стека This переменных надо ставить правильный тип для child окна, т.к. в реале "W" типа нет, т.е
 
*-----------------------------------------------------------------------------*
PROCEDURE _PushEventInfo
*-----------------------------------------------------------------------------*
AAdd ( _HMG_aEventInfo , { _HMG_ThisFormIndex , _HMG_ThisEventType , ;
iif( _HMG_ThisType == "W", "C", _HMG_ThisType ) , ;

_HMG_ThisIndex , _HMG_ThisFormName , _HMG_ThisControlName } )

RETURN
*-----------------------------------------------------------------------------*
PROCEDURE _PopEventInfo( n )
*-----------------------------------------------------------------------------*
...
_HMG_ThisType := iif( _HMG_aEventInfo [l] [3] == "C", "W", _HMG_aEventInfo [l] [3] )

...

С этим правками не уверен, т.к. протокол (смотрим ниже пост) выдает
 
*** aForm => ARRAY[3] // это дает HMG_GetForms( , .T. )
1. {1, "A", "wMainInit", 201590000, "Template of the finished program on MiniGui"}
2. {2, "S", "Forma_Main", 19072408, "STANDARD: Forma_Main (1280x720)"}
3. {3, "S", "Form_ListCD", 30868462, "Message log WM_COPYDATA"}
*** _HMG_aEventInfo => ARRAY[3] // это стек This переменных
1. {0, "", "", 0, NIL, NIL}
2. {1, "", "W", 1, "wMainInit", ""}
3. {2, "", "W", 2, "Forma_Main", ""}

такой подмены типов S -> W не было, была C -> W

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4392
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.09.23 08:11. Заголовок: PS2 Если сделать изм..


PS2
Если сделать изменения по _LogFile(), как выше, то ф-я o2Log(...) из примера APP_OOPREPORT\demo3.prg может быть такой (сделана модификация) Скрытый текст

применение
 
// доп. ф-ии
FUNCTION To2Log(lExt) // lExt = .T. - расширенная распечатка, массивы по вертикали, объекты по содержимому
o2Log(_oThis(), 19, "*** oThis =>", lExt)
o2Log(oGetForms(.F.), 12, "*** aForm =>", lExt)
o2Log(_HMG_aEventInfo,12, "*** _HMG_aEventInfo =>", lExt)
o2Log("procNL*")
RETURN Nil

FUNCTION oGetForms(lChar)
LOCAL aForms := {}, cRet := "", ow, aw
Default lChar := .T.

FOR EACH ow IN HMG_GetForms( , .T. )
AAdd(aForms, {hb_enumIndex(), ow:Type, ow:Name, ow:Handle, ow:Title} )
NEXT
IF lChar
FOR EACH aw IN aForms
cRet += hb_valtoexp(aw) + CRLF
NEXT
RETURN cRet
ENDIF

RETURN aForms

вызовы (это для отладки)
? "*** TsbObjViewer() *** Start" ; To2Log() ; ?
TsbObjViewer(oWin, oUse, oIndx, oMenu, oTsb, aEvent, bInitForm)
? "*** TsbObjViewer() *** Stop" ; To2Log() ; ?
результат Скрытый текст

PS
Заменил, текст ф-ии o2Log(...), т.к. потерял при перетаскивании часть строк, ее можно применять для App.Cargo, This.Object:Cargo, но она исп. правку для _LogFile(...) ф-ии из поста выше

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2194
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.09.23 12:01. Заголовок: Всем кому это интересно...


Выложил 1-е обновление сборки 23.09 по адресу

Скачать

Желаю всем хорошего дня!

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7547
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.09.23 11:21. Заголовок: Собрал свою большую ..


Собрал свою большую систему на новой версии - падает сразу при запуске.
Вот такая ошибка:
Time from start: 0 days 0 hours 0 mins 0 secs 
Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA
--------------------------------- Stack Trace ---------------------------------
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(158) in module: Source\main.prg

Вот код:
   SET EVENTS FUNCTION TO MyEventsHandler 
DEFINE WINDOW Form_Main ;
MAIN NOSHOW ;
NOMAXIMIZE NOSIZE NOCAPTION ;
ON INIT {|| DoEvents(), _wPost(0) } ;
ON RELEASE {|| _LogFile(.T., CRLF + ">>> STOP <<< " + HMG_TimeMS(App.Cargo:tStart) ) } ;
....
WITH OBJECT This.Object
: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
MAIN(158) -->> })


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7548
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.09.23 14:18. Заголовок: Заменил в новой верс..


Заменил в новой версии МиниГуи Харбор на январский (из версии МиниГуи)
Version: 3.2.0dev (r2211251714) 
Built on: Dec 3 2022
Last ChangeLog entry: 2022-11-25 18:14 UTC+0100 Przemyslaw Czerpak
ChangeLog ID: 179749ac31ef3a6665d109ba6d02563840596d21

Прога моя собралась и работает нормально.
Чего в Харборе намудрили ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2195
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.09.23 21:57. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение по _LogFile(...)


Принято

SergKis пишет:

 цитата:
Если сделать изменения по _LogFile(), как выше, то ф-я o2Log(...) из примера APP_OOPREPORT\demo3.prg


Возможно получить весь этот пример в крайней редакции?
Заранее благодарен

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4393
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.09.23 23:02. Заголовок: gfilatov2002 Пример..


gfilatov2002
Пример тут https://TransFiles.ru/tqcd8

положил h_objmisc.prg, в нем ф-ия _o2Log() аналог o2Log() из примера, я положил для использования в lib и что бы не пересекались с примерами переименовал. Команды в o2Log()
o2Log("Forms*" , , , , cLog)
o2Log("procNL*", , , , cLog)
имеют подкоманды
o2Log("Forms*M" , , , , cLog) // только окна модал
o2Log("Forms*MS" , , , , cLog) // только окна модал и standard, т.е. за * список типов окон
o2Log("procNL*3", , , , cLog)
o2Log("procNL*5", , , , cLog) // сколько строк из списка подать на вывод

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2196
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.09.23 10:36. Заголовок: SergKis пишет: поло..


SergKis пишет:

 цитата:
положил h_objmisc.prg


Спасибо, пример работает нормально

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4394
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.09.23 12:53. Заголовок: gfilatov2002 В прим..


gfilatov2002
В пример можно добавить работу с записями dbf в контейнере, функция oRecGet().
Правка Скрытый текст


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7553
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.23 18:47. Заголовок: SergKis пишет: o2Lo..


SergKis пишет:

 цитата:
o2Log("Forms*MS" , , , , cLog) // только окна модал и standard, т.е. за * список типов окон


А можно получить другой список окон, чтобы было имя prg в котором находиться данное окно ?
   aForms :={} 
FOR EACH ow IN HMG_GetForms( , .T. )
AAdd(aForms, {hb_enumIndex(), ow:Type, ow:Name, ow:Handle, ow:Title, ow:Prg} ) // примерно так
NEXT
cRet := ""
FOR EACH aw IN aForms
cRet += hb_valtoexp(aw) + CRLF
NEXT
? cRet


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4396
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.23 19:14. Заголовок: Andrey пишет AAdd(aF..


Andrey пишет
 цитата:
AAdd(aForms, {hb_enumIndex(), ow:Type, ow:Name, ow:Handle, ow:Title, ow:Prg} ) // примерно так


Таких данных нет, сам организуй
 
DEFINE WINDOW ...
This.Cargo := oHmgData()
This.Cargo:cFormName := ThisName
This.Cargo:cFormPrg := ProcFile()
...

o2log(This.Cargo, , "==> :Cargo: ")

PS
Можно поправить тексты hmg для получения данных ProcFile(), ProcName(), ProcLine() - они, правки не большие, тогда будет вывод добавлен
AAdd(o, {hb_enumIndex(ow), ow:Type, ow:Index, ow:Name, ow:Handle, IsWindowVisible(ow:Handle), ow:Title, ow:cProcFile, ow:cProcName, ow:nProcLine})
для пробы сделал, положил на ftp, проверь, если Григорий даст добро на изменения, перекинь

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2197
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.09.23 12:35. Заголовок: SergKis пишет: Григ..


SergKis пишет:

 цитата:
Григорий даст добро на изменения


Все изменения приняты
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4398
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.23 10:12. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая добавка в h_objmisc.prg
 
FUNCTION _o2Log( o, nLen, cMsg, lExt, cLog )
...
IF HB_ISOBJECT( o )
_LogFile({.F., cLog}, "O:"+o:ClassName)
IF o:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA,TINIDATA"
_LogFile({.F., cLog}, o:GetAll())
IF o:ClassName == "TINIDATA"
_LogFile({.F., cLog}, o:cIni)
ENDIF

FOR EACH a IN o:GetAll()
...
IF a[2]:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA,TINIDATA"
_LogFile({.F., cLog}, a[2]:GetAll())
IF a[2]:ClassName == "TINIDATA"
_LogFile({.F., cLog}, a[2]:cIni)
ENDIF

ELSEIF a[2]:ClassName == "TWNDDATA"
...

Пример проверка для ini https://TransFiles.ru/9yjqn

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2198
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.09.23 10:45. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшая добавка в h_objmisc.prg


Принято

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2199
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.09.23 12:50. Заголовок: Выложил 2-е обновлен..


Выложил 2-е обновление сборки 23.09 по адресу

Скачать

До новых встреч!

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7573
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.09.23 21:35. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Выложил 2-е обновление сборки 23.09


Собрал на новой версии свою прогу.
Сразу вылетает с ошибкой:
 
Time from start: 0 days 0 hours 0 mins 0 secs
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 329558 [2] = N 129 [3] = N 0 [4] = N 1701896
--------------------------------- Stack Trace ---------------------------------
Called from EVENTS(0)
Called from INITWINDOW(0)
Called from _DEFINEWINDOW(0)
Called from MAIN(121) in module: Source\main.prg

Вот код:
   Set_bEvents( {|hH,nM,wP,lP| MyEventsHandler(hH,nM,wP,lP) } )    // блок кода, сделать STATIC 

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 ) } // строка 121

Собираю на предыдущей версии 23.09.01, такой ошибки нет !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7576
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.09.23 16:15. Заголовок: Григорий ! Что делат..


Григорий ! Что делать с НОВОЙ версией ?
Не работает прога...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2200
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.09.23 18:08. Заголовок: Andrey пишет: Что д..


Andrey пишет:

 цитата:
Что делать с НОВОЙ версией ?


Andrey
Внимательно проверь, какая версия библиотека tsbrowse используется при линковке программы.

Размер файла: 359 936 байт
Дата изменения: ‎15 ‎сентября ‎2023 ‎г., ‏‎19:57:37

Рекомендую временно убрать с диска все старые версии этой библиотеки, чтобы гарантировано использовать только эту версию

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4409
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.09.23 18:37. Заголовок: Andrey Твой пример ..


Andrey
Твой пример zProgram_Template(1.4p-2).7z, с убранными из каталога *.lib и .\OBJ - собирается, работает

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7584
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.09.23 14:56. Заголовок: SergKis пишет: Твой..


SergKis пишет:

 цитата:
Твой пример zProgram_Template(1.4p-2).7z, с убранными из каталога *.lib и .\OBJ - собирается, работает


Да, собирается...

gfilatov2002 пишет:

 цитата:
Рекомендую временно убрать с диска все старые версии этой библиотеки, чтобы гарантировано использовать только эту версию

Убрал, удалил все .\OBJ
tsbrowse такая же как указана выше.
Сборку делаю так:
set MG_ROOT=C:\MiniGUI-23.09.2 
set MG_BCC=C:\borland\BCC58
set PATH=%MG_ROOT%\BATCH;%MG_BCC%\bin;%MG_ROOT%\harbour\bin;%PATH%

echo ------------ сделана замена линковщика ------
rem echo %PATH%
echo %MG_ROOT%\BATCH\hbmk2.bat
echo %MG_BCC%

hbmk2.bat Abonent4win.hbp

Собираю, ехе-ник собирается, при запуске падает с такой же ошибкой:
Time from start: 0 days 0 hours 0 mins 0 secsTime from start: 0 days 0 hours 0 mins 0 secs 
Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 1836110 [2] = N 129 [3] = N 0 [4] = N 1701896
--------------------------------- Stack Trace ---------------------------------
Called from EVENTS(0)
Called from INITWINDOW(0)
Called from _DEFINEWINDOW(0)
Called from MAIN(124) 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) } ) // блок кода, сделать STATIC

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 ) } // строка 124


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7585
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.09.23 23:04. Заголовок: Сделал небольшие пер..


Сделал небольшие перетасовки в программе, перестало работать на версии MiniGUI-23.09.1
Работает теперь только на версии MiniGUI-23.09

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2213
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.10.23 17:27. Заголовок: Всем кому это интересно :)


Подготовил новую сборку 23.10, которая будет опубликована на следующей неделе.

Что нового:

 цитата:
- добавлена поддержка библиотеки SQLRDD, которая позволяет с минимальными изменениями кода мигрировать в среду SQL;
- добавлен большой пример-шаблон программы от Андрея Верченко.



Желаю всем мира и добра!

Спасибо: 1 
Профиль
Andrey
постоянный участник




Пост N: 7601
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.10.23 20:35. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
- добавлен большой пример-шаблон программы от Андрея Верченко.


Про Сергея забыл добавить !
Без него, примера бы не было !!!

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7602
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.10.23 14:06. Заголовок: А почему иконка на ф..


А почему иконка на форме появляется где-то через секунд 4-5 ?
Показ формы в новом примере меню Setting - "Show MAIN form"

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2214
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.10.23 15:38. Заголовок: Andrey пишет: почем..


Andrey пишет:

 цитата:
почему иконка на форме появляется где-то через секунд 4-5 ?


Потому что иконка прорисовывается на форме после поступления события ON PAINT.

Для того, чтобы она появлялась сразу, запиши показ главной формы из меню таким образом:

 цитата:
Item 'Show MAIN window' ACTION {|| oMainWnd:Show(), SendMessage( oMainWnd:Handle, WM_PAINT, 0, 0 ) } ICON "i_Menu32x1" FONT hFont1




Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7603
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.10.23 19:17. Заголовок: Спасибо ! Заработало..


Спасибо ! Заработало !

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2215
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 31.10.23 10:56. Заголовок: Всем кому это интересно


Как и обещал, выложил последнюю сборку 23.10 с поддержкой библиотеки SQLRDD по адресу

click here

Пример шаблона программы с использованием OOП от Андрея и Сергея можно посмотреть в папке
\SAMPLES\Advanced\APP_OOPTEMPLATE

Желаю всем хорошего дня

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2216
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.11.23 11:45. Заголовок: Выложил 1-е обновлен..


Выложил 1-е обновление сборки 23.10 по адресу

Скачать

Альтернативная ссылка на zip-архив, если антивирус блокирует выкачку инталлятора:

Скачать архив


 цитата:
- обновлен большой пример-шаблон программы от Андрея Верченко и Сергея Киселева.


Желаю всем хорошего дня

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2218
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.11.23 19:38. Заголовок: Всем кому это интересно :)


Адаптировал текущую сборку Минигуи для работы со свежим ВСС 7.70, который вышел в октябре этого года.

 цитата:

Harbour Build Info
---------------------------
Version: Harbour 3.2.0dev (r2311151457)
Compiler: Borland/Embarcadero C++ 7.7 (32-bit)
Platform: Windows 10 10.0
PCode version: 0.3
ChangeLog last entry: 2023-11-15 15:57 UTC+0100 Phil Krylov (phil a t krylov.eu)
ChangeLog ID: 99237045fe4821b9a0b6d824f94711e3c31e382c
Built on: Nov 18 2023 16:39:58
Extra Harbour compiler options: -gc0
Extra C compiler options: -DHB_GUI -DHB_NO_PROFILER -DHB_NO_TRACE -DHB_MEMO_SAFELOCK
Build options: (Clipper 5.3b) (Clipper 5.x undoc)
---------------------------



Ваши комментарии приветствуются

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7861
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.11.23 20:03. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Ваши комментарии приветствуются


Взять его можно тут в принципе вот
Смущает одно "(Evaluation Only!)"
По ходу качнул а BRC там древний

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2219
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.11.23 20:39. Заголовок: Dima пишет: Смущает..


Dima пишет:

 цитата:
Смущает одно "(Evaluation Only!)"


Это C++Builder 11 Community Edition
Его можно использовать бесплатно при следующих условиях:

 цитата:
1. If you're an individual you may use C++Builder CE to create apps for your own use and apps that you can sell until your revenue reaches $5,000 per year.
2. If you’re a small company or organization without revenue (or up to $5,000 per year in revenue), you can also use the C++Builder CE.



Спасибо: 0 
Профиль
PSP
постоянный участник


Пост N: 1689
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 18.11.23 21:11. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
or up to $5,000 per year in revenue


Решение!))

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7862
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.11.23 22:15. Заголовок: PSP пишет: Решение!..


PSP пишет:

 цитата:
Решение!))




Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7608
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.11.23 14:19. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
текущую сборку Минигуи для работы со свежим ВСС 7.70


Как там решена проблема с русским языком:
   FOR nI := 1 TO 12 
AADD( aMonth, " " + LOWER( NTOCMONTH( nI ) ) )
NEXT
...
@ .... COMBOBOXEX ComboEx_Month ... ITEMS aMonth ...



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2220
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.11.23 14:41. Заголовок: Andrey пишет: решен..


Andrey пишет:

 цитата:
решена проблема с русским языком


Да.



Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7609
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.11.23 18:04. Заголовок: Отлично ! Как можно ..


Отлично !
Как можно попробовать данную версию ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2221
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.11.23 21:01. Заголовок: Andrey пишет: Как м..


Andrey пишет:

 цитата:
Как можно попробовать данную версию ?


Если это действительно интересно, то пиши на почту - договоримся!

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2223
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.11.23 12:46. Заголовок: Выложил 2-е обновлен..


Выложил 2-е обновление сборки 23.10 по адресу

Скачать

Альтернативная ссылка на zip-архив, если антивирус блокирует выкачку инталлятора:

Скачать архив

Желаю всем хорошего дня

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2224
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.12.23 17:39. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Выложил 2-е обновление сборки 23.10 по адресу

Скачать

Альтернативная ссылка на zip-архив, если антивирус блокирует выкачку инталлятора:

Скачать архив


Сделал "тихое" обновление этой сборки с учетом последних исправлений библиотеки TsbViewer, присланных Андреем.
Прямые ссылки на дистрибутив есть в сообщении выше.

До новых встреч

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2225
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.12.23 15:56. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Сделал "тихое" обновление этой сборки с учетом последних исправлений библиотеки TsbViewer, присланных Андреем.
Прямые ссылки на дистрибутив есть в сообщении выше.


Снова обновил дистрибутив этой сборки с учетом исправлений, присланных Андреем.

Желаю всем хорошего дня

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2231
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.12.23 12:31. Заголовок: Всем кому это интересно


Выложил заключительную сборку 23.12 с поддержкой библиотеки SQLRDD по адресу

Скачать

SHA-256: a74136d6cc4c769f9a7897fd9e0722dbde76a63ab407e8e2c677b0259b90b72f

Желаю всем хорошего дня

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4468
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.12.23 14:38. Заголовок: gfilatov2002 пишет ..


gfilatov2002 пишет
 цитата:
* New: 'Windows with different languages' sample.
Contributed by Sergej Kiselev and Verchenko Andrey
(see in folder \samples\Advanced\APP_OOPLANG)


Этот пример больше подходит для версии hmg unicode реализации.
Пример тут https://TransFiles.ru/lahsp

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2232
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.12.23 15:29. Заголовок: SergKis пишет: для ..


SergKis пишет:

 цитата:
для версии hmg unicode


Благодарю за помощь
Это очень интересный пример, поместил его в папку Tsb_Lang

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4469
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.12.23 16:34. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
пример, поместил его в папку Tsb_Lang


Пример собран на версии unicode Harbour MiniGUI Extended Edition 23.07 (Release) + изменения из этой темы до версии с SqlRDD (~23.09) - это важно для правки и пересборки примера

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4479
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.12.23 02:42. Заголовок: gfilatov2002 Для Al..


gfilatov2002
Для Alert... с длинными текстами сделал простой вариант
 
STATIC aBackColor, aFontColor, s_nLineLen := 79
...
*-----------------------------------------------------------------------------*
FUNCTION HMG_Alert_MaxLines( nLines, nLineLen )
*-----------------------------------------------------------------------------*
LOCAL cVarName := "_" + ProcName()
LOCAL nOldLines := _AddNewGlobal( cVarName, 20 )

IF HB_ISNUMERIC( nLines ) .AND. nLines > 0
_SetGetGlobal( cVarName, nLines )
ENDIF
IF HB_ISNUMERIC( nLineLen ) .AND. nLineLen > 0 .AND. nLineLen < 255
s_nLineLen := nLineLen
ENDIF


RETURN nOldLines
...
*-----------------------------------------------------------------------------*
STATIC FUNCTION FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bBlock, lClosable, cFont, nMaxLen )
*-----------------------------------------------------------------------------*
...
nMaxWidth *= 0.7
ENDIF

FOR n := 1 TO nLineas
nMaxLin := Max( nMaxLin, GetTextWidth( hDC, AllTrim( MemoLine( cMsg, s_nLineLen, n ) ), hDlgFont ) )
NEXT

// calculate the maximum width of the buttons

FOR n := 1 TO nLenaOp
...
FOR n := 1 TO nLineas

cLblName := "Say_" + StrZero( n, 2 )

@ nRow * ( n + iif( nLineas == 1, .5, 0 ) ) + GetBorderHeight(), nCol ;
LABEL ( cLblName ) VALUE AllTrim( MemoLine( cMsg, s_nLineLen, n ) ) OF ( cForm ) ;
FONT cFont WIDTH nWidthCli - nCol - GetBorderWidth() - MARGIN / 4 - nMaxWidth ;
HEIGHT nChrHeight ;
FONTCOLOR aFontColor BACKCOLOR aBackColor VCENTERALIGN

NEXT n
...

В начале программы ставлю
...
SetMenuBitmapHeight( 32 ) // set menu icons size to 32x32
HMG_Alert_MaxLines( , 120)

SET NAVIGATION EXTENDED
...

помогает

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2234
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.12.23 12:34. Заголовок: SergKis пишет: с дл..


SergKis пишет:

 цитата:
с длинными текстами сделал простой вариант


Спасибо
Добавил такую возможность тоже...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2240
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 17.01.24 12:31. Заголовок: Всем, кому это интересно


Подготовил новую сборку 24.01, которая будет опубликована на следующей неделе.

Что нового:

 цитата:
* Fixed: Incorrect handling of the FontColor and BackColor properties in
the CHECKLISTBOX control.
You can set/get these properties with
- function syntax:
SetProperty ( Form, Control, 'BackColor', { n1 , n2 , n3 } )
GetProperty ( Form, Control, 'FontColor' ) --> aColor
- pseudo-OOP syntax:
Form.ChkListBox.FontColor := { n1 , n2 , n3 }
Form.ChkListBox.BackColor --> aColor
Bug was reported by Ivanil Marcelino.
Contributed by Grigory Filatov
(see demo.prg in folder \samples\Basic\CheckListBox)
* Enhanced: Added the optional second parameter in the HMG_Alert_MaxLines()
function for managing of the max width of the EditBox line in the
HMG_Alert() function.
Syntax:
HMG_Alert_MaxLines( <nLines> [, <nMaxWide>] ) => nPrevLines
Suggested and contributed by Sergej Kiselev
(see demo in folder \samples\Advanced\APP_OOPTEMPLATE)
* New: The GetAppLocalDataFolder() function returns an Application Data Folder
path for a local user.
The GetWindowsTempFolder() function returns the path to the Windows
temporary folder on the root drive.
Contributed by Grigory Filatov
(see demo in folder \samples\Basic\Misc)


Желаю всем мира и добра!

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4494
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.01.24 18:09. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая правка
 
*-----------------------------------------------------------------------------*
FUNCTION Set_bEvents ( bBlock )
*-----------------------------------------------------------------------------*
LOCAL bOld := s_bEvents

IF HB_ISCHAR( bBlock ) .AND. "(" $ bBlock
bBlock := hb_ULeft( bBlock, hb_UAt( "(", bBlock ) - 1 )
ENDIF

s_bEvents := bBlock
s_lEvents := !Empty( s_bEvents )

RETURN bOld

тогда можно делать
bBlockOld := Set_bEvents ( bBlockNew )
...
Set_bEvents ( bBlockOld )
bBlockOld := Set_bEvents ( NIL )
...
Set_bEvents ( bBlockOld )
для конкретных окон ставить свои обработчики

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2241
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.01.24 21:01. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшая правка


OK

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4495
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.01.24 12:34. Заголовок: gfilatov2002 Небольш..


gfilatov2002
Небольшая добавка
 
*----------------------------------------------------------------------------*
FUNCTION _o2Log( o, nLen, cMsg, lExt, cLog )
*----------------------------------------------------------------------------*
LOCAL a, b, c, i, j, k := pCount(), l := .F., xRet := .T.

IF Valtype(cLog) $ "LND"
l := .T.
cLog := hb_FNameDir(cLog) + "_" + hb_ntos(Seconds())
ENDIF

DEFAULT lExt := .F., cLog := _SetGetLogFile()
...
ENDIF

IF l .and. hb_FileExists( cLog )
xRet := hb_memoread( cLog )
hb_FileDelete( cLog )
ENDIF

RETURN xRet


для использования, например, так AlertInfo( _o2log(o, 15, "=> oLbl:Cargo", .T., .T.) )

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2244
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.01.24 14:40. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшая добавка


Принято
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4496
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.01.24 18:10. Заголовок: gfilatov2002 Пропус..


gfilatov2002
Пропустил ошибку в строке
cLog := hb_FNameDir(_SetGetLogFile()) + "_" + hb_ntos(Seconds())


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4497
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.01.24 18:51. Заголовок: gfilatov2002 Может ~..


gfilatov2002
Может ~ такую добавку сделать ?
 
STATIC s_lOutLogFile := .T.
*-----------------------------------------------------------------------------*
FUNCTION _SetGetLogFile( cFile, lOut )
*-----------------------------------------------------------------------------*
LOCAL cVarName := "_HMG_" + SubStr( ProcName(), 8 )
LOCAL cOld := _AddNewGlobal( cVarName, NIL ), lOld

IF HB_ISLOGICAL( lOut )
lOld := s_lOutLogFile
s_lOutLogFile := lOut
IF cFile == NIL
RETURN lOld
ENDIF
ENDIF

IF cFile != NIL
_SetGetGlobal( cVarName, cFile )
RETURN cFile
ENDIF

RETURN cOld

*-----------------------------------------------------------------------------*
#ifndef __XHARBOUR__
FUNCTION _LogFile( lCrLf, ... )
#else
FUNCTION _LogFile( ... )
#endif
*-----------------------------------------------------------------------------*
LOCAL hFile, i, xVal, cTp
LOCAL aParams := hb_AParams()
LOCAL nParams := Len( aParams )
LOCAL cFile := hb_defaultValue( _SetGetLogFile(), GetStartUpFolder() + hb_ps() + "_MsgLog.txt" )
#ifdef __XHARBOUR__
LOCAL lCrLf
#endif
IF ! s_lOutLogFile
RETURN .F.
ENDIF

IF nParams > 0
...

Для приостановки вывода в log не меняя код. Можно команду сделать, типа
SET LOGFILE OUT ON\OFF

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4498
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.01.24 19:34. Заголовок: PS видел, но не поня..


PS
видел, но не понял к чему относятся
#xtranslate IsErrorLogActive () ;
=> ;
_HMG_CreateErrorLog
и
#xcommand SET LOGERROR <x:ON,OFF> => _HMG_CreateErrorlog := ( Upper(<(x)>) == "ON" )
возможно надо такую еще
#xcommand SET LOGERROR TO [<uVal>] => _HMG_CreateErrorlog := !Empty( <uVal> )
#xtranslate SetErrorLogActive ( <uVal> ) ;
=> ;
_HMG_CreateErrorLog := !Empty( <uVal> )
и тогда в _LogFile(...)
 
IF ! IsErrorLogActive ()
RETURN .F.
ENDIF

Это, если речь об этом шла с переменной _HMG_CreateErrorLog

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2245
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.01.24 21:16. Заголовок: SergKis пишет: Проп..


SergKis пишет:

 цитата:
Пропустил ошибку в строке


Поправил. Большое спасибо!

SergKis пишет:

 цитата:
тогда в _LogFile(...)

IF ! IsErrorLogActive ()
RETURN .F.
ENDIF


Добавил этот код.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2246
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.01.24 11:55. Заголовок: Выложил финальную сб..


Выложил финальную сборку 24.01 с последними исправлениями и дополнениями по адресу

Скачать

SHA-256: 8d506a1c284bb8cbc6ba3f1298a6a806585ee9a718e560113111e8998b91324e

и в виде архива

Скачать

SHA-256: 3f40d354e2e7247c670f45bba4f55096e9823468f22f30d5c86b0f6e0f84e67c

Желаю всем хорошего дня

P.S.
За последние годы была прекращена разработка и поддержка нескольких проектов, основанных на синтаксисе команд Минигуи:
- 2017 - официальный релиз HMG
- 2017 - Marinas GUI, основанный на Qt (http://marinas-gui.org/projects/marinas-gui/_Index_help_marinas-gui.htm)
- 2023 - OOHG, использующий OOП

Если не трудно, напишите ваш комментарий...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4499
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.01.24 14:10. Заголовок: gfilatov2002 пишет в..


gfilatov2002 пишет
 цитата:
ваш комментарий...


- релиз HMG, не было TsBrowse и был ли препроцессор команд, уже забыл, помню, что в основе была работа напрямую с _HMG_SYSDATA
- Marinas GUI, сложноватый синтаксис и переход с VO
- OOHG, ООП был (отличный от VO), но суть (наличие массива _HMG_SYSDATA), а значит вся работа по доступу к окнам, контролам это AScan()
Когда появился hb 2.0 unicode все это пощупали, HMG Extended оказалась единственным работоспособным и адаптируемым к своим возможностям проектом, к тому в очень актуальном состоянии С 2010 года перевели проекты на hb console+wvt, а 2011 года, пощупав, многое, перешли с VO на HMG Extended. Товарищ полностью обвязал объектами, как VO и с мин. затратами перешел. У меня была сильная помесь кода от clipper (в VO на базе VOSсripta) и GUI (свои ф-ии окна), то идти его путем (объектов) было сложно. Переход на родной язык hmg препроцессора оказался оч. к стати. Григорию, за его труд, БОЛЬШОЕ СПАСИБО !
Единственным минусом, который не преодолел я (переход на последние версии hmg) это
1. сокрытие команд, функций из FUNCTION -> STATIC FUNCTION, например, в h_controlmisc.prg не было static ф-ий, теперь все скрыто, доступ, практически только через Set\GetProperty()
2. ускорение доступа к элементам hmg, например, в моей версии сделано (работа через полученный ранее index)
 
*-----------------------------------------------------------------------------*
Function GetControlName ( ControlName, ParentForm, Index )
*-----------------------------------------------------------------------------*
Local i := GetControlIndex ( ControlName, ParentForm, Index )

if i == 0; Return ''
EndIf

Return ( _HMG_aControlNames [ i ] )

*-----------------------------------------------------------------------------*
Function GetControlHandle ( ControlName, ParentForm, Index )
*-----------------------------------------------------------------------------*
Local i := GetControlIndex ( ControlName, ParentForm, Index )

if i == 0; Return 0
EndIf

Return ( _HMG_aControlHandles [ i ] )
*-----------------------------------------------------------------------------*
Function GetControlContainerHandle ( ControlName, ParentForm, Index )
*-----------------------------------------------------------------------------*
Local i := GetControlIndex ( ControlName, ParentForm, Index )

if i == 0; Return 0
EndIf

Return ( _HMG_aControlContainerHandle [ i ] )
...
Сейчас я бы это упростил, сделав
IF HB_ISNUMERIC(ControlName)
i := ControlName
ControlName := _HMG_aControlNames [ i ]
ELSE
i := GetControlIndex ( ControlName, ParentForm )
ENDIF

PS. Пару лет назад товарищ сделал вывод, что делать проект на псевдо ООП командах hmg значительно быстрее, чем на VO, согласен с этим выводом уже давно.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2247
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.01.24 19:19. Заголовок: SergKis пишет: дела..


SergKis пишет:

 цитата:
делать проект на псевдо ООП командах hmg значительно быстрее


Как обычно, благодарю за Ваш быстрый ответ.
Надеюсь, что это интересно не только мне.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7664
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.01.24 17:38. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
За последние годы была прекращена разработка и поддержка нескольких проектов, основанных на синтаксисе команд Минигуи:
- 2017 - официальный релиз HMG
- 2017 - Marinas GUI, основанный на Qt (http://marinas-gui.org/projects/marinas-gui/_Index_help_marinas-gui.htm)
- 2023 - OOHG, использующий OOП


2017 - официальный релиз HMG - не понравился
2017 - Marinas GUI - пробовал делать свою программу, тоже не понравился
2023 - OOHG - не смотрел
В 2012 году начал разбираться с МиниГуи, понравилось присутствие разработчика на этом сайте, ну и его помощь в освоении МиниГуи !

Григорий, ОГРОМНОЕ СПАСИБО за твой такой большой труд !
Да и без Сергея я бы тоже не осилил перенос программы на МиниГуи, тоже ОГРОМНОЕ СПАСИБО !
Свою большую прогу с терминалки на МиниГуи переводил 4 года.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4500
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.01.24 18:02. Заголовок: gfilatov2002 Не пон..


gfilatov2002
Не понял с примером FiveLibsTest. Может не так понимаю его ?
prgflags=-DHBMK_HAS_HMGE -работает
а
prgflags=-DHBMK_HAS_GTWVG - нет, не находит
frm_class.ch(50) Error F0029 Can't open #include file 'gtwvg.ch'
его нет и в core-master от 09.03.23, есть hbgtwvg.ch
т.е. пример должен работать под разными проектами hmge, hwgui, ...
но gtwvg - должен быть в hb и по идее должен работать или ошибаюсь ?
то что нет gtwvg.lib понимаю, но у меня под msvc hb (от 2020 года) в contrib есть gtwvg.lib, но файла gtwvg.ch так же нет
PS. Может gtwvg.lib надо вкл. в сборку hmg ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2248
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.01.24 18:50. Заголовок: SergKis пишет: prgf..


SergKis пишет:

 цитата:
prgflags=-DHBMK_HAS_HMGE -работает


Этот пример был доработан для корректного использования с библиотекой Минигуи.
Работа с другими библиотеками не тестировалась...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2249
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 24.01.24 14:48. Заголовок: Всем кому это интересно


Продолжаем хорошие новости

Рекомендую посмотреть довольно зрелый IDE, заточенный для работы с SQL базами, свежая версия которого была выпущена вчера. Этому проекту уже пять лет, и он поставляется в 3-х версиях:
- полной;
- персональной;
- для экспертов.

click here

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4507
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.02.24 07:27. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая правка
 
CLASS TIniData INHERIT THmgData
...
VAR aYesNo AS ARRAY INIT { "Yes", "No" }
VAR nMaxVal AS NUMERIC INIT 20 // Max. length Value for note

...
METHOD Write( cFile, lUtf8 ) CLASS TIniData
...
IF ! Empty( cStr[2] )
IF lBlk
cVal := iif( ! ::lUtf .AND. lUtf8, hb_StrToUtf8( cStr[2] ), cStr[2] )
ELSE
IF Len(cVal) <= ::nMaxVal
cVal := Left( cVal + Space( ::nMaxVal ), ::nMaxVal )
ENDIF

cVal += space(3) + iif( ! ::lUtf .AND. lUtf8, hb_StrToUtf8( cStr[2] ), cStr[2] )
ENDIF
ENDIF
...

Тогда будет выравнивание в секции oIni для строк с наличием примечания на длину :nMaxVal и
можно задать new значение oIni:nMaxVal := 40 для выполнения oIni:Write()

И предложение
 

*----------------------------------------------------------------------------*
FUNCTION HMG_GetAllFonts( lObj )
*----------------------------------------------------------------------------*
LOCAL oFonts := oHmgData()
LOCAL aFonts := {}, cName
LOCAL aFont := {}, cFont, hFont

FOR EACH cFont IN _HMG_aControlType
IF cFont == "FONT"
AAdd( aFonts, _HMG_aControlNames[ hb_enumindex( cFont ) ] )
ENDIF
NEXT

IF lObj == NIL ; RETURN aFonts
ENDIF

FOR EACH cName IN aFonts
hFont := GetFontHandle( cName )
cFont := GetFontParam ( hFont )
hb_AIns( cFont, 1 , cName , .T. )
hb_ADel( cFont, Len(cFont), .T. )
IF Empty( lObj )
AAdd( aFont, AClone( cFont ) )
ELSE
oFonts:Set( cName, AClone( cFont ) )
ENDIF
NEXT

IF Empty( lObj ) ; RETURN aFont
ENDIF

RETURN oFonts


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4508
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.02.24 09:43. Заголовок: gfilatov2002 Вопроси..


gfilatov2002
Вопросик по использованию hrb в hmg с использованием hb_compileFromBuff(...), hb_compileBuf(...).
Как быть, например, с i_psevdofunc.ch ?
Его, наверно, надо отключить из hmg.ch сборки по какому то признаку, а из i_psevdofunc.ch сделать psevdofunc.lib ?
Или есть др. варианты ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2266
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.02.24 11:59. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшая правка


Большое спасибо

SergKis пишет:

 цитата:
Вопросик по использованию hrb в hmg


Я глубоко не разбирался с использованием hrb в hmg (только проверял для Харбор-кода).

SergKis пишет:

 цитата:
надо отключить из hmg.ch сборки по какому то признаку, а из i_psevdofunc.ch сделать psevdofunc.lib ?


Полностью доверяю вашему опыту в этом вопросе.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2268
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.02.24 17:39. Заголовок: Всем кому это интересно


Решил не добавлять новую функцию PrivateExtractIcons(), а вместо этого изменить уже существующую в ядре функцию ExtractIconEx(), добавив в нее два новых параметра, которые задают высоту и ширину иконки.


 цитата:

Syntax:
ExtractIconEx( cResName, nItem [, nX ] [, nY ] ) => { hIcon, nId },
where nX and xY are the icon sizes in pixels (32x32 by default).


Примеры использования:
ExtractIconEx( cIcon, -1 ) возвращает количество иконок в DLL или EXE
hIconFromDll := ExtractIconEx( cIcon, nIcon, 256, 256 )[1] получает хэндл иконки с номером nIcon, которая находится в файле cIcon

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7680
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.02.24 18:56. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
ExtractIconEx(), добавив в нее два новых параметра, которые задают высоту и ширину иконки.


Супер !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7681
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.02.24 08:28. Заголовок: А можно ещё сделать ..


А можно ещё сделать так ?
aIcons := ExtractIconEx( cIcon, nIcon )  - вытащить ВСЕ иконки, т.е. все размеры иконок

Или ключик какой то предусмотреть, чтобы осталась совместимость со старым синтаксисом ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2269
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.02.24 16:04. Заголовок: Andrey пишет: вытащ..


Andrey пишет:

 цитата:
вытащить ВСЕ иконки, т.е. все размеры иконок


В системе не хранятся иконки ВСЕХ размеров.
Если в ресурсной DLL нет иконки требуемого размера, то при извлечении иконки этого размера она масштабируется из хранящейся там иконки большего размера.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4509
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.02.24 17:58. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение для ф-ий Alert...(...) сделать обработку параметра Title как массива, например, для ф-ии
 
*-----------------------------------------------------------------------------*
FUNCTION AlertYesNo ( Message, Title, RevertDefault, Icon, nSize, aColors, lTopMost, bInit )
*-----------------------------------------------------------------------------*
LOCAL aOptions := { '&' + _HMG_aABMLangLabel [20], '&' + _HMG_aABMLangLabel [21] }
LOCAL nDefaultButton := 1

IF HB_ISARRAY( Title )
aOptions := Title[2]
Title := Title[1]
ENDIF

...

а то получается много мороки, сохранять перед AlertYesNo(...) и др. функциями данные из _HMG_aABMLangLabel [20] и _HMG_aABMLangLabel [21], а потом надо восстанавливать и + к этому может мешать '&' + _HMG_..., надо на другое место '&' поставить.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2270
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.02.24 18:13. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение для ф-ий Alert...(...)


Сделал, конечно.
Благодарю за подсказку

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2271
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.02.24 19:42. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Примеры использования:


Иконка номер 308 размера 64x64, взятая из системной DLL, выглядит так:



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4510
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.24 00:44. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение по
 
FUNCTION HMG_Alert( cMsg, aOptions, cTitle, nType, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFontName )
...
ON RELEASE iif( ! _SetGetGlobal( "_HMG_PressButton" ) .AND. lClosable, _HMG_ModalDialogReturn := 0, NIL )

This.Cargo := oHmgData()

FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFontName, nMaxLen )
...
STATIC FUNCTION FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bBlock, lClosable, cFont, nMaxLen )
...
LOCAL lExt, nY, nX, cIco
...
DEFINE TIMER oTimer OF ( cForm ) INTERVAL nSeconds * 1000 ACTION ( _SetGetGlobal( "_HMG_PressButton", .T. ), ThisWindow.Release() )

This.Cargo:oTimer := "TIMER"

This.oTimer.Enabled := .F.
...
IF nLineas > 1

IF nLineas > nMaxLines

cLblName := "Say_01"
...
This.Cargo:Set( cLblName, This.&(cLblName).Type )

ELSE

FOR n := 1 TO nLineas

cLblName := "Say_" + StrZero( n, 2 )
...
This.Cargo:Set( cLblName, This.&(cLblName).Type )

NEXT n
...
ELSE

cLblName := "Say_01"
...
This.Cargo:Set( cLblName, This.&(cLblName).Type )

ENDIF

IF nIcoSize > 0

nY := nRow + GetBorderHeight()
cIco := "ICON"

IF ISNUMBER( cIcoFile )

IF IsHIcon( cIcoFile )
nX := MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) )

DRAW ICON IN WINDOW ( cForm ) ;
AT nRow + GetBorderHeight(), MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) ;
HICON cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT
ELSE
nX := MARGIN / 1.4
cIco := "SYSICON"

DRAW SYSICON IN WINDOW ( cForm ) ;
AT nRow + GetBorderHeight(), MARGIN / 1.4 ;
ICON cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT
ENDIF

ELSE

nX := MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) )

DRAW ICON IN WINDOW ( cForm ) ;
AT nRow + GetBorderHeight(), MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) ;
PICTURE cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT

ENDIF

This.Cargo:Draw := { cIco , nY , nX , cIcoFile , nIcoSize }

ENDIF

This.Cargo:lExtButton := lExt

FOR n := 1 TO nLenaOp
...
IF lExt
...
This.Cargo:Set( cBtnName, This.&(cBtnName).Type )

ELSE
...
This.Cargo:Set( cBtnName, This.&(cBtnName).Type )

ENDIF
...

тогда
bInit := {||
Local oWnd := _WindowObj( _HMG_THISFORMNAME )
_o2log(oWnd:Cargo, 12, "=>", .T.)
Return Nil
}
выдаст в log
=> O:THMGDATA ARRAY[8]
1. SAY_01 = LABEL
2. SAY_02 = LABEL
3. SAY_03 = LABEL
4. SAY_04 = LABEL
5. DRAW = {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32}
6. LEXTBUTTON = .F.
7. BTN_01 = BUTTON
8. BTN_02 = BUTTON
... или
=> O:THMGDATA ARRAY[5]
1. SAY_01 = EDITBOX
2. DRAW = {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32}
3. LEXTBUTTON = .F.
4. BTN_01 = BUTTON
5. BTN_02 = BUTTON
...
PS.
Вместо oWnd := _WindowObj( _HMG_THISFORMNAME ) можно использовать
?v GetProperty(_HMG_THISFORMNAME, "Cargo"):GetAll()
получим
1 {"SAY_01", "EDITBOX"}
2 {"DRAW", {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32}}
3 {"LEXTBUTTON", .F.}
4 {"BTN_01", "BUTTON"}
5 {"BTN_02", "BUTTON"}
...
1 {"SAY_01", "LABEL"}
2 {"SAY_02", "LABEL"}
3 {"SAY_03", "LABEL"}
4 {"SAY_04", "LABEL"}
5 {"DRAW", {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32}}
6 {"LEXTBUTTON", .F.}
7 {"BTN_01", "BUTTON"}
8 {"BTN_02", "BUTTON"}
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2272
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.02.24 12:08. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение по


Принято
Но я добавлю эти изменения в обрамлении переменной __DEBUG__:

 цитата:

#ifdef __DEBUG__
...

#endif



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4511
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.24 12:16. Заголовок: gfilatov2002 пишет Н..


gfilatov2002 пишет
 цитата:
Но я добавлю эти изменения в обрамлении переменной __DEBUG__:


Почему ?
Это основной режим, в моем понимании. Сейчас Cargo окна пуст и доступа к нему нет. А сделать на базе Alert ф-ий по темам с доп. наполнением - большая потребность. Сейчас мешает полное отсутствие инф. о DRAW ICON ... и лишние манипуляции делать чтобы определять тип button-ов., а так доступна вся инф. о контролах окна в простом виде
PS
Сейчас пробую использовать добавки, для отладки, код получается ~ такой (если интересно)Скрытый текст


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2273
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.02.24 12:25. Заголовок: SergKis пишет: Это ..


SergKis пишет:

 цитата:
Это основной режим


Понял.
Тогда обрамление кода будет другим:

 цитата:

#ifdef _OBJECT_
...
#endif


поскольку в лайт-версии библиотеки команда SET OOP ON не поддерживается.

P.S. Кстати, решил разделить Минигуи на две сборки:
1) профессиональную версию (с разными дополнительными оптимизациями в Харборе и компактным бинарником Минигуи)
2) стандартную версию, которая будет распространяться бесплатно, но без дополнительных оптимизаций в Харборе и с отладочным кодом в библиотеке).
Что скажете по этому поводу
На мой взгляд, надо стимулировать пользователей, которые поддерживают развитие и поддержание библиотеки в актуальном состоянии.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4512
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.24 12:32. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
поскольку в лайт-версии библиотеки команда SET OOP ON не поддерживается


Поддерживается (включен) CLASS THmgData и oHmgData() до команды #ifdef _OBJECT_ в h_objects.prg

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2274
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.02.24 12:37. Заголовок: SergKis пишет: Подд..


SergKis пишет:

 цитата:
Поддерживается


А как же тогда работает эта запись в заголовке minigui.ch

 цитата:

/* ***********************************************************************
* Enable support for the internal OOP classes
*
* By default this is turned ON.
*/
#ifndef _LITE_
#define _OBJECT_
#endif



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4513
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.24 12:54. Заголовок: gfilatov2002 Смотрю..


gfilatov2002
Смотрю h_objects.prg
 
/*
* MINIGUI - Harbour Win32 GUI library source code
*
* Copyright 2017-2022 Aleksandr Belov, Sergej Kiselev <bilance@bilance.lv>
*/

#include "minigui.ch"

#include "i_winuser.ch"
#ifdef __XHARBOUR__
#include "hbcompat.ch"
#else
#xtranslate hb_HSetCaseMatch( <x>[, <z>] ) => ( hb_HCaseMatch( <x>[, <z>] ), <x> )
#endif
#include "hbclass.ch"

#define _METHOD METHOD

STATIC o_AppDlu2Pixel

///////////////////////////////////////////////////////////////////////////////
CLASS THmgData
///////////////////////////////////////////////////////////////////////////////
...
#ifdef _OBJECT_

#ifndef __XHARBOUR__
///////////////////////////////////////////////////////////////////////////////
CLASS TIniData INHERIT THmgData
///////////////////////////////////////////////////////////////////////////////
...

Объект-контейнер в любой версии должен быть, мое мнение, он, как и препроцессор, основа в псевдо ООП

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2275
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.02.24 12:57. Заголовок: SergKis пишет: Смот..


SergKis пишет:

 цитата:
Смотрю h_objects.prg


Все верно!
Функция oHmgData() используется при создании глобальных статических переменных в ядре библиотеки.

Тогда обрамление будет таким
#ifdef _NAMES_LIST_
...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4514
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.24 13:25. Заголовок: gfilatov2002 пишет К..


gfilatov2002 пишет
 цитата:
Кстати, решил разделить Минигуи на две сборки:


Не оч. понятно деление.
По мне сейчас Min. комплект - SET OOP OFF, даже не представляю, что что то, серьезное, можно делать с ним (SQLRDD лишнее в ней). Когда заходили в hmg (~2012 г.) именно SET OOP ON не было, сделали и с тех пор это рабочая версия (по TsBrowse по мелочи перенес изменения из тек. версии в свою и всего хватает)
PS
В той, старой, версии еще не было тотальной борьбы за минимизацию кода и это хорошо, в ней спокойно работают hrb компиляции на лету, без комплекта harbour.exe и Include файлов, сейчас компиляция на лету затруднена, т.к. практически все нужные ф-ии убраны в файлы *.ch, например, это одна из причин, по которой не могу задействовать тек. версии hmg (только в качестве небольших утилит использовал)
PS
Пример для наглядности работы с macro использованием псевдо ф-й (т.е. городим огород),
на основе oHmgData() делаем Скрытый текст

и используем в ini
aWindow_YXWH = { oSys():Y, oSys():X, oSys():MaxW, oSys():MinH + 64 }

PS
Используя такую методику, теряется совместимость кодов для получения hrb, т.е. надо используемые ф-ии из *.ch переносить в отдельную lib и отключать *.ch от сборки проекта (собирать harbour.exe+Include можно, но для меня не вариант). Пока др. мыслей у меня нет

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4517
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.24 16:41. Заголовок: gfilatov2002 пишет ..


gfilatov2002 пишет
 цитата:

Тогда обрамление будет таким
#ifdef _NAMES_LIST_
...


CLASS THmgData
не должен иметь никаких обрамлений кода, т.е. доступен всегда, как и заполнение Cargo Alert окна. Обрамление, как было, так и должно остаться при определении public переменных

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2276
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.02.24 17:03. Заголовок: SergKis пишет: CLAS..


SergKis пишет:

 цитата:
CLASS THmgData
не должен иметь никаких обрамлений кода


Да. Именно так сейчас и сделано в коде ядра.
И в заголовке minigui.ch указано:
 
/* ***********************************************************************
* Enable support for the internal OOP classes
*
* By default this is turned ON.
*/
#ifndef _LITE_
#define _OBJECT_
#endif


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4518
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.24 17:27. Заголовок: gfilatov2002 пишет И..


gfilatov2002 пишет
 цитата:
Именно так сейчас и сделано в коде ядра.


Я бы еще добавил уст. Значения во всех окнах, контролах (где сейчас пусто)
_HMG_aControlMiscData2 [k] := oHmgData() вместо ''
_HMG_aFormMiscData2 [ k ] := oHmgData() вместо ''
и ,возможно, App.Cargo тоже, сейчас там версия (значение char), его перенести в объект App.Cargo под опред. именем
"раз пошла такая пьянка ..."

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7683
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.24 18:41. Заголовок: Да при старте програ..


Да при старте программы делаем:
 
INIT PROCEDURE SetsENV()

SET DATE TO GERMAN
SET DECIMALS TO 4
SET EPOCH TO 2000
SET EXACT ON
SET SOFTSEEK ON
SET CENTURY ON
SET AUTOPEN OFF
SET DELETED OFF

? Valtype(App.Cargo), App.Cargo
.....

Получаем - C Harbour MiniGUI 3.2.8 (stable)
А почему сразу нельзя присвоить так:
   App.Cargo := oHmgData() 
App.Cargo:MiniGui := "Harbour MiniGUI 3.2.8 (stable)"


И потом нигде не мучиться по коду, делая своё пере присвоение для App.Cargo !

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2277
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.02.24 19:14. Заголовок: Andrey пишет: почем..


Andrey пишет:

 цитата:
почему сразу нельзя присвоить так:
App.Cargo := oHmgData()


Уже сделал
Благодарю за подсказку

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7684
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.24 21:20. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
P.S. Кстати, решил разделить Минигуи на две сборки:
1) профессиональную версию (с разными дополнительными оптимизациями в Харборе и компактным бинарником Минигуи)
2) стандартную версию, которая будет распространяться бесплатно, но без дополнительных оптимизаций в Харборе и с отладочным кодом в библиотеке).
Что скажете по этому поводу


Может и надо такое деление...
Только в проф-версию ещё бы предоставить сборку с MS-C и Unicode

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4519
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.02.24 09:11. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая добавка
 
CLASS TIniData INHERIT THmgData
...
VAR nMaxVal AS NUMERIC INIT 20 // Max. length Value for note
VAR cSrcReplChar AS STRING INIT "" // Original replacement character
VAR cOutReplChar AS STRING INIT "" // Replacement by output symbol


METHOD New( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar ) INLINE ( ::Super:New( .T. ), ;
::Def( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar ), Self ) CONSTRUCTOR

_METHOD Def( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar )
_METHOD Read( cIniNew )
...
METHOD Def( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar ) CLASS TIniData
...
::cCommentChar := hb_defaultValue( cChar, ::cCommentChar )

IF HB_ISCHAR( cSrcChar ) .and. HB_ISCHAR( cOutChar )
::cSrcReplChar := cSrcChar
::cOutReplChar := cOutChar
ENDIF

...
METHOD ToValue( cStr ) CLASS TIniData

LOCAL xVal

IF Empty( cStr ) ; RETURN cStr
ENDIF

IF !Empty( ::cSrcReplChar )
cStr := StrTran( cStr, ::cSrcReplChar, ::cOutReplChar )
ENDIF

...
Это для оформления строк ini как таблица с колонками, задавать надо оба значения сразу, т.е.
o:oMenuData := TIniData():New(o:cMenuFile, .T., , , , "|", ","):Read()
или
o:oMenuData := TIniData():New(o:cMenuFile, .T., , , , chr(9), ""):Read()

содержимое ini, например, такое Скрытый текст


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2278
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.02.24 11:50. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшая добавка


OK

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4520
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.24 11:10. Заголовок: gfilatov2002 пишет К..


gfilatov2002 пишет
 цитата:
Кстати, решил разделить Минигуи на две сборки:


Сборки, по мне, должны содержать WVT, WVG lib, т.к. часто надо делать доступы к разным, чужим базам, почта, ... Это проще делать на WVT (у нас она сделана была как WVG еще на hb 2.0, содержит main menu, statusbar, button, ...). Сейчас иду делать это на свою сбору hb и hmg, т.к. для таких работ не требуется GUI интерфейс, но схожесть нужна

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4521
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.24 13:07. Заголовок: PS Как относится к т..


PS
Как относится к тек. версии hmg, как к конечной ?
След. сборки уже поделятся на 2-е ?
Т.к. новые сборки пока изучишь, пока поймешь, что можно, что нельзя ..., т.е. до реал. использования много времени утечет.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2279
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.02.24 13:22. Заголовок: SergKis пишет: След..


SergKis пишет:

 цитата:
След. сборки уже поделятся на 2-е ?


Да.
Но разница между ними будет только в отсутствии оптимизации кода Минигуи и Харбора в стандартной сборке.
Эти оптимизации будут использованы в платной PRO-версии.
Вот и все.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4522
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.24 13:29. Заголовок: gfilatov2002 пишет Д..


gfilatov2002 пишет
 цитата:
Да.


Тогда под нее, с некоторыми предложенными правками, пример (кому интересно)
Тут https://TransFiles.ru/k17ey

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2280
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.02.24 15:57. Заголовок: SergKis пишет: под ..


SergKis пишет:

 цитата:
под нее, с некоторыми предложенными правками, пример


Спасибо
Поправил функцию IconDll2File() для нового синтаксиса ExtractIconEx() из февральской сборки:
 
*----------------------------------------------------------------------------*
FUNCTION IconDll2File(aIconList, cDirOut, cIconDll, lMsg)
*----------------------------------------------------------------------------*
LOCAL nI, aIcons := {}, cIconSave, nItem, cItem
LOCAL aDim := {}, cPath, lRet, cFile
LOCAL cMsg, cErr := "", nErr := 0
LOCAL oIco := oHmgData()
DEFAULT lMsg := .T., cDirOut := "ICO", ;
cIconDll := "shell32.dll"

IF !HB_ISARRAY(aIconList) ; aIconList := {}
ENDIF

IF !hb_ps() $ cIconDll
cIconDll := Sys.SystemFolder + hb_ps() + cIconDll
ENDIF

lRet := hb_FileExists( cIconDll )

IF !lRet .or. Empty( aIconList )
cMsg := ProcNL()
cMsg += CRLF + Repl("=", Len(cMsg)) + CRLF
cMsg += iif( lRet, "Undefined list of icons !", ;
"DLL icon file not found !" ) + ";"
cMsg += "List of icons:" + " ARRAY[ " + hb_ntos(aIconList) + " ]"
? cMsg
IF lMsg ; AlertStop( cMsg , "Error" )
ENDIF
RETURN NIL
ENDIF

FOR EACH aIcons IN aIconList ; AAdd(aDim, AClone(aIcons))
NEXT

cPath := GetStartUpFolder() + hb_ps() + cDirOut + hb_ps()

IF !hb_DirExists( cPath ) ; hb_DirBuild( cPath )
ENDIF

FOR nI := 1 TO LEN(aDim)
nItem := aDim[nI,2]
cItem := HB_NtoS(nItem)
cFile := ALLTRIM(aDim[nI,3])
cIconSave := cPath + cFile + "#" + cItem + '.ico'

IF hb_FileExists( cIconSave )
oIco:Set ( aDim[nI,1], cIconSave ) // положили key, value
LOOP
ENDIF

AAdd(aIcons, ExtractIconEx( cIconDll, nItem, 32, 32 )[1])
AAdd(aIcons, ExtractIconEx( cIconDll, nItem, 64, 64 )[1])

// icon with number XX to write along the path
lRet := C_SaveHIconToFile( cIconSave, aIcons )
DestroyIcon(aIcons[1]) // ОБЯЗАТЕЛЬНО ! / NECESSARILY !
DestroyIcon(aIcons[2]) // ОБЯЗАТЕЛЬНО ! / NECESSARILY !
aIcons := {}

wApi_Sleep(100)

IF lRet ; oIco:Set( aDim[nI,1], cIconSave ) // положили key, value
ELSE ; cErr += cIconSave + ";" ; nErr++
ENDIF
NEXT

wApi_Sleep(200) ; DO EVENTS

IF nErr > 0 .and. lMsg
cMsg := ProcNL()
cMsg += CRLF + Repl("=", Len(cMsg)) + CRLF
cMsg += cErr
? cMsg
IF lMsg ; AlertStop( cMsg , "Icon is NOT saved !" )
ENDIF
ENDIF

RETURN oIco


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7685
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.02.24 16:21. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
AAdd(aIcons, ExtractIconEx( cIconDll, nItem, 32, 32 )[1])
AAdd(aIcons, ExtractIconEx( cIconDll, nItem, 64, 64 )[1])


128х128 - тоже нужно ОБЯЗАТЕЛЬНО !
Всякие менюшки делать, экраны у всех большие давно уже.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7686
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.02.24 16:22. Заголовок: Иконки размером 256х..


Иконки размером 256х256 в ресурсы включаю, а ехе-ник не собирается.
Так должно быть или нет ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2281
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.02.24 16:49. Заголовок: Andrey пишет: ехе-н..


Andrey пишет:

 цитата:
ехе-ник не собирается


Попробуй сделать таким образом:

 цитата:

ICON256 RCDATA IconVista.ico


а потом используй фнкцию RCDataToFile() для извлечения ресурсов.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7687
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.02.24 18:21. Заголовок: Понял, Спасибо ! :s..


Понял, Спасибо !

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4523
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.02.24 11:15. Заголовок: gfilatov2002 Дораб..


gfilatov2002

Доработанный пример c menu (добавлены языки), надо учитывать, что это не unicode версия. В demo4.mnu файлы показано, как в этом черновике набирать, отлаживать меню (без сборки exe), потом можно переносить отлаженное в ресурсы .\res\_demo4.mnu, с текстами меню поступаем так же, черновики убрал в подкаталог.
Пример тут https://TransFiles.ru/eztyk

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2282
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.02.24 11:37. Заголовок: SergKis пишет: Дора..


SergKis пишет:

 цитата:
Доработанный пример c menu


Спасибо
Но если выбираем второй пункт Config меню -> Themes menu, то получаем ошибку

 цитата:

Error BASE/1004 Метод не экспортирован: NPOST Args: [1] = C

--------------------------------- Stack Trace ---------------------------------
Called from NPOST(0)
Called from (b)CREATE_MENUITEM(437) in module: demo4_func.prg
Called from _DOCONTROLEVENTPROCEDURE(2040) in module: h_windows.prg
Called from EVENTS(1865) in module: h_events.prg
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(1644) in module: h_windows.prg
Called from MAIN(98) in module: demo4.prg



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4524
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.02.24 13:56. Заголовок: gfilatov2002 пишет Н..


gfilatov2002 пишет
 цитата:
Но если выбираем второй пункт Config меню -> Themes menu, то получаем ошибку


Есть такое дело, пропустил добавку к имени контрола (пересеклись имена с Item строкой) в popup, надо сделать правку demo4_func.prg
 
*----------------------------------------------------------------------------*
FUNCTION Create_Menu(cName, cMenu, oMenu, cGrup, cForm, nPost, cFltr, lIncl)
*----------------------------------------------------------------------------*
...
nPop += 1
cTyp := "POPUP"
cGrp := cTyp+ "_" +
cGrup + "_" + hb_ntos(nPop)
cText := aItm[2]
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2283
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.02.24 19:30. Заголовок: SergKis пишет: проп..


SergKis пишет:

 цитата:
пропустил добавку к имени контрола


Спасибо, сейчас все пункты меню работают нормально.
Но в коде этого примера есть два определения функции PromptGetForms():

 цитата:

Warning: Public symbol '_HB_FUN_PROMPTGETFORMS' defined in both module C:\MINIGUI\SAMPLES\1\MENU_POPUP_4\OBJ\TEST4_MENU.OBJ and C:\MINIGUI\SAMPLES\1\MENU_POPUP_4\OBJ\DEMOS_UTIL.OBJ



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4525
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.02.24 19:52. Заголовок: gfilatov2002 пишет Н..


gfilatov2002 пишет
 цитата:
Но в коде этого примера есть два определения функции PromptGetForms():


Эту часть Андрей двигает, я не стал убирать, т.к. и ему перекинул версию. , но можно убрать, целью этого примера была показать возможности работы с ini, объектами-контейнерами, чтение, объединение объектов и создание псевдо объектов ф-я oSys(), где есть свойства и типа методы на основе блоков кода, а так же написания общих, в App.Object событий-блоков кода (не только на окне) и дальнейшее их использование в функциях и схему работы с языками, т.е. языковые тексты лежат в файлах utf8, а работа происходит с конкретной CDP, в данном случае RU1251.
Т.к. это конечная версия hmg в таком виде, то я начал делать во всех окнах и контролах, где можно, Cargo := oHmgData() + в базовых окнах параметры от объекта oHmgData(), т.е. хочу мах. соединиться с версией от 2012 г.
Делаю ~ такие правки Скрытый текст

т.е. версия 24.01 у меня только в архиве.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4526
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.02.24 14:10. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшие правки для multiline Скрытый текст


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2284
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 21.02.24 18:15. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшие правки


OK

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4527
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.02.24 19:36. Заголовок: PS. Использование пр..


PS. Использование правки, например, такое (для Label) Скрытый текст


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2285
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.02.24 13:00. Заголовок: SergKis пишет: Испо..


SergKis пишет:

 цитата:
Использование правки, например


Благодарю за пример
Очень интересно

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2286
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.02.24 13:19. Заголовок: Всем, кому это интересно...


Завершена подготовка новой сборки 24.02, которая будет опубликована на следующей неделе.

Как я уже сообщал ранее, дистрибутив Minigui разделен на две неравные части: стандартную и профессиональную.

Одна часть — это бесплатный установщик Minigui, содержащий отладочную версию библиотеки и стандартный компилятор Harbour без оптимизаций.
Она не содержит примеров готовых приложений или служебных программ, а также библиотеку SqlRdd.

Другая часть представляет собой защищенный паролем архив 7z со всеми расширенными компонентами.
Она содержит сжатую библиотеку Minigui без отладочной информации и оптимизированную виртуальную машину Harbour для приложений с графическим интерфейсом, а также исправленную библиотеку SqlRdd.

Кратко, что нового:
Скрытый текст

Также я подготовил отдельные архивы этой сборки для работы с устаревшим компилятором BCC 5.5.1 (2000 года) и новейшим Embarcadero C++ 7.70 (2023 года)
Ваши комментарии приветствуются...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4528
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.02.24 21:23. Заголовок: gfilatov2002 Добави..


gfilatov2002
Добавил обработку json в THmgData и TIniData, подробнее в архиве в файле read.my, может пригодится
Пример тут https://TransFiles.ru/l4a1g
PS
Переменные App.Cargo без секции, в примере, при создании ini идут в секцию [MAIN] - это можго делать и в др. секцию.
Присвоение (обратите внимание)
App.Cargo:Form_Main := oForm
и
oi:MAIN:oForm := oForm
дают разные результаты
PS2
Пропустил, не убрал отладочную строку в METHOD ToValue( cStr ) CLASS TIniData
? procname(), procline(), cStr

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2287
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.02.24 13:20. Заголовок: SergKis пишет: Доба..


SergKis пишет:

 цитата:
Добавил обработку json в THmgData и TIniData


Благодарю за помощь
Эти изменения буду рассматривать уже для следующей сборки...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2288
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.02.24 11:03. Заголовок: Выложил финальную сб..


Выложил финальную сборку 24.02 с последними исправлениями и дополнениями по адресу

Стандартная версия

SHA-256: c7622385ffbb1b01803252347a0eb35f654f8970f5029fafe8414ec13ab737cd

Желаю всем хорошего дня

P.S. Также на сайте проекта доступна ссылка на архив профессиональной версии (она защищена паролем).

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 4529
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.02.24 12:37. Заголовок: gfilatov2002 1. Так..


gfilatov2002
1. Такие конструкции, по мне, лишние, например в h_alert.prg
 
#ifdef _NAMES_LIST_
This.Cargo := oHmgData()
#endif
...
#ifdef _NAMES_LIST_
LOCAL nY, nX, cIco
#endif
...
#ifdef _NAMES_LIST_
This.Cargo:oTimer := "TIMER"
#endif
...

Они связаны только с использованием bInit, для облегчения жизни при обработке. oHmgData() есть всегда, а _NAMES_LIST_ только для использования списка переменных вместо PUBLIC переменных.

2. Давно хотел предложить, но вылетало из головы, для таймеров ставить Enabled := .F. сразу, что бы не было ложных срабатываний до ON INIT и лишних команд к DEFINE TIMER oTimer ... -> This.oTimer.Enabled := .F.

3.
 
*-----------------------------------------------------------------------------*
FUNCTION AlertExclamation ( Message, Title, Icon, nSize, aColors, lTopMost, bInit, lNoSound )
*-----------------------------------------------------------------------------*
LOCAL nWaitSec

IF HB_ISARRAY( Title )
nWaitSec := Title[2]
Title := Title[1]
ENDIF
...
*-----------------------------------------------------------------------------*
FUNCTION AlertInfo ( Message, Title, Icon, nSize, aColors, lTopMost, bInit, lNoSound )
*-----------------------------------------------------------------------------*
LOCAL nWaitSec

IF HB_ISARRAY( Title )
nWaitSec := Title[2]
Title := Title[1]
ENDIF
...
*-----------------------------------------------------------------------------*
FUNCTION AlertStop ( Message, Title, Icon, nSize, aColors, lTopMost, bInit, lNoSound )
*-----------------------------------------------------------------------------*
LOCAL nWaitSec

IF HB_ISARRAY( Title )
nWaitSec := Title[2]
Title := Title[1]
ENDIF
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2289
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.02.24 13:35. Заголовок: SergKis пишет: Таки..


SergKis пишет:

 цитата:
Такие конструкции, по мне, лишние


Это подстраховка, если библиотека собрана без использования NAMES_LIST (например, для xHarbour).

SergKis пишет:

 цитата:
для таймеров ставить Enabled := .F. сразу


Это не всегда удобно. Но, возможно, надо добавить команду-переключатель этого режима

Благодарю за Ваши предложения
Они всегда двигают наш проект вперед...

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 11
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет