Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть V) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть V) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Andrey: Haz пишет: В качестве подтверждения - твой свежий вопрос по TSBrowse : - "Как поменять картинку в уже сформированной таблице ?" Ответ есть и в исходниках и даже в примерах ..... Я так и не нашёл... Сделал по другому... Если не сложно - ткни где это ? Haz пишет: PS Притом мараторий же временный Но если временный, то тогда ладно...

Haz: Andrey пишет: Если не сложно - ткни где это ? в примере 3.5к размером Tsb_Cursor.prg в зависимости от условия If( oBrw:lDrawSelect ..... или рисуется или не рисуется . Вместо НЕ рисуется можно рисовать другую и по другому условию oBrw:GetColumn( 'DATE' ):uBmpCell := {|| If( oBrw:lDrawSelect, LoadImage( "Calendar.BMP" ), NIL ) }

Andrey: Haz пишет: в примере 3.5к размером Спасибо БОЛЬШОЕ ! Смотрел же это пример.


gfilatov2002: Выпустил очередной релиз библиотеки. При этом изменена схема нумерации сборок на "Год.Месяц" Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-15.12-setup.zip Также доступна сборка для компилятора MinGW по адресу: http://hmgextended.com/files/CONTRIB/hmg1512-mingw.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1512_xhb10138.zip Обновление к этой версии рекомендуется для всех предыдущих сборок... Благодарю за внимание

Andrey: Пересобрал свой большой проект ! Полёт нормальный !

gfilatov2002: Andrey пишет: Полёт нормальный Благодарю за подтверждение Для справки: основные изменения в новой сборке были связаны с перелопачиванием всего Си-кода для 64-битной совместимости и исправлением небольших неточностей в PRG-коде ядра библиотеки. Ожидаю отчета о переходе на новую версию и от других пользователей...

Haz: gfilatov2002 пишет: Ожидаю отчета о переходе на новую версию и от других пользователей... Пересобрал пару проектов , собираются без замечаний. Запускаются , работают. Все не тестировал, т.к. много , основное нормально пашет

gfilatov2002: Просто к сведению. Выпустил сегодня RC для очередной сборки библиотеки, которая выйдет на следующей неделе... Полный список изменений см. ниже [pre2] * Modified: Using of the C-function hb_vmPushNumInt() instead of hb_vmPushLong() for proper 64-bit handling in the MiniGUI core. Based upon a workaround of Przemyslaw Czerpak <druzus/at/priv.onet.pl>. Contributed by Dr. Claudio Soto <srvet@adinet.com.uy>. * Updated: Modified the application manifest for compatibility with Windows 10. A manifest file is common now for 32- and 64-bit builds. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see Windows7.Manifest in folder \Resources) * Updated: HbSQLite3 library: - update for using a recent SQLITE3 version 3.10.0. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - Fixed: Correction of the editable status in the method KeyDown. Problem was reported by Dusko Radojcin. Based upon a contribution of Janusz Pora <januszpora@onet.eu>. * Updated: Harbour Compiler 3.2.0dev (SVN 2016-01-09 20:57): * New: added HBFOXPRO library (see in folder \Harbour\Lib); * New: added HBGZIO library (see in folder \Harbour\Lib); * Updated: OpenSSL wrapper for using 1.0.2e version. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: HMGS-IDE v.1.3.0 Project Manager and Two-Way Visual Form Designer: - fixed minor typo in the Image control definition. Bug was reported by Pete Dionysopoulos <pete_westg@yahoo.gr>. Contributed by Grigory Filatov <gfilatov@inbox.ru> * New: 'Vista Command Link Button' sample: - Command Link Button control was defined as user component below: @ <row>,<col> CLBUTTON <name> OF <parent> ; CAPTION <caption> NOTETEXT <notes> ; ACTION <action> [ <default: DEFAULT> ] - added pseudo-OOP method SetShield for showing of the Admin privilege requiring. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\CommandLink) * Updated: 'Print Pie Graph' sample: - updated the data for December 2015. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'NirCmd Dll Usage' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\NirCmdDll) * Updated: 'Volume Info' sample: - added a sample with using of the updated CallDll32 function. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo3.prg in folder \samples\Advanced\VOLUME_INFO) * Updated: 'Windows Version' sample: - fixed Windows 10 detection. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\WinVersion) [/pre2] Также убрал статус beta у 64-битной сборки (вроде, нареканий не было либо никто не пробовал )

gfilatov2002: Выпустил очередной релиз библиотеки с исправлением обнаруженных неточностей кода. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.01-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1601-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1601.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1601_xhb10138.zip Благодарю за внимание

Haz: gfilatov2002 пишет: Благодарю за внимание Григорий , спасибо! Постоянно , слежу и пробую "на вкус" все новое в твоем проекте.

Andrey: gfilatov2002 пишет: * Updated: Modified the application manifest for compatibility with Windows 10. A manifest file is common now for 32- and 64-bit builds. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see Windows7.Manifest in folder \Resources) Теперь программы собираются сразу для Windows7 и выше ?

gfilatov2002: Andrey пишет: Теперь программы собираются сразу для Windows7 и выше ? Нет, это определяется не манифестом, а использованным Си-компилятором: - для ВСС 5.5 - от Win98 и выше; - для MinGW - от WinXP и выше; - для PellesC - от Win7 и выше.

Andrey: Некорректно спросил. Имел в виду, что размеры форм, шрифта будет правильно отображаться в Win7 по Win10 и не наезжать друг на друга под разными системами. Я уже протестировал - всё классно получается ! Спасибо !

Andrey: Читаю в MiniGUI.chm "MiniGui 16 Extend" функции GetMyDocumentsFolder() и GetModuleFilename() Ставлю к себе в программу, не собирается: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '_HB_FUN_GETMODULEFILENAME' referenced from ... Error: Unresolved external '_HB_FUN_GETMYDOKUMENTSFOLDER' referenced from ... hbmk2[IEntrepreneur]: Error: Running linker. 2 Поиск по всей папке MiniGUI не дал ничего ! Где эти функции ?

Alex_Cher: Уважаемый Григорий, наткнулся в примерах ... сбой в программах на фукции MsgMiniGuiError() ... Например - Application: C:\MiniGUI\SAMPLES\BASIC\Histogram\demo.exe Date: 01/28/16 Time: 13:25:41 Time from start: 0 days 0 hours 0 mins 11 secs Error MGERROR/0 Control: Graph_Title Of Veamos Not defined. Program terminated. Called from MSGMINIGUIERROR(94) Called from SETPROPERTY(3661) Called from ELGRAFICO(139) Called from (b)PRESENTA(4) Called from _PROCESSINITPROCEDURE(1511) Called from _ACTIVATEWINDOW(1363) Called from PRESENTA(52) Called from (b)MAIN(699) Called from _DOCONTROLEVENTPROCEDURE(1670) Called from EVENTS(1583) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1388) Called from MAIN(24) Описание этой фукции MsgMiniGuiError() выдачи наименования ошибки нигде не нашел ...

Haz: Alex_Cher пишет: Описание этой фукции MsgMiniGuiError() выдачи наименования ошибки нигде не нашел ... Плохо искал MiniGui\Source\h_error.prg [pre2] *-----------------------------------------------------------------------------* *-Date Created: 01-01-2003 *-Author: Antonio Novo <antonionovo@gmail.com> *-Modified by Grigory Filatov at 24-08-2014 *-----------------------------------------------------------------------------* FUNCTION MsgMiniGuiError( cMessage, lAddText ) *-----------------------------------------------------------------------------* cMessage += iif( hb_defaultValue( lAddText, .T. ), " Program terminated.", "" ) RETURN Eval( ErrorBlock(), _HMG_GenError( cMessage ) ) [/pre2] А в примере MiniGUI\SAMPLES\BASIC\Histogram\demo.exe ошибка происходит потому, что гистограмма пытается вывести заголовок (Title), который был удален руками из поля редактирования.

Alex_Cher: ВНИМАНИЕ ВСЕМ кто перегнал свои проекты под последнюю сборку 16.01 Функция конвертации текстового файла в DBF работает не корректно - append from _FailName.txt delimited with "," Файл DBF получается с совершенной измененным записями не соответсвующими исходнику. Срочно перегнал проект под сборку 15.12 - работает нормально. Уважаемый Григорий прошу обратить вниманине ...

gfilatov2002: Alex_Cher пишет: прошу обратить вниманине Эта проблема уже решена Пржемеком в последней версии Харбора на сервере GitHub Last ChangeLog entry: 2016-02-01 14:55 UTC+0100 Przemyslaw Czerpak Исправленная версия Харбора будет включена в следующую сборку минигуи 16.02

Andrey: А проблемы с индексами CDX нет случайно тоже ? А то второй день борюсь с кодом... Индекс ломается при закрытии... Ну точно, откатился на старую версию, работает...

SergKis: gfilatov2002 У себя с TsBrowse сделел правку: METHOD DrawHeaders( lFooters ) [pre2]... было If lOrder //V90 Default lDescend := .F., ::aSortBmp := { StockBmp( 4 ), StockBmp( 5 ) } hBitMap := ::aSortBmp[ If( lDescend, 2, 1 ) ] nAlign := nMakeLong( DT_LEFT, DT_RIGHT ) ... стало nAlign := nMakeLong( nAlign, DT_RIGHT ) [/pre2]

SergKis: gfilatov2002 еще ввел в TSColumn.prg DATA lNoDescend AS LOGICAL INIT .F. // No descending order flag ( dbf ) и в TsBrowse для работы с ордером METHOD SetOrder( nColumn, cPrefix, lDescend ) [pre2]... было If ::lIsDbf .and. ! Empty( oColumn:cOrder ) //V90 If nColumn == ::nColOrder .or. oColumn:lDescend == Nil //V90 If lDescend == Nil lDescend := If( Empty( ::nColOrder ) .or. oColumn:lDescend == Nil, .F., ! oColumn:lDescend ) EndIf ( ::cAlias )->( OrdDescend( ,, lDescend ) ) oColumn:lDescend := lDescend ... стало EndIf If oColumn:lNoDescend lDescend := .F. Else ( ::cAlias )->( OrdDescend( ,, lDescend ) ) EndIf oColumn:lDescend := lDescend ... [/pre2] не всегда мне descend нужет на dbf

Haz: Григорий, добавил в метод SetBtnGet() поддержку символьного имени колонки. Если можно - включите это в сборку. [pre2] METHOD SetBtnGet( nColumn, cResName, bAction, nBmpWidth ) CLASS TSBrowse Default nBmpWidth := 16 nColumn := if( ValType( nColumn ) == "C", ::nColumn( nColumn ), nColumn ) If nColumn == Nil .or. nColumn > Len( ::aColumns ) .or. nColumn <= 0 Return Self EndIf ::aColumns[ nColumn ]:cResName := cResName ::aColumns[ nColumn ]:bAction := bAction ::aColumns[ nColumn ]:nBmpWidth := nBmpWidth ::aColumns[ nColumn ]:lBtnGet := .t. Return Self [/pre2] Теперь можно вместо oBrw:SetBtnGet( oBrw:nColumn("TEST"), "", { |oEdit, xVar| ....... } , 32 ) так oBrw:SetBtnGet( "TEST", "", { |oEdit, xVar| ....... } , 32 ) , что гораздо читабельнее

gfilatov2002: Haz пишет: включите это в сборку Не вопрос - уже сделал SergKis Для отключения сортировки колонок есть переменная lNoChangeOrd в классе TSBrowse

SergKis: gfilatov2002 Как я понял, флаг lNoChangeOrd - отменяет переключение ордеров при .T. вообще, а при .F. SetOrder(...) работает с переключением lDescend := .F.\.T. и если на теге dbf ключ по возрастанию, то обратную сортировку не отключить (в тек. версии), у меня не получилось. А что с постом 846 предыдущего листа. Там, на мой взгляд, ошибка, т.е. центрованный текст в шапке прыгает влево при SetOrder(...) на колонку, а nAlign определяется выше по тексту

gfilatov2002: SergKis пишет: на мой взгляд, ошибка, т.е. центрованный текст в шапке прыгает влево Благодарю за разъяснение! Действительно, при переключении сортировки игнорируется текущее выравнивание колонки (так - у автора библиотеки). Поправил для новой сборки SergKis пишет: обратную сортировку не отключить (в тек. версии) Да, все верно! Но, если обратная сортировка колонки пользователем не нужна, то тогда просто можно отменить сортировку, ведь остается только прямая сортировка Или я что-то упустил...

SergKis: gfilatov2002 пишет:тогда просто можно отменить сортировку [pre2] METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) ... ElseIf nClickRow == 0 .and. ::lDrawHeaders .and. ! ::lNoChangeOrd // GF 1.71 If ::bLDblClick != Nil .and. ::aActions == Nil Eval( ::bLDblClick, uPar1, uPar2, nKeyFlags, Self ) Else ::SetOrder( ::nAtCol( nColPix, ! ::lSelector ) ) //V90 EndIf ... [/pre2] колонок со связанными тегами может быть от 2-х и больше, т.е. управление\переключение ими затруднено

SergKis: PS. поставив oCol:cOrder := <тег наме> нескольким колонкам, далее по переключению все делает TsBrowse, без внешнего управления

gfilatov2002: SergKis пишет: поставив oCol:cOrder := <тег наме> нескольким колонкам Понял, добавлю переменную lNoDescend, как было предложено выше

Haz: Григорий , еще поправочка в TSBrowse Описание проблемки: Установку фильтра на базу обычно делаю так : [pre2](oBrw:cAlias)->dbSetFilter() (oBrw:cAlias)->dbGoTop() oBrw:Reset()[/pre2] Если фильтр возвращает 0 записей , то в методе ::Reset() по ::GoTop() или ::GoBottom() игнорируется выполнение блока bChange. т.к. в исходниках при ::nLen < 1 сразу идет Return Self Но по сути ведь произошло перепозиционирование записи с какой то до фильтра, на Bof() или Eof() и по логике bChange должен сработать. У меня по bChange висит вывод комментария по текущей записи в окно и получаю что записей нет, а коммент остался. Мне не сложно после Reset выполнить Eval( oBrw:bChange ) , но есть ощущение что это не наш метод Решение Можно подправить методы ::GoTop() или ::GoBottom() чтобы перед Return Self вызывался bChange, но думаю проще это один раз сделать в ::Reset(). Тем более эта ситуация возникает только в случае когда явно этот ::Reset() требуется Предлагаю такую концовку метода ::Reset() [pre2] ::Refresh( .T., .T. ) If ::nLen <1 .and. ::bChange != Nil Eval( ::bChange, Self, 0 ) EndIf Return Self [/pre2]

gfilatov2002: Haz пишет: еще поправочка в TSBrowse Принято с благодарностью

gfilatov2002: Просто к сведению. Выпустил сегодня RC для очередной сборки библиотеки, которая выйдет на следующей неделе... Полный список изменений см. ниже [pre2] * Fixed: The compilation of the MiniGUI core in the newer BCC versions (tested since 5.82 to 7.0). Problem was reported by Ivanil Marcelino <ivanil@linkbr.com.br>. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Fixed: CallDll library source code: - renamed CallDll32() to HMG_CallDLL() for avoiding of the names conflict with the function in the HbMisc contrib library. Note: This is an INCOMPATIBLE change. Problem was reported by Pete Dionysopoulos <pete_westg@yahoo.gr>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \Source\CallDll). * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - added handling of the variable :lNoDescend from TSColumn class; - fixed header aligning at the switching of the column order. Contributed by SergKis. * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.11.0dev (from 3.10.0). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2016-02-10 17:17): * Fixed: APPEND FROM ... DELIMITED and APPEND FROM ... SDF bugs; * Updated: HbNetIO contrib library; (see readme.txt in folder \samples\Basic\NETIO\Server); * Updated: most important differences between Harbour and xHarbour (see xhb-diff.txt in folder \harbour\doc) Contributed by Przemyslaw Czerpak <druzus/at/priv.onet.pl> (look at ReadMe.txt in folder \harbour) * Updated: HMGS-IDE v.1.3.0 Project Manager and Two-Way Visual Form Designer: - correction of 'out of array range' error in the internal function cTypeOfControl(). Contributed by Grigory Filatov <gfilatov@inbox.ru> * New: 'Test Print a Plain Text File' sample. Based upon a contribution by Bicahi Esgici <esgici@gmail.com>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\MiniPrint_3) * New: 'Transfer Grid data to HTML file' sample. Based upon a contribution of S.Rathinagiri <srgiri@dataone.in>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\Grid2HTML) * New: 'SQLCipher usage' sample is based on SQLCipher encryption for SQLite (https://www.zetetic.net/sqlcipher). It is mingw32-based lib only. Based upon a contribution of S.Rathinagiri <srgiri@dataone.in>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\sqlcipher) * Updated: 'Vista Command Link Button' sample: - expanded syntax: @ <row>,<col> CLBUTTON <name> OF <parent> ; [ WIDTH <w> ] [ HEIGHT <h> ] ; CAPTION <caption> NOTETEXT <notes> ; ACTION <action> [ <default: DEFAULT> ] Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\CommandLink) * Updated: 'HMGTALK Client' sample for using of the function CallDll32() from the Harbour hbmisc library. (see demo in folder \samples\Advanced\HMGTALK) [/pre2] Кстати, мои результаты тестирования скорости текущей версии Харбора см. ниже [pre2] 2016.02.10 21:11:45 Windows 10 10.0.0 Harbour 3.2.0dev (r1602101617) Borland C++ 5.5.1 (32-bit) x86 THREADS: 0 N_LOOPS: 1000000 [ T000: empty loop overhead ]...................................0.05 ==================================================================== [ T001: x := L_C ]..............................................0.00 [ T002: x := L_N ]..............................................0.00 [ T003: x := L_D ]..............................................0.00 [ T004: x := S_C ]..............................................0.02 [ T005: x := S_N ]..............................................0.02 [ T006: x := S_D ]..............................................0.00 [ T007: x := M->M_C ]...........................................0.03 [ T008: x := M->M_N ]...........................................0.02 [ T009: x := M->M_D ]...........................................0.02 [ T010: x := M->P_C ]...........................................0.02 [ T011: x := M->P_N ]...........................................0.02 [ T012: x := M->P_D ]...........................................0.02 [ T013: x := F_C ]..............................................0.00 [ T014: x := F_N ]..............................................0.00 [ T015: x := F_D ]..............................................0.00 [ T016: x := o:Args ]...........................................0.08 [ T017: x := o[2] ].............................................0.06 [ T018: round( i / 1000, 2 ) ]..................................0.11 [ T019: str( i / 1000 ) ].......................................0.38 [ T020: val( s ) ]..............................................0.13 [ T021: val( a [ i % 16 + 1 ] ) ]...............................0.23 [ T022: dtos( d - i % 10000 ) ].................................0.27 [ T023: eval( { || i % 16 } ) ].................................0.19 [ T024: eval( bc := { || i % 16 } ) ]...........................0.13 [ T025: eval( { |x| x % 16 }, i ) ].............................0.16 [ T026: eval( bc := { |x| x % 16 }, i ) ].......................0.13 [ T027: eval( { |x| f1( x ) }, i ) ]............................0.20 [ T028: eval( bc := { |x| f1( x ) }, i ) ]......................0.19 [ T029: eval( bc := &("{ |x| f1( x ) }"), i ) ].................0.17 [ T030: x := &( "f1(" + str(i) + ")" ) ]........................1.36 [ T031: bc := &( "{|x|f1(x)}" ), eval( bc, i ) ]................1.81 [ T032: x := valtype( x ) + valtype( i ) ].....................0.22 [ T033: x := strzero( i % 100, 2 ) $ a[ i % 16 + 1 ] ]..........0.42 [ T034: x := a[ i % 16 + 1 ] == s ].............................0.16 [ T035: x := a[ i % 16 + 1 ] = s ]..............................0.19 [ T036: x := a[ i % 16 + 1 ] >= s ].............................0.19 [ T037: x := a[ i % 16 + 1 ] <= s ].............................0.19 [ T038: x := a[ i % 16 + 1 ] < s ]..............................0.19 [ T039: x := a[ i % 16 + 1 ] > s ]..............................0.19 [ T040: ascan( a, i % 16 ) ]....................................0.14 [ T041: ascan( a, { |x| x == i % 16 } ) ].......................1.58 [ T042: iif( i%1000==0, a:={}, ) , aadd(a,{i,1,.T.,s,s2,a2 ]....0.48 [ T043: x := a ]................................................0.00 [ T044: x := {} ]...............................................0.05 [ T045: f0() ]..................................................0.02 [ T046: f1( i ) ]...............................................0.05 [ T047: f2( c[1...8] ) ]........................................0.03 [ T048: f2( c[1...40000] ) ]....................................0.03 [ T049: f2( @c[1...40000] ) ]...................................0.02 [ T050: f2( @c[1...40000] ), c2 := c ]..........................0.05 [ T051: f3( a, a2, s, i, s2, bc, i, n, x ) ]....................0.22 [ T052: f2( a ) ]...............................................0.03 [ T053: x := f4() ].............................................0.48 [ T054: x := f5() ].............................................0.11 [ T055: x := space(16) ]........................................0.08 [ T056: f_prv( c ) ]............................................0.17 ==================================================================== [ total application time: ]....................................13.59 [ total real time: ]...........................................13.64 [/pre2]

Alex_Cher: Уважаемый Григорий, C:\MiniGUI\SAMPLES\BASIC\ActiveX\Demo.prg жалуется на устаревшую версию браузера - click here возможно ли сделать обновление ..?

Haz: Alex_Cher пишет: возможно ли сделать обновление ..? Скорее всего обновление требуется антивирусу на компе. ActiveX тут не причем, к сожалению похоже на браузерный вирус PS. Хотя может и сам IE7 уже пора на пенсию , ему больше 10 лет )))

gfilatov2002: Alex_Cher пишет: жалуется на устаревшую версию браузера Просто надо обновить Internet Explorer, который используется компонентом ActiveX. Если установленная система позволяет, то - до версии 11 (иначе 9).

SergKis: gfilatov2002 еще правочка, выделенным цветом добавка [pre2] METHOD LButtonUp( nRowPix, nColPix, nFlags ) CLASS TSBrowse ... If nClickRow == 0 .or. nClickRow == -2 if nColPix > ::nLeft .and. ::nDragCol != nDestCol If ::lMoveCols ::MoveColumn( ::nDragCol, nDestCol ) Else ::Exchange( ::nDragCol, nDestCol ) EndIf elseif ::nDragCol = nDestCol If ::aColumns[ nDestCol ]:bHLClicked != Nil ::DrawHeaders() Eval( ::aColumns[ nDestCol ]:bHLClicked, nRowPix, nColPix, ::nAt, Self ) ::DrawHeaders() EndIf Endif EndIf ... METHOD RButtonDown( nRowPix, nColPix, nFlags ) CLASS TSBrowse ... If ::aColumns[ nCol ]:bHRClicked != Nil Eval( ::aColumns[ nCol ]:bHRClicked, uPar1, uPar2, ::nAt, Self ) EndIf ElseIf lSpecHd If ::aColumns[ nCol ]:bSRClicked != Nil Eval( ::aColumns[ nCol ]:bSRClicked, uPar1, uPar2, ::nAt, Self ) EndIf ElseIf lFooter If ::aColumns[ nCol ]:bFRClicked != Nil Eval( ::aColumns[ nCol ]:bFRClicked, uPar1, uPar2, ::nAt, Self ) EndIf EndIf ... [/pre2]

gfilatov2002: SergKis пишет: еще правочка Принимается с благодарностью

gfilatov2002: Сегодня выпущен очередной релиз библиотеки MiniguiEx. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.02-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1602-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1602.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1602_xhb10138.zip Благодарю за Ваше внимание и поддержку данного проекта

Andrey: Перешёл на новую версию 16.02 и сразу же вопрос. SergKis пишет: на мой взгляд, ошибка, т.е. центрованный текст в шапке прыгает влево gfilatov2002 пишет: Благодарю за разъяснение! Действительно, при переключении сортировки игнорируется текущее выравнивание колонки (так - у автора библиотеки). Поправил для новой сборки А как сделать по старому ? Чтобы текст шапки при переключении - прыгал влево ! Мне это больше нравится, т.к. значок стрелки вниз/вверх затирается текстом шапки. Вот картинка:

gfilatov2002: Andrey пишет: А как сделать по старому ? Попробуй библиотеку по ссылке http://hmgextended.com/files/MISC/tsbrowse-lib.zip

SergKis: Андрей пишет:А как сделать по старому ? Чтобы текст шапки при переключении - прыгал влево ! Мне это больше нравится, т.к. значок стрелки вниз/вверх затирается текстом шапки. Пощелкай на колонке FullPath и слово прыгнет влево, т.к. колонка широкая - выглядит такое мелькание ужасно, не проще подправить для узкой колонки сразу текст влево, не в центр, можно добавить к тексту слева пару пробелов.

Andrey: gfilatov2002 пишет: Попробуй библиотеку по ссылке Спасибо ! Но это времянка... Нужен ключ какой то сделать. Одним нравиться без прыганья, другим наоборот.

SergKis: Andrey пишет:Нужен ключ какой то сделать. Одним нравиться без прыганья, другим наоборот. для прыганья можно ставить на колонку: oBrw5:aColumns[2]:nHAlign := {|nCol,oBrw| If( nCol == oBrw:nColOrder, DT_LEFT, oBrw:aColumns[nCol]:nHAlign ) } или oBrw5:aColumns[2]:nHAlign := {|nCol,oBrw| If( nCol == oBrw:nColOrder, DT_LEFT, DT_CENTER ) }

Andrey: SergKis пишет: для прыганья можно ставить на колонку: То что надо ! Спасибо !

SergKis: gfilatov2002 Для управления сортировкой колонок при ::lIsArr == .T. (включить\выключить) более простым способом (без bSetOrder) предлагаю использовать переменную колонки (TsColumn) lIndexCol, при работе с массивом она не используется, т.е. oCol:lIndexCol := .T.\.F. - сортируется\нет колонка. Изменения следующие: [pre2] METHOD SetOrder( nColumn, cPrefix, lDescend ) CLASS TSBrowse ... ElseIf ::lIsArr If nColumn <= Len( ::aArray[ 1 ] ) .and. oColumn:lIndexCol ::cOrderType := ValType( ::aArray[ ::nAt, nColumn ] ) ... METHOD New( cHeading, bData, cPicture, aColors, aAlign, nWidth, ; lBitMap, lEdit, bValid, lNoLite, cOrder, cFooting, ; bPrevEdit, bPostEdit, nEditMove, lFixLite, a3DLook, ; bWhen, oBrw, cData, cWhen, cValid, cPrevEdit, cPostEdit, cMsg, cToolTip, lTotal, ; lSpinner, bUp, bDown, bMin, bMax, cError, cSpcHeading,; cDefData, cName , lIndexCol ) CLASS TSColumn ... Default cHeading := "" , ; ... cName := "" If ! empty(oBrw) .and. oBrw:lIsArr // для работы по старому алгоритму - все колонки сортируются lIndexCol := .T. EndIf .. [/pre2] выделенным добавки тогда в программе можно колонкам без сортировки (массив) поставить oCol:lInexCol := .F. попробовал на своей версии - сработало. Может что не учел ?

SergKis: PS поправочка в последнем добавлении If ... ::lIndexCol := .T.

gfilatov2002: SergKis пишет: предлагаю использовать переменную колонки (TsColumn) lIndexCol Принимается

SergKis: gfilatov2002 пишет:Принимается тогда можно добавить обработку lNoDescend (для одинаковости с ::lIsDbf == .T.) [pre2] ElseIf ::lIsArr If nColumn <= Len( ::aArray[ 1 ] ) .and. oColumn:lIndexCol ::cOrderType := ValType( ::aArray[ ::nAt, nColumn ] ) //V90 If nColumn == ::nColOrder .or. Empty( oColumn:cOrder ) .or. oColumn:lDescend == Nil If lDescend == Nil lDescend := If( Empty( oColumn:cOrder ) .or. oColumn:lDescend == Nil, .F., ! oColumn:lDescend ) EndIf If oColumn:lNoDescend lDescend := .F. EndIf oColumn:lDescend := lDescend ::nColOrder := nColumn ... [/pre2]

gfilatov2002: SergKis пишет: можно добавить обработку lNoDescend OK

SergKis: gfilatov2002 Правка [pre2] METHOD DrawLine( xRow ) CLASS TSBrowse ... было ( line 2913 ) If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" .and. ! Empty( ::aBitMaps ) If uData > 0 .and. uData <= Len(::aBitMaps) uBmpCell := ::aBitMaps[ uData ] EndIf nAlign := nMakeLong( oColumn:nAlign, oColumn:nAlign ) uData := "" ElseIf Empty( cPicture ) uData := If( Valtype( uData ) != "C", cValToChar( uData ), uData ) Else uData := If( uData == NIL, "", Transform( uData, cPicture ) ) EndIf ... ( line 2969 ) If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" ElseIf oColumn:lEmptyValToChar .and. empty(uData) uData := "" EndIf ... стало If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" .and. ! Empty( ::aBitMaps ) If uData > 0 .and. uData <= Len(::aBitMaps) uBmpCell := ::aBitMaps[ uData ] EndIf nAlign := nMakeLong( oColumn:nAlign, oColumn:nAlign ) uData := "" ElseIf ! lCheck .and. oColumn:lEmptyValToChar .and. empty(uData) uData := "" ElseIf Empty( cPicture ) uData := If( Valtype( uData ) != "C", cValToChar( uData ), uData ) Else uData := If( uData == NIL, "", Transform( uData, cPicture ) ) EndIf ... If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" EndIf ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... было ( line 3227 ) If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" .and. ! Empty( ::aBitMaps ) If uData > 0 .and. uData <= Len(::aBitMaps) uBmpCell := ::aBitMaps[ uData ] nAlign := nMakeLong( LoWord( nAlign ), nAlign ) uData := "" EndIf ElseIf Empty( cPicture ) uData := If( Valtype( uData ) != "C", cValToChar( uData ), uData ) Else uData := If( uData == NIL, "", Transform( uData, cPicture ) ) EndIf ... стало If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" .and. ! Empty( ::aBitMaps ) If uData > 0 .and. uData <= Len(::aBitMaps) uBmpCell := ::aBitMaps[ uData ] nAlign := nMakeLong( LoWord( nAlign ), nAlign ) uData := "" EndIf ElseIf ! lCheck .and. oColumn:lEmptyValToChar .and. empty(uData) uData := "" ElseIf Empty( cPicture ) uData := If( Valtype( uData ) != "C", cValToChar( uData ), uData ) Else uData := If( uData == NIL, "", Transform( uData, cPicture ) ) EndIf [/pre2]

gfilatov2002: SergKis Благодарю за поправки, уже сделал эти исправления Но хотелось бы получить также небольшое пояснение по этому поводу

SergKis: gfilatov2002 пишет:пояснение по этому поводу начал делать реальную задачу, получилось nValToChar отрабатывала раньше по тексту и для числа пустого уже uData =='0.00', т.е алгоритм не работал, потому перенес выше по тексту (исключив lCheck==.T.), а в DrawSelect обработка пропущена и в строке с курсором lEmptyValToChar совсем не работал

gfilatov2002: SergKis пишет: начал делать реальную задачу Благодарю за разъяснение, желаю успеха в Ваших делах

fokinal21: Всем доброго здравия! Скажите, а IDE никак не прикручивается к 64 разрядной версии? Или здесь он не катит, нужен другой?

gfilatov2002: Просто к сведению. Выпустил сегодня очередную бета-версию для новой сборки библиотеки. Полный список изменений см. ниже [pre2] * Fixed: The hack in the menu's C-code was guarded for applying at the tray menu closing only. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Modified: The constant _PUBLIC_RELEASE_ is turned ON by default in the header file include\minigui.ch instead of the constant _ZEROPUBLIC_. The internal Public variables will be released at window's and control's destruction. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Replacing the cycles 'For-Next' with 'For Each-Next' for improvement of the speed of the Tab pages updating. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - added a new class TCursor for proper processing of TBROWSE cursor which was defined by user for a whole control. Syntax: TCursor():New( cResCursorName [, cPredefinedCursorName ] ) where the predefined names are "ARROW", "IBEAM", "WAIT", "CROSS" etc. Sample code: oBrw:oCursor := TCursor():New( , "HAND" ) Contributed by Grigory Filatov <gfilatov@inbox.ru> - added handling of the column's order in the ARRAY mode with using of the TSColumn variable oCol:lIndexCol. Contributed by SergKis (see demo at Menu TSBrowse->'Grid form' in folder \samples\Advanced\TSBrowse) - added a new service method GetCellInfo( nRowPos, nCell, lColSpecHd ) Contributed by SergKis (see demo2.prg in folder \samples\Advanced\Tsb_array_2) * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.12.0dev (from 3.11.0). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2016-02-18 17:02): * Fixed: HbZipArc library source code to support the ASCII characters above 128 in the name of files (see in folder \Source\HbZipArc). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: HMGS-IDE v.1.3.0 Project Manager and Two-Way Visual Form Designer. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look for what's new at changelog.txt in folder \Ide) * New: 'Minigui Modal Form Designer Utility' sample (spanish only). Contributed by Rafael Moran <webrmoran[at]yahool.com> Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \Utils\xForm) * New: 'Gregorian Calendar to Microsoft Excel through HMG OLE' sample. Contributed by Danny A. del Pilar <dhaine_adp@yahoo.com>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\GregorianCalendar) * Updated: 'Vista Command Link Button' sample: - added a write only property 'NoteText'. You can set this property at runtime: Win.CLbutton.NoteText := 'New Note' SetProperty( Form, Control, 'NoteText', 'New Note' ) Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\CommandLink) * Updated: 'SendMailReport Enhanced 1.5' sample. Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see in folder \samples\Applications\SendMailReport) [/pre2] Поздравляю всех женщин (-программистов) на форуме с наступающим

SergKis: gfilatov2002 доделел ToolTip на TsBrowse. 1. Работает на всех колонках, строках с индикацией смены nRow, nCol мышой 2. убрал STATIC nToolTip, lToolTip, hToolTip, перенеся их в класс TSB 3. можно задавать ToolTiip так: oBrw:cToolTip := {|oBr,nCol,nRow| "My TBrowse tooltip. Col ="+str(nCol,3)+" Row ="+str(oBr:nRow,3) } aEval(oBrw:aColumns, {|oCol| oCol:cToolTip := {|oBr,nCol,nRow| "My column tooltip. Col ="+str(nCol,3)+" Row ="+str(oBr:nRow,3) } }) Изменения: [pre2] h_tsbrowse.prg было Static nLapsus, hPrvWnd, hWndParent, lToolTip, nToolTip, hToolTip := 0 //V90 ... ///////////////////////////////////////// Function _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight,; ... ParentFormHandle = GetFormHandle (ParentFormName) hToolTip := GetFormToolTipHandle (ParentFormName) oBrw := TSBrowse():New( ControlName, nRow, nCol, nWidth, nHeight,; ... lTransparent, uSelector, lEditable, lAutoCol, aColSel, tooltip) IF ( nColums := Len(oBrw:aColumns) ) > 0 /* BK 18.05.2015 */ ... ///////////////////////////////////////// CLASS TSBrowse FROM TControl ... DATA cToolTip // tooltip when mouse is over Cells ... ///////////////////////////////////////// METHOD New( cControlName, nRow, nCol, nWidth, nHeight, bLine, aHeaders, aColSizes, cParentWnd, ; ... EndIf SetToolTip ( ::hWnd , ::cToolTip , hToolTip ) //JP V90 IF nValue > 0 .AND. nValue <= ::nLen ... ///////////////////////////////////////// METHOD MouseMove( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse Local nI, nIcon, lHeader, lMChange, nFirst, nLast, nDestCol, ; cMsg := ::cMsg, ; nColPixPos := 0, ; lFrozen := .F., ; nColumn := Max( 1, ::nAtCol( nColPix ) ) //V90 Default ::lMouseDown := .F., ; ::lNoMoveCols := .F., ; //V90 ::lDontChange := .F., ; //V90 nToolTip := 0, ; //V90 lToolTip := .F. //V90 If ::lIconView If ( nIcon := ::nAtIcon( nRowPix, nColPix ) ) != 0 If ::nIconPos != 0 .and. ::nIconPos != nIcon ::DrawIcon( ::nIconPos ) EndIf ::nIconPos := nIcon ::DrawIcon( nIcon, .T. ) CursorHand() Return 0 EndIf EndIf If ::nFreeze > 0 For nI := 1 To ::nFreeze nColPixPos += ::GetColSizes()[ nI ] Next If nColPix < nColPixPos lFrozen := .T. EndIf EndIf If ( lHeader := ::GetTxtRow( nRowPix ) == 0 ) .and. ! Empty( ::aColumns ) .and. ; ! Empty( ::aColumns[ nColumn ]:cToolTip ) If nToolTip != nColumn SetToolTip ( ::hWnd , ::aColumns[ nColumn ]:cToolTip , hToolTip ) SysRefresh() EndIf nToolTip := nColumn Else If nToolTip != 0 SetToolTip ( ::hWnd , ::cToolTip , hToolTip ) SysRefresh() endif nToolTip := 0 EndIf lHeader := (::GetTxtRow( nRowPix ) == 0 .or. ::GetTxtRow( nRowPix ) == -2) ... ///////////////////////////////////////// METHOD VertLine( nColPixPos, nColInit, nGapp ) CLASS TSBrowse ... If nColInit != Nil nsCol := nColInit nsWidth := nColPixPos nGap := If( ! Empty( nGapp ), nGapp, 0 ) nsOldPixPos := 0 hWndParent := 0 //V90 hPrvWnd := 0 //V90 lToolTip := .F. //V90 _InvertRect( ::hDC, { 0, nsWidth - ::aColSizes[ nsCol ] - 2, aRect[4], nsWidth - ::aColSizes[ nsCol ] + 2 } ) EndIf ... стало Static nLapsus, hPrvWnd, hWndParent ... ///////////////////////////////////////// Function _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight,; ... ParentFormHandle = GetFormHandle (ParentFormName) oBrw := TSBrowse():New( ControlName, nRow, nCol, nWidth, nHeight,; ... lTransparent, uSelector, lEditable, lAutoCol, aColSel, tooltip) oBrw:hToolTip := GetFormToolTipHandle (ParentFormName) IF ( nColums := Len(oBrw:aColumns) ) > 0 /* BK 18.05.2015 */ ... ///////////////////////////////////////// CLASS TSBrowse FROM TControl ... DATA cToolTip // tooltip when mouse is over Cells DATA hToolTip AS NUMERIC INIT 0 DATA nToolTip AS NUMERIC INIT 0 DATA nToolTipRow AS NUMERIC INIT 0 ... ///////////////////////////////////////// METHOD New( cControlName, nRow, nCol, nWidth, nHeight, bLine, aHeaders, aColSizes, cParentWnd, ; ... EndIf ctooltip := ::cToolTip If Valtype(ctooltip) == "B" ctooltip := Eval(ctooltip, Self) EndIf SetToolTip ( ::hWnd , ctooltip , ::hToolTip ) IF nValue > 0 .AND. nValue <= ::nLen ... ///////////////////////////////////////// METHOD MouseMove( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse Local nI, nIcon, lHeader, lMChange, nFirst, nLast, nDestCol, ; cMsg := ::cMsg, ; nColPixPos := 0, ; lFrozen := .F., ; nColumn := Max( 1, ::nAtCol( nColPix ) ) //V90 Local nRowLine := ::GetTxtRow( nRowPix ) Local ctooltip Default ::lMouseDown := .F., ; ::lNoMoveCols := .F., ; //V90 ::lDontChange := .F. //V90 If ::lIconView If ( nIcon := ::nAtIcon( nRowPix, nColPix ) ) != 0 If ::nIconPos != 0 .and. ::nIconPos != nIcon ::DrawIcon( ::nIconPos ) EndIf ::nIconPos := nIcon ::DrawIcon( nIcon, .T. ) CursorHand() Return 0 EndIf EndIf If ::nFreeze > 0 For nI := 1 To ::nFreeze nColPixPos += ::GetColSizes()[ nI ] Next If nColPix < nColPixPos lFrozen := .T. EndIf EndIf If ( lHeader := nRowLine == 0 ) .and. ! Empty( ::aColumns ) .and. ; ! Empty( ::aColumns[ nColumn ]:cToolTip ) If ::nToolTip != nColumn .or. nRowLine != ::nToolTipRow ctooltip := ::aColumns[ nColumn ]:cToolTip If Valtype(ctooltip) == "B" ctooltip := Eval(ctooltip, Self, nColumn, nRowLine) EndIf SetToolTip ( ::hWnd , ctooltip , ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine EndIf ::nToolTip := nColumn Else If ::nToolTip != nColumn .or. nRowLine != ::nToolTipRow ctooltip := ::cToolTip If Valtype(ctooltip) == "B" ctooltip := Eval(ctooltip, Self, nColumn, nRowLine) EndIf SetToolTip ( ::hWnd , ctooltip , ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine endif ::nToolTip := nColumn EndIf lHeader := (::GetTxtRow( nRowPix ) == 0 .or. ::GetTxtRow( nRowPix ) == -2) ... ///////////////////////////////////////// METHOD VertLine( nColPixPos, nColInit, nGapp ) CLASS TSBrowse ... If nColInit != Nil nsCol := nColInit nsWidth := nColPixPos nGap := If( ! Empty( nGapp ), nGapp, 0 ) nsOldPixPos := 0 hWndParent := 0 //V90 hPrvWnd := 0 //V90 _InvertRect( ::hDC, { 0, nsWidth - ::aColSizes[ nsCol ] - 2, aRect[4], nsWidth - ::aColSizes[ nsCol ] + 2 } ) EndIf ... [/pre2]

Andrey: SergKis пишет: доделел ToolTip на TsBrowse. Классно ! Григорий, добавляй в новую версию !

gfilatov2002: Andrey пишет: добавляй в новую версию Уже добавил, обработка кодовых блоков в подсказках работает! Благодарю за помощь

SergKis: gfilatov2002 Еще к ToolTip [pre2] c_controlmisc.c HB_FUNC( SETTOOLTIP ) ... было ti.lpszText = Text; SendMessage( hWnd_ToolTip, ( UINT ) TTM_ADDTOOL, ( WPARAM ) 0, ( LPARAM ) &ti ); hb_retni( 0 ); стало ti.lpszText = Text; SendMessage( hWnd_ToolTip, ( UINT ) TTM_ADDTOOL, ( WPARAM ) 0, ( LPARAM ) &ti ); // Много строчно // (LPARAM)0xFFFFFF); Максимальная ширина очень большая SendMessage( hWnd_ToolTip, ( UINT ) TTM_SETMAXTIPWIDTH, ( WPARAM ) 0, ( LPARAM ) 0x00FFFFFF ); hb_retni( 0 ); [/pre2]

gfilatov2002: SergKis пишет: Еще к ToolTip Посмотрите команду SET TOOLTIP MAXWIDTH TO <w> OF <form>

SergKis: gfilatov2002 пишет:Посмотрите команду команды в ch файле упустил из вида

SergKis: gfilatov2002 Предложение такое, снимает\упрощает некоторые решения, в том числе и обработка колонки с .T.\.F.\NIL [pre2] было METHOD DrawLine( xRow ) CLASS TSBrowse ... nVertText := 0 lCheck := oColumn:lCheckBox .and. ValType( uData ) == "L" //V90 If lCheck .and. ValType( uData ) == "L" cPicture:= "" nVertText := If( uData, 3, 4 ) EndIf ... If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" .and. ! Empty( ::aBitMaps ) If uData > 0 .and. uData <= Len(::aBitMaps) uBmpCell := ::aBitMaps[ uData ] EndIf nAlign := nMakeLong( oColumn:nAlign, oColumn:nAlign ) uData := "" ... If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... lCheck := oColumn:lCheckBox .and. ValType( uData ) == "L" //V90 lNoLite := oColumn:lNoLite nVertText := 0 If lCheck .and. ValType( uData ) == "L" cPicture := "" nVertText := If( uData, 3, 4 ) EndIf ... If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" .and. ! Empty( ::aBitMaps ) If uData > 0 .and. uData <= Len(::aBitMaps) uBmpCell := ::aBitMaps[ uData ] nAlign := nMakeLong( LoWord( nAlign ), nAlign ) uData := "" EndIf ... If lCheck //V90 Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 ) } hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" ... METHOD Destroy() CLASS TSBrowse ... стало METHOD DrawLine( xRow ) CLASS TSBrowse ... Local aBitMaps, lCheckVal := .F. ... nVertText := 0 lCheck := oColumn:lCheckBox .and. ValType(uData) == "L" //V90 If lCheck cPicture := "" nVertText := If( uData, 3, 4 ) lCheckVal := uData EndIf ... If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" aBitMaps := If( empty(oColumn:aBitMaps), ::aBitMaps, oColumn:aBitMaps ) If ! Empty( aBitMaps ) .and. uData > 0 .and. uData <= Len(aBitMaps) uBmpCell := aBitMaps[ uData ] endif nAlign := nMakeLong( oColumn:nAlign, oColumn:nAlign ) uData := "" ... If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} If Valtype(oColumn:aCheck) == "A" hBitMap := oColumn:aCheck[ If( lCheckVal, 1, 2 ) ] Else hBitMap := ::aCheck[ If( lCheckVal, 1, 2 ) ] EndIf nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... Local aBitMaps, lCheckVal := .F. ... lCheck := oColumn:lCheckBox .and. ValType( uData ) == "L" //V90 lNoLite := oColumn:lNoLite nVertText := 0 If lCheck cPicture := "" nVertText := If( uData, 3, 4 ) lCheckVal := uData EndIf ... If nJ == ::nColSel .and. ::uBmpSel != Nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" aBitMaps := If( empty(oColumn:aBitMaps), ::aBitMaps, oColumn:aBitMaps ) If ! Empty( aBitMaps ) .and. uData > 0 .and. uData <= Len(aBitMaps) uBmpCell := aBitMaps[ uData ] endif nAlign := nMakeLong( LoWord( nAlign ), nAlign ) uData := "" ... If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} If Valtype(oColumn:aCheck) == "A" hBitMap := oColumn:aCheck[ If( lCheckVal, 1, 2 ) ] Else hBitMap := ::aCheck[ If( lCheckVal, 1, 2 ) ] EndIf nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" ... METHOD Destroy() CLASS TSBrowse LOCAL i ... If Len(::aColumns) > 0 For i := 1 To Len(::aColumns) If Valtype(::aColumns[ i ]:aCheck) == "A" AEval(::aColumns[ i ]:aCheck, {|hBmp| If( empty(hBmp), , DeleteObject(hBmp) ) }) EndIf If Valtype(::aColumns[ i ]:aBitMaps) == "A" AEval(::aColumns[ i ]:aBitMaps, {|hBmp| If( empty(hBmp), , DeleteObject(hBmp) ) }) EndIf Next EndIf ... [/pre2]

SergKis: PS добавка в TSCOLUMN DATA aBitMaps DATA aCheck

gfilatov2002: SergKis пишет: обработка колонки с .T.\.F.\NIL Выполнил эти изменения, теперь нужен небольшой пример для проверки правильности их работы

SergKis: gfilatov2002 Сделал: click here

gfilatov2002: SergKis Благодарю за помощь! Пример работает нормально

SergKis: gfilatov2002 маленькая правка выделенным [pre2] METHOD HiliteCell( nCol, nColPix ) CLASS TSBrowse ... nOldPos := ::nCell If ::nFreeze > 0 .and. nOldPos < nNowPos .and. ::lLockFreeze // frozen col and going right nNowPos := nAbsCell lMove := ( nOldPos > ::nFreeze ) EndIf If nOldPos < nNowPos // going right ... [/pre2] сейчас при ::nFreeze := 7, ::nCell := 1, левый клик мыши на колонку < ::nFreze переключает фокус на колонку ::nFreeze, повторный клик ставит фокус на нужную колонку и так повторяется все время, добавка исправляет ситуацию

gfilatov2002: SergKis пишет: маленькая правка Благодарю за поправку - сделана

SergKis: gfilatov2002 еще мелочь [pre2] было METHOD DrawPressed( nCell, lPressed ) CLASS TSBrowse ... Local hDC := GetDC( ::hWnd ), ; ... If Empty( nCell ) .or. nCell > Len( ::aColumns ) .or. ! ::lDrawHeaders Return Self ElseIf ! lPressed .and. ! ::aColumns[ nCell ]:l3DLookHead ::DrawHeaders() Return Self EndIf nLeft := 0 ... ReleaseDC( ::hWnd, hDC ) ... стало Local hDC, ; ... If Empty( nCell ) .or. nCell > Len( ::aColumns ) .or. ! ::lDrawHeaders Return Self ElseIf ! lPressed .and. ! ::aColumns[ nCell ]:l3DLookHead ::DrawHeaders() Return Self EndIf hDC := GetDC( ::hWnd ) nLeft := 0 ... ReleaseDC( ::hWnd, hDC ) ... [/pre2]

gfilatov2002: SergKis пишет: еще мелочь OK Это исправляет возможную утечку памяти, и так - в коде у оригинального автора библиотеки

SergKis: gfilatov2002 еще для чистоты объекта[pre2] Static nLapsus, hPrvWnd, hWndParent можно убрать после изменений CLASS TSBrowse FROM TControl ... DATA nLapsus INIT 0 ... METHOD Default() CLASS TSBrowse ... ::nOldCell := ::nCell ::nLapsus := Seconds() If ::nLen == 0 //V90 ::nLen := If( ::bLogicLen == Nil, Eval( ::bLogicLen := {||( cAlias )->( LastRec() ) } ), Eval( ::bLogicLen ) ) EndIf //end Return Self ... METHOD Seek( nKey ) CLASS TSBrowse ... If ( Seconds() - ::nLapsus ) > 3 .or. ( Seconds() - ::nLapsus ) < 0 ::cSeek := cSeek := "" EndIf ::nLapsus := Seconds() cPrefix := If( ::cPrefix == Nil, "", If( ValType( ::cPrefix ) == "B", Eval( ::cPrefix, Self ), ::cPrefix ) ) ... METHOD VertLine( nColPixPos, nColInit, nGapp ) CLASS TSBrowse ... If nColInit != Nil nsCol := nColInit nsWidth := nColPixPos nGap := If( ! Empty( nGapp ), nGapp, 0 ) nsOldPixPos := 0 // hWndParent := 0 //V90 // hPrvWnd := 0 //V90 _InvertRect( ::hDC, { 0, nsWidth - ::aColSizes[ nsCol ] - 2, aRect[4], nsWidth - ::aColSizes[ nsCol ] + 2 } ) EndIf ... [/pre2]

gfilatov2002: SergKis пишет: для чистоты объекта Благодарю за помощь! Неиспользуемые переменные hPrvWnd и hWndParent убрал, а nLapsus оставил как статическую переменную (так - у автора )

SergKis: gfilatov2002 пишет:nLapsus оставил как статическую переменную (так - у автора ) но тогда нельзя наследовать класс - суть класса теряется

SergKis: PS имея на окне 4-е TSB METHOD Seek( nKey ) в каждом будет портить значение для другого, можно сказать, что значение не важное и каждые 3 сек. обновляется, но по сути ...

gfilatov2002: SergKis пишет: METHOD Seek( nKey ) в каждом будет портить значение для другого Благодарю за разъяснение Убрал эту статическую переменную и определил ее как переменную класса VAR nLapsus AS NUMERIC INIT 0 PROTECTED

SergKis: gfilatov2002 Обнаружил, что в MDI не работает WM_MOUSEWHEEL, у себя поборол так : [pre2] METHOD DrawHeaders( lFooters ) CLASS TSBrowse ... SetFocus(hWnd) Return Self METHOD DrawIcons() CLASS TSBrowse ... SetFocus(::hWnd) Return Nil METHOD DrawLine( xRow ) CLASS TSBrowse ... SetFocus(hWnd) Return Self METHOD DrawPressed( nCell, lPressed ) CLASS TSBrowse ... SetFocus(::hWnd) Return Self METHOD DrawSelect( xRow ) CLASS TSBrowse ... SetFocus(hWnd) Return Self METHOD DrawSuper() CLASS TSBrowse ... SetFocus(hWnd) Return Nil [/pre2] проверить TsB_Mdi.prg из Advanced\TsBrowse, установив, например Brw_1:nWheelLines := 10

SergKis: gfilatov2002 правка, снимающая некоторые вопросы высоты строк [pre2]было METHOD New( cControlName, nRow, nCol, nWidth, nHeight, bLine, aHeaders, aColSizes, cParentWnd,; ... If Valtype( ::oWnd:hWnd ) != 'U' ::Create(::cControlName) // т.к. ::hFont всегда NIL, то расчет высот происходит от 0, потом надо переустанавливать высоты. // ::hFont уст. в _DefineTsBrowse() после создания объекта If ::hFont != Nil ::SetFont( ::hFont ) EndIf ::nHeightFoot := 0 //JP ::nHeightCell := ::nHeightHead := SBGetHeight( ::hWnd, If( ::hFont != Nil, ::hFont, 0 ), 0 ) //JP ::nHeightSpecHd := IF(::lEditableHd,SBGetHeight( ::hWnd, If( ::hFont != Nil, ::hFont, 0 )),0) ... стало METHOD New( cControlName, nRow, nCol, nWidth, nHeight, bLine, aHeaders, aColSizes, cParentWnd, ; ... Local hFont ... If Valtype( ::oWnd:hWnd ) != 'U' ::Create(::cControlName) If ::hFont != Nil ::SetFont( ::hFont ) ::nHeightCell := ::nHeightHead := SBGetHeight( ::hWnd, If( ::hFont != Nil, ::hFont, 0 ) , 0 ) //JP Else hFont := InitFont(::cFont, ::nFontSize) ::nHeightCell := ::nHeightHead := GetTextHeight( 0, "B", hFont) + 5 DeleteObject ( hFont ) EndIf ::nHeightFoot := 0 //JP ::nHeightSpecHd := IF(::lEditableHd, ::nHeightCell, 0 ) ... [/pre2]

gfilatov2002: SergKis пишет: правка, снимающая некоторые вопросы высоты строк Благодарю за помощь! Это очень нужная поправка для учета высоты (и типа) шрифта, заданного при определении TBROWSE Для совместимости со старым кодом, чтобы не увеличивать высоту ячейки по умолчанию, сделал так: [pre] If ::hFont != Nil ::SetFont( ::hFont ) ::nHeightCell := ::nHeightHead := SBGetHeight( ::hWnd, ::hFont, 0 ) Else hFont := InitFont( ::cFont, ::nFontSize ) // SergKis addition ::nHeightCell := ::nHeightHead := GetTextHeight( 0, "B", hFont ) DeleteObject( hFont ) EndIf ::nHeightFoot := 0 ::nHeightSpecHd := If( ::lEditableHd, ::nHeightHead, 0 ) [/pre] SergKis пишет: в MDI не работает WM_MOUSEWHEEL Подтверждаю эту проблему, но предложенное решение создает другие проблемы с перерисовкой строк TBROWSE Поэтому лучше обойтись без прокрутки строк в MDI, чем создавать новые проблемы (вплоть до GPF) Либо надо искать другое решение для MDI

SergKis: gfilatov2002 пишет:но предложенное решение создает другие проблемы с перерисовкой строк TBROWSE Согласен, поэксперементировал и оставил только в DrawSelect (тоже не хорошо, но пока не находится место перекл.фокус с TSB на окно) If GetFocus() != hWnd SetFocus(hWnd) EndIf как следствие убрал из h_windowsMdi.prg, выделено цветом - вся обработка в Events(...). Мне надо несколько TSB на окне [pre2] FUNCTION MdiEvents ( hWnd, nMsg, wParam, lParam ) *-----------------------------------------------------------------------------* LOCAL i, x, ControlCount #ifdef _TSBROWSE_ LOCAL oGet #endif DO CASE #ifdef _TSBROWSE_ //********************************************************************** CASE nMsg == WM_KEYDOWN .OR. nMsg == WM_KEYUP //********************************************************************** // IF Type( '_TSB_aControlhWnd' ) == 'A' .AND. Len( _TSB_aControlhWnd ) > 0 // oGet := GetObjectByClientMDI( hWnd ) // IF ValType( oGet ) == 'O' // oGet:HandleEvent ( nMsg, wParam, lParam ) // ENDIF // ENDIF #endif //********************************************************************** CASE nMsg == WM_MDIACTIVATE [/pre2] т.к. oGet := GetObjectByClientMDI( hWnd ) работает только для одного TSB на окне (hWnd - handle child mdi окна)

SergKis: SergKis пишет:Мне надо несколько TSB на окне Без решения главной проблемы - фокуса, несколько TSB на окне реализовать не получается. Убрал из DrawSelect вставку WM_MOUSEWHEL сделал так h_windowsMdi.prg [pre2] Function MdiEvents(...) ... #ifdef _TSBROWSE_ *********************************************************************** case nMsg == WM_KEYDOWN .OR. nMsg == WM_KEYUP IF Type('_TSB_aControlhWnd') == 'A' .and. Len(_TSB_aControlhWnd) > 0 oGet := GetObjectByClientMDI(hWnd) IF ValType(oGet) == 'O' oGet:HandleEvent ( nMsg, wParam, lParam ) ENDIF ENDIF case nMsg == WM_MOUSEWHEEL IF Type('_TSB_aControlhWnd') == 'A' .and. Len(_TSB_aControlhWnd) > 0 oGet := GetObjectByClientMDI(hWnd) IF ValType(oGet) == 'O' x := oGet:HandleEvent ( nMsg, wParam, lParam ) if ValType(x) == 'N' IF x != 0 RETURN x ENDIF endif ENDIF ENDIF #endif *********************************************************************** case nMsg == WM_MDIACTIVATE ... [/pre2]

gfilatov2002: SergKis пишет: WM_MOUSEWHEL сделал так Благодарю за помощь - прокрутка строк TBROWSE в MDI дочерних окнах работает Планирую выпустить финальную сборку 16.03 на следующей неделе

Haz: Григорий Есть еще предложение ... Как неоднократно тут вопрошал Андрей, при переключении между программами в Windows, если в программе на MiniGui последним активным было модальное окно , вызванное из дочернего, то такое модальное окно не получает фокус и программа уходит в вечное ожидание когда его закроют. Схематически вызовы такие MAIN->CHILD->MODAL , переключаем задачи и попадаем в CHILD ( MODAL не видно и на него не переключиться ). Предлагаю очень простое решение: в модуле h_events.prg в обработку событий в функцию Events() , в событие WM_SETFOCUS добавить условие [pre2] Было: _DoWindowEventProcedure ( _HMG_aFormGotFocusProcedure , i , 'WINDOW_GOTFOCUS' ) iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) Стало: IF _HMG_IsModalActive BringWindowToTop(_HMG_ActiveModalHandle) ELSE iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) END [/pre2] Таким образом , при любой попытке дать фокус любому окну, если есть модальное , то фокус и топ на экране получит оно PS. После получения фокуса , к модальному можно еще и Flash добавить .... будет моргать совсем как по настоящему )

gfilatov2002: Haz пишет: при любой попытке дать фокус любому окну, если есть модальное , то фокус и топ на экране получит оно Неплохое предложение, хотя особого эффекта функция BringWindowToTop() у меня не дает (но и ничего не портит, похоже). Лучше работает другая функция WinAPI DECLARE DLL_TYPE_BOOL SwitchToThisWindow( DLL_TYPE_LONG hWnd, DLL_TYPE_BOOL lRestore ) ; IN USER32.DLL но она является недокументированной и не рекомендуется к использованию, т.к. может быть исключена в любой новой Винде Благодарю за помощь, Ваше предложение принимается

Andrey: Haz пишет: к модальному можно еще и Flash добавить .... будет моргать совсем как по настоящему ) Григорий - добавь пожалуйста ! Очень нужно...

Haz: Andrey пишет: Григорий - добавь пожалуйста ! Очень нужно... тогда так [pre2] if _HMG_IsModalActive BringWindowToTop(_HMG_ActiveModalHandle) if _HMG_aFormFocusedControl <> _HMG_ActiveModalHandle .and. _HMG_aFormType [ i ] <> "M" FlashWindowEx( _HMG_ActiveModalHandle , 1, 5, 100 ) end else iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) end [/pre2]

SergKis: gfilatov2002 В своей версии подправил:[pre2] METHOD GoToRec( nRec ) CLASS TSBrowse ... ( ::cAlias )->( DbGoto( nRec ) ) // If nRecNo != ( ::cAlias )->( RecNo() ) .and. ::nLen > nLines было If ::nLen > nLines nRecNo := ( ::cAlias )->( RecNo() ) ( ::cAlias )->( DbSkip( nLines - ::nRowPos ) ) If ( ::cAlias )->( EoF() ) ... Else ( ::cAlias )->( DbGoTo( nRecNo ) ) ::nLastPos := nRecNo ::nAt := ::nLogicPos() EndIf ... [/pre2] без этих изменений, не удерживался ::nRowPos (перепрыгивал на 1) и бывало не так, как надо перепоказ происходил Пример (на базе Tsb_addrecord): [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * */ #include "minigui.ch" #include "tsbrowse.ch" FIELD id, info *----------------------------------- PROCEDURE Main *----------------------------------- LOCAL i, obrw IF !hb_FileExists( "datab.dbf" ) dbCreate( "datab", { { "ID", "N", 5, 0 }, { "INFO", "C", 15, 0 } } ) ENDIF USE datab ALIAS base NEW INDEX ON id TO datab temporary IF LastRec() == 0 FOR i := 1 TO 200 APPEND BLANK REPLACE id WITH RecNo(), info WITH "record " + hb_ntos( RecNo(), 4 ) NEXT ENDIF DEFINE WINDOW win_1 AT 0, 0 WIDTH 400 HEIGHT 500 ; MAIN TITLE "TSBrowse Add Record Demo" NOMAXIMIZE NOSIZE @06, 10 BUTTON BRUN CAPTION "Add Record" ACTION AddRecord( obrw ) @06, 110 BUTTON BFND CAPTION "Find ID 100" ACTION FindRecord( obrw ) DEFINE STATUSBAR FONT _HMG_DefaultFontName SIZE _HMG_DefaultFontSize STATUSITEM "" END STATUSBAR DEFINE TBROWSE obrw AT 40, 10 GRID ALIAS "base" ; WIDTH 370 HEIGHT 418 - 60 ADD COLUMN TO obrw HEADER "ID" ; SIZE 100 ; DATA FieldWBlock( "id", Select( "base" ) ) ; TOOLTIP "My column 1" ADD COLUMN TO obrw HEADER "INFO" ; SIZE 150 ; DATA FieldWBlock( "info", Select( "base" ) ) ; TOOLTIP "My column 2" obrw:cToolTip := "My all columns TsBrowse tooltip" obrw:lNoHScroll := .T. obrw:SetColor( { 2 }, { {|| iif( base->( ordKeyNo() ) % 2 == 0, RGB( 255, 255, 255 ), RGB( 230, 230, 230 ) ) } } ) END TBROWSE obrw:SetFocus() END WINDOW CENTER WINDOW win_1 ACTIVATE WINDOW win_1 RETURN *----------------------------------- PROCEDURE AddRecord( obrw ) *----------------------------------- APPEND BLANK REPLACE id WITH RecNo(), info WITH "record " + hb_ntos( RecNo(), 4 ) obrw:GoToRec( base->( RecNo() ) ) obrw:SetFocus() RETURN FUNC FindRecord( obrw ) SEEK 100 obrw:GotoRec(RecNo()) obrw:SetFocus() RETURN [/pre2]

gfilatov2002: SergKis пишет: без этих изменений, не удерживался ::nRowPos Благодарю за помощь, сделал эти изменения в коде TSBrowse

gfilatov2002: Andrey пишет: добавь пожалуйста ! Очень нужно Не вопрос, уже добавил моргание (6 раз с интервалом в 50 миллисекунд)

gfilatov2002: Сегодня выпущен очередной релиз библиотеки MiniguiEx. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.03-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1603-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1603.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1603_xhb10146.zip Благодарю за Ваше внимание и поддержку данного проекта

Haz: Григорий , все же следующий вариант работает более корректно ( у себя заменил на него ) [pre2] //H_EVENTS.PRG _DoWindowEventProcedure ( _HMG_aFormGotFocusProcedure , i , 'WINDOW_GOTFOCUS' ) IF _HMG_IsModalActive BringWindowToTop(_HMG_ActiveModalHandle) if _HMG_aFormFocusedControl <> _HMG_ActiveModalHandle .and. _HMG_aFormType [ i ] <> "M" // Это нужно чтоб при вызове из модального окна - другого FlashWindowEx( _HMG_ActiveModalHandle , 1, 6, 50 ) // модального , старое не мограло end ELSE iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) END [/pre2] Проверял работу новой версии вот на примере ниже , если после запуска теста на панели задач выбрать мышью другое приложение , а потом опять тест - НЕ ВСЕГДА попадаем в модал да и моргает не то окно ( в титле окон видно ). А если переключать не мышом, а альт+таб , то вроде нормик [pre2] #include "minigui.ch" Function Main DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI Main' ; MAIN ; ON INIT Child() END WINDOW Form_1.Activate Return Nil Func Child() Form_1.Hide DEFINE WINDOW Form_2 ; AT 100,100 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI Standard' ; WINDOWTYPE STANDARD ; ON INIT Modal() END WINDOW Form_2.Activate Form_1.Show return nil Func Modal() DEFINE WINDOW Form_3 ; AT 200,200 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI Modal' ; MODAL END WINDOW Form_3.Activate return nil [/pre2]

gfilatov2002: Haz пишет: следующий вариант работает более корректно Благодарю за пример! Предлагаю доработанный вариант кода с учетом Ваших замечаний: [pre2]... IF _HMG_IsModalActive BringWindowToTop ( _HMG_ActiveModalHandle ) IF iswinnt() .AND. ( _HMG_aFormType != 'M' .OR. ; _HMG_aFormFocused == .T. .AND. _HMG_aFormType [ AScan ( _HMG_aFormHandles, _HMG_aFormParentHandle ) ] == 'M' ) // Form's caption blinking FlashWindowEx ( _HMG_ActiveModalHandle , 1 , 5 , 60 ) ELSE _HMG_aFormFocused := .T. ENDIF ENDIF IF _HMG_aFormFocusedControl != 0 setfocus ( _HMG_aFormFocusedControl ) ENDIF [/pre2]

gfilatov2002: gfilatov2002 пишет: доработанный вариант кода Сделал "тихий" апдейт сборки 16.03 с учетом этих поправок Для кого это критично, могут обновить у себя инсталяцию BCC по ссылке выше

Haz: gfilatov2002 пишет: Сделал "тихий" апдейт сборки 16.03 с учетом этих поправок Спасибо, в таком варианте все работает.

Softlog86: Заметил небольшой баг . WINDOWS XP . Тема - "XP стандартная голубая" Контрол из MiniGui :FRAME Неправильно отображает цвета , указанные в FONTCOLOR ...... Пишу - WHITE - выводит вроде как зелёный :( WINDOWS -7 . Тема "Классическая" -отображение правильное . На других темах не проверял

gfilatov2002: Softlog86 пишет: Тема "Классическая" -отображение правильное Это не ошибка. В классической теме под WinXP будет также отображение правильное Выводы о поведении Винды в разных темах делайте самостоятельно...

Softlog86: просто другие контролы вырисовываются заданным цветом , а frame - почему-то по-своему . Чтоб ему еще прикрутить свойство NOXPSTYLE :) Посоветуйте как решить-то ? или тупо не использовать раскраску вовсе ? ругаются клиенты что ничего не видно . А предлагать им "сменить тему" ...... не так поймут .

gfilatov2002: Softlog86 пишет: Посоветуйте как решить Используйте в таком случае OwnerDraw frame как в примере из папки samples\Basic\LABEL_3 Вызов функции MyFrame(300,300,175,50,"20","My Frame",BLUE,LGREEN)

Softlog86: Спасибо за наводку .... Приму к сведению .....

sashaBG: У меня все Разморгалось с новой сборкой 16.03 :) Видимо потому что я пользуюсь только Модальными окнами . Причем в версии под MINGW имею Модальное окно которое моргает после того когда възвал и закрыл функцию MsgInfo() например. а в BCC наоборот сначало моргает MsgInfo() при показе а потом и основное Модальное окно из кторого функция бъла вызвана Григорий есть способ ето откльчить ?

Haz: sashaBG пишет: У меня все Разморгалось с новой сборкой 16.03 : Есть такое. При нескольких модальный они перемигиваются Скорее всего дело в условии [pre2] IF iswinnt() .AND. ( _HMG_aFormType != 'M' .OR. ; _HMG_aFormFocused == .T. .AND. _HMG_aFormType [ AScan ( _HMG_aFormHandles, _HMG_aFormParentHandle ) ] == 'M' ) [/pre2] поменял у себя на [pre2] if iswinnt() .AND. _HMG_aFormFocusedControl <> _HMG_ActiveModalHandle .and. _HMG_aFormType [ i ] <> "M" [/pre2] т.е. мигает только если пытается получить фокус не то окно которое является последним открытым модальным, а какое то другое. При этом окно которое хочет получить фокус не является модальным. После этой правки вроде полегчало и моргает только по делу. Для отключения, можно флаг организовать в исходнике типа lModalBlink и моргать только если он выставлен в .T.

gfilatov2002: sashaBG пишет: Григорий есть способ ето откльчить ? Да, надо в исходнике h_events.prg изменить обработку события WM_SETFOCUS таким образом: [pre2]... _DoWindowEventProcedure ( _HMG_aFormGotFocusProcedure [ i ] , i , 'WINDOW_GOTFOCUS' ) IF _HMG_IsModalActive .AND. Empty ( _HMG_InplaceParentHandle ) BringWindowToTop ( _HMG_ActiveModalHandle ) IF iswinnt() .AND. _HMG_aFormType [ i ] != 'M' // Form's caption blinking FlashWindowEx ( _HMG_ActiveModalHandle , 1 , 5 , 60 ) ENDIF ENDIF ...[/pre2] и пересобрать библиотеку

gfilatov2002: sashaBG Обновил сборку для компилятора BCC с учетом данного обсуждения на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.03-setup.zip Ваши комментарии приветствуются

Haz: gfilatov2002 пишет: Ваши комментарии приветствуются Работает как надо

sashaBG: Да теперь все хорошо !

Andrey: Что-то у меня в Tsbrowse все размеры поехали... Но я сам размеры фонта устанавливал. Как считается размер фонта под разные расширения экрана ?

SergKis: Andrey пишет:Что-то у меня в Tsbrowse все размеры поехали... сейчас высота строки считается от фонта, раньше не считалась и была для всех фонтов 16 [pre2] hFont := InitFont( ::cFont, ::nFontSize ) // SergKis addition ::nHeightCell := ::nHeightHead := GetTextHeight( 0, "B", hFont ) + 1 DeleteObject( hFont ) [/pre2]

alex_II: Перепрыгнул с версии 15.12 сразу на 16.03 и обнаружил проблему: в окне предварительного просмотра печати перестали работать оба (горизонтальный и вертикальный) бегунка. При масштабировании можно просматривать только верхнюю левую часть листа.

gfilatov2002: alex_II пишет: в окне предварительного просмотра печати перестали работать оба (горизонтальный и вертикальный) бегунка. Да, я подтверждаю эту проблему. Она уже исправлена в новой сборке 16.04, которая готовится сейчас к выпуску. Но поскольку надо работать без ошибок уже "вчера", я сделал "тихое" обновление текущей версии по старому адресу: http://hmgextended.com/files/CONTRIB/hmg-16.03-setup.zip Скачайте его, пожалуйста, и отпишитесь о результате здесь, на форуме

alex_II: Проверил - всё работает! Большое спасибо за оперативную помощь

gfilatov2002: Просто к сведению. Выпустил сегодня RC для новой сборки библиотеки. Полный список изменений см. ниже [pre2] * Fixed: The problem with the scrollbars handling in the virtual dimensioned Modal windows (introduced in the build 16.03). Reported by Vianei Moreira de Lemos <vianeimoreira@gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> * New: Added a new method 'SetArray' for assigning of array to the following controls: ComboBox, Grid, ListBox at runtime: - function syntax: DoMethod ( Form, Control, 'SetArray', aNewValues ) - pseudo-OOP syntax: Form.Control.SetArray( LoadItems() ) Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Basic\COMBO_1) (see demo in folder \samples\Basic\Grid_5) (see demo in folder \samples\Basic\Listbox_3) * Enhanced: The standard ComboBox control supports a 'Refresh' method now: - function syntax: DoMethod ( Form, Control, 'Refresh' ) - pseudo-OOP syntax: Form.ComboBox.Refresh [()] Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Basic\COMBO_1) * Enhanced: The MonthCal control supports now 'On GotFocus' and 'On LostFocus' clauses similar to others controls. Contributed by Grigory Filatov <gfilatov@freemail.ru> * Enhanced: The ButtonEx control supports JPG, GIF, TIF and PNG images now. You can set/get this property at runtime: Form.ButtonEx.Picture := 'ok.png' cImage := GetProperty( Form, Control, 'Picture' ) Added a new optional clause IMAGESIZE <w>, <h> to the ButtonEx control. This property is available at control's definition for NOT Bitmap only. The alternative syntax is IMAGEWIDTH <w> and IMAGEHEIGHT <h>. Requested by Verchenko Andrey <verchenkoag@gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Modified: The some internal functions were defined as Static. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see h_controlmisc.prg in folder \Source). * Updated: Rearranged processing of an enum index in the cycles 'For Each-Next' for xHarbour compatibility. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - added a new method nAtColActual() for correct detection of a column number at the mouse moving in TBrowse. It was needed for a proper handling of the cell's tooltips. Contributed by Igor Nazarov and SergKis (see demo2.prg in folder \samples\Advanced\Tsb_calendar) * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.12.1 (from 3.12.0dev). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2016-04-05 16:27): * Updated: HbNetIO contrib library. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: HMGS-IDE v.1.3.0 Project Manager and Two-Way Visual Form Designer. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look for what's new at changelog.txt in folder \Ide) * New: 'ON LOSTFOCUS event as validation checking for TEXTBOX control' sample. Based upon a contribution of S.Rathinagiri <srgiri@dataone.in> (see in folder \samples\Basic\VALID_2) * New: 'Command Link Button emulation for WinXP' sample. Requested by Pete D. <pete_westg/at/yahoo.gr>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\CommandLinkXP) * New: 'TsBrowse Monthly Calendar with the dates marking at runtime' sample. You can mark the dates by a left mouse click or <Enter> or <Space> keys pressing. Don't miss this very interesting example! Based upon a contribution of Igor Nazarov (see in folder \samples\Advanced\Tsb_calendar) * New: 'TSBrowse Incremental Seek With Footer's GetBox' sample. Based upon a contribution of Russian user SergKis (see in folder \samples\Advanced\Tsb_seek_2) * New: 'How to display a ProgressBar on TaskBar icon' sample is based on the ITaskbarList3 COM Interface. It is MinGW-based example only. Note: This feature works properly at Windows 7 or later only. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\TaskBarList) * Updated: 'Display of Main, Child and Modal windows without sizes' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\Hello) * Updated: 'HMG IDE Demo' sample: - modified MonthCal control handling after the last core changes. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\hmgide) * Updated: 'System Idle Detection' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Advanced\SysIdle) * Updated: 'Minigui Modal Form Designer Utility' sample: - added datepicker and hyperlink controls; - added supporting functions for tbrowse control; - added spanish/english translation; - added config file setup.ini. Contributed by Rafael Moran <webrmoran[at]yahool.com>. Revised by Grigory Filatov <gfilatov@inbox.ru> (see in folder \Utils\xForm) [/pre2]Если есть желающие поучаствовать в тестировании этой сборки, то могу предоставить ссылку для скачивания (в индивидуальном порядке )

sergeyd: У меня давно уже проблема с Hotkey: при некоторых стечениях обстоятельств окно программы не активно (на "заднем плане" ), но получает WM_HOTKEY вместо активного окна. Мне кажется, в h_events.prg на CASE WM_HOTKEY вместо _HMG_aControlParentHandles == GetActiveWindow() должно быть _HMG_aControlParentHandles == GetForegroundWindow() и в случае _HMG_aControlParentHandles != GetForegroundWindow() надо WM_HOTKEY отправлять "наверх" Или я где-то капитально ошибаюсь?

gfilatov2002: sergeyd пишет: Или я где-то капитально ошибаюсь? Просто добавьте следующую команду в основной модуль SET GLOBAL HOTKEYS ON для Вашего случая

sergeyd: gfilatov2002 пишет: Просто добавьте следующую команду в основной модуль SET GLOBAL HOTKEYS ON для Вашего случая Не помогает... Да и не мой случай, вроде. У меня неактивная (на взгляд юзера неактивная, так как она НЕ ForegroundWindow) MinGUI-программа "хватает" hotkey.

Andrey: Классный синтаксис (просто и изящно): @ 20, 60 BUTTONEX Button_1x1 WIDTH 90 HEIGHT 100 ; CAPTION "Santa.png" PICTURE "Santa" IMAGESIZE 64,64 ; ..... Спасибо БОЛЬШОЕ !

Andrey: А иконки тоже будут уменьшаться ? CAPTION "Santa.ico" ICON "Santa.ico" IMAGESIZE 64,64 ....

gfilatov2002: Andrey пишет: А иконки тоже будут уменьшаться ? Нет, только JPG, GIF, TIF и PNG картинки

Andrey: gfilatov2002 пишет: Нет, только JPG, GIF, TIF и PNG картинки А сделать нельзя ? Очень бы уменьшился труд по созданию кучи иконок.... Достало это рисование, вместо программирования, сидишь и эти иконки/картинки рисуешь под разные разрешения экрана.

Softlog86: А какая проблема автоматом переделать ICO в JPG ? :)

Andrey: Softlog86 пишет: А какая проблема автоматом переделать ICO в JPG ? :) В JPG нет прозрачности. Соответсвенно JPG на кнопке будут выглядеть ужасно. Попробуй посмотреть иконку с кругом на кнопке и потом преобразуй иконку в JPG. Смотри пример - https://cloud.mail.ru/public/DtiA/D2ZSqB3ue И попробуй туда JPG сделать.

sergeyd: Вот попробовал простой пример с Hotkey сделать. Не на тему "неактивная MinGUI-программа хватает hotkey". Если запустить программу один раз без параметра и параллельно с параметром 2, а затем понажимать несколько раз F2 то в одном окне, то в другом, то под Windows 10 Pro и Windows 7 Pro результат зависит от того, переключаем ли между окнами по а)ALT+TAB или мышкой в таскбаре или б)щелкаем мышкой по окнам. Под XP Home вроде работает нормально, под W 7/10 б) глючит #include "minigui.ch" Function Main(cParam) //SET GLOBAL HOTKEY ON if valtype(cParam)#"C" cParam:="1" endif DEFINE WINDOW Form_1 ; AT 50,50 ; WIDTH 640 HEIGHT 480; TITLE 'Demo '+cParam; MAIN ON KEY F2 ACTION action1(cParam) @ 5,250 LABEL Label_1 ; VALUE "Programm "+cParam+". Press F2"; WIDTH 270 ; HEIGHT 18 END WINDOW if cParam=="1" Form_1.Center() endif Form_1.Activate() Return Nil ****************************** Function action1(cParam) MsgInfo( "Programm "+cParam, , , .f. ) return

gfilatov2002: Сегодня выпущен очередной релиз библиотеки Minigui Ex. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.04-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1604-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1604.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1604_xhb10146.zip Благодарю за Ваше внимание и поддержку данного проекта

gfilatov2002: Просто к сведению. Выпустил сегодня pre-release для новой сборки библиотеки. Финальная версмя запланирована к выходу на следуюшей неделе Благодарю за Ваше внимание и поддержку данного проекта

Andrey: gfilatov2002 пишет: Просто к сведению. Выпустил сегодня pre-release для новой сборки библиотеки. Григорий, а почему в библиотеке нет примеров по LetoDB ? Отличное средство для переводы программ в современную технологию. Многие об этом не знают. Глядишь и захотят попробовать и перейдут на него. Тем более есть ссылки на него в Вики и примеры для МиниГуи я высылал. Через твою библиотеку многие увидят LetoDB !!! У тебя же в библиотеке разные базы есть: MySQL, PostgreSQL, SQLite.

Vlad04: Поддерживаю !

Haz: Andrey пишет: Григорий, а почему в библиотеке нет примеров по LetoDB ? Так в чем проблема ? Кто работает с LETO, выкладывайте примеры и Григорий с удовольствием их включит в ближайшую сборку.[pre2] /* при этом все вопросы к автору примера */[/pre2] Andrey пишет: примеры для МиниГуи я высылал. мож потерялось где ...

Andrey: Вот ряд примеров - https://cloud.mail.ru/public/KuUK/7e4ixTzsg Что там добавить/исправить - пишите. Единственно что не сделал ещё один пример, распаковки zip-файла на сервере. Может кто поможет сделать ? Создание и копирование Zip-файла есть в примерах.

gfilatov2002: Сегодня выпущен очередной релиз библиотеки Minigui Ex. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.05-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1605-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1605.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1605_xhb10151.zip Благодарю за Ваше внимание и поддержку данного проекта

Петр: gfilatov2002 пишет: Дню Пионерии 19 мая посвящается... Оффтоп: машину времени, к сожалению, еще не придумали и вернуться в детство, более или менее счастливое, - увы, не получится.

gfilatov2002: Просто к сведению. Выпустил сегодня первый RC для новой сборки библиотеки. Полный список изменений см. ниже [pre2] * Fixed: The correction of a caret look of Insert/Overwrite status at the entrance/exit in a GetBox control (introduced in the build 16.05). Contributed by Grigory Filatov <gfilatov@inbox.ru> * New: Added support for a cue banner (banner text) in TextBox, ComboBox and Spinner controls. Sets the textual cue (or placeholder) that is displayed by the edit control to prompt the user for information. When the user clicks the text, the text goes away and the user can type. Note: You cannot set a cue banner on a multiline edit control or on a rich edit control. Themes support must be activated in the application. Above is a WinAPI requirement. Syntax: @ <row>,<col> TEXTBOX <name> [ OF <parent> ] ; [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] ; [ VALUE <value> ] [ CUEBANNER | PLACEHOLDER <cCueText> ] Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demos in folder \samples\Advanced\CueBanner) * Enhanced: SET HELPFILE TO <chmfile> command will process automatically the hotkey F1 for calling of a help file in the CHM format. Based upon a contribution of Kevin Carmody <i@kevincarmody.com> (see demo in folder \samples\Basic\ContextCHM) * Enhanced: The DRAW GRAPH and DRAW PIE commands support of the multiple charts on the same form. It was a postponed user's request. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Modified: DRAW GRAPH: moved the title, labels and legendgs cleaning into the ERASE WINDOW command. It was a postponed user's request. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\Charts) * Updated: Synchronized Extended HMG for compatibility with Official HMG: - Enhanced: The ComboBox control supports the optional ON CANCEL event when the user selects an item, but then selects another control or closes the dialog box. It indicates the user's initial selection is to be ignored. Based upon a contribution of Claudio Soto <srvet@adinet.com.uy> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.14.0dev (from 3.13.0dev). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2016-05-04 15:50): * hbrdd and hbrtl were compiled with a default switch -gc3 instead -gc0; * Updated: OpenSSL wrapper for using the recent 1.0.2h version. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'RMChart DLL class usage' samples are based upon the RMChart.dll from http://www.rmchart.com. Based upon a code contributed by Jose Quintas. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\RMChart_DLL_2) * New: 'TSBrowse Load Fields with ordered data' sample. Contributed by Igor Nazarov. Revised by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\Tsb_LoadFields) * Updated: 'My Dbf Browse' sample: - modified for compatibility with the last Browse control changes. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\BROWSE_8) * Updated: 'Help Demo' sample: - replace an obsolete HLP format with CHM format. Based upon a contribution of Kevin Carmody <i@kevincarmody.com> (see in folder \samples\Basic\HELP) * Updated: 'Auto Completing ComboBox' sample. Based upon a contribution of S.Rathinagiri <srgiri@dataone.in> (see in folder \samples\Advanced\AutoFill_2) * Updated: 'Transactions in DBF' sample: - added a brief document about a Table, Record and Field classes. Based upon the Table class of the Harbour contrib library xHb. (see ttable.txt in folder \samples\Advanced\TRANSACTIONS) [/pre2]Благодарю за Ваше внимание , а также за финансовую поддержку данного проекта

Vlad04: DBG_TEST c:\MiniGUI\SAMPLES\Advanced\DBG_TEST\ Не собирается Harbour 3.2.0dev (r1605041350) Copyright (c) 1999-2016, http://harbour-project.org/ C:/MiniGUI/lib/debugger.lib: file not recognized: File format not recognized collect2: ld returned 1 exit status hbmk2[dbg_test]: Error: Running linker. 1

Haz: Vlad04 пишет: C:/MiniGUI/lib/debugger.lib: file not recognized: File format not recognized скорее всего пытаешься собрать в Mingw и кормишь ему борландовскую библиотеку В среде BCC55 собирается без единого замечания Строка "File format not recognized" это строка MInGw, ВСС ее не использует Это "collect2:" - тоже из Mingw А это debugger.lib файл в формате библиотеки Borland C

Vlad04: Haz Запустил build.bat , который был в директории и получил сообщение.

Haz: Vlad04 пишет: запустил build Пишу с мобилки, поэтому коротео. Это называется "горе от ума".hbmk2 который собирает приложение - слишком умный. Когда в системе установлены несколько компиляторов которые он понимает. И когда пользователь не позаботился явно указать чем собирать, hbmk2 ищет сам. В данном случае по псвоим алгоритмам он раньше нахоит Mingw. Укажи явно что собирать надо борландом. У hbmk2 есть ключик, посмотреть можно hbmk2.exe - help.

Dima: Vlad04 пишет: Запустил build.bat , который был в директории и получил сообщение. Пути поправь в buildapp.bat Проверил , нормально собирается и под BCC и под MINGW

Haz: На счет пути в buildapp не скажу. Т.к. не помню его содержимое. Возможно там путей и нет, а может Дима прав. Как вариант можно в пути поиска PATH раньше указать папку с борландом.

Dima: Haz пишет: Возможно там путей и нет Есть пути Игорь Например в начале (я сам правил , под себя) [pre2] SET HMGPATH=c:\minigui_mg\hmg SET PATH=%HMGPATH%\harbour\bin;%HMGPATH%\mingw32\bin;%PATH% SET HMGRPATH=c:\minigui_mg\minigui [/pre2]

Haz: Dima пишет: Есть пути Приехал на работу, пишу с компа ))) не факт что пути есть - вот содержимое build.bat из поставки Minigui - всего одна строка call ..\..\..\batch\hbmk2.bat %* -b -trace dbg_test.hbp dbg_test.hbc видимо надо добавить

Dima: Haz я не про тот батник (а тот что на пикче ниже) )) и потом под Mingw там чуть иная структура каталогов

Haz: Dima пишет: не про тот батник так бы сразу и сказал

Andrey: Haz пишет: и потом под Mingw там чуть иная структура каталогов Можно ли разместить МиниГуи под Mingw и BCC на одном диске ? Хочется собирать проекты под разными компиляторами и посмотреть разницу.

Dima: Andrey пишет: Можно ли разместить МиниГуи под Mingw и BCC на одном диске ? А что мешает то ? Они живут по разным путям , у меня например.

Andrey: Dima пишет: А что мешает то ? Да по умолчанию ставятся в одни и теже папки... Dima пишет: Они живут по разным путям , у меня например. Как сделано - напиши... Можно ли сделать 2 разных *.hbp файла в одной папки для сборки 2-х разных ехе-ников ?

Dima: Andrey пишет: Да по умолчанию ставятся в одни и теже папки... Правда что ли ? Минигуи под MiGW это архив а не инсталяха и куда распакуешь его туда и встанет.

Dima: Andrey пишет: Можно ли сделать 2 разных *.hbp файла в одной папки для сборки 2-х разных ехе-ников ? Можно , но надо править дороги в батниках. PS Все дело в дорогах и батниках если кратко.

Alex_Cher: gfilatov2002 пишет: Сегодня выпущен очередной релиз библиотеки Minigui Ex. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.05-setup.zip После обновления 16.05 при вызове GRID поверх стали появляться lable главного окна ... Было стало

Haz: Alex_Cher пишет: при вызове GRID поверх стали появляться lable главного окна ... Возможно проблему решит SetFocus на Grid или Hide на Label и Button и зачем создавать себе трудности выводя контролы с пересекающимися координатами если на форме в одном месте должно выводиться несколько контролов, у меня к примеру в зависимости от условий это GetBox, Combo, CheckBox и др. то видимый всегда один, остальные прячу

Alex_Cher: Haz пишет: Возможно проблему решит SetFocus на Grid или Hide на Label и Button В общем согласен ..., но на предыдущих сборках Enabled на Label и Button (как видно на фото) решал все подобные проблемы.

Softlog86: SHOW/HIDE и VISIBLE для Label работают не так как ENABLE .... :)

gfilatov2002: Сегодня выпущен очередной релиз библиотеки Minigui Ex. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.06-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1606-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1606.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1606_xhb10151.zip Обратите внимание, что для mingw-сборок использована fork-версия Харбора от Виктора Закатса без всяких изменений с моей стороны

Dima: gfilatov2002 Использование CUEBANNER для BTNTEXTBOX возможна ?

gfilatov2002: Dima пишет: Использование CUEBANNER для BTNTEXTBOX Да, это возможно. Благодарю за предложение

Dima: gfilatov2002 А возможно ли сделать что бы в BUTTONEX , IMAGESIZE срабатывал и для иконок и bmp зашитых в ресурс EXE файла ? Объясню для чего надо. Есть икона в ресурсе 32x32 и ее можно будет прицепить на любую кнопку уменьшив/увеличив ее размеры. А так пока приходится держать пару - тройку одинаковых икон с разными размерами.

gfilatov2002: Dima пишет: Есть икона в ресурсе 32x32 и ее можно будет прицепить на любую кнопку уменьшив/увеличив ее размеры. Не получится, поскольку функция HMG_LoadPicture(), которая используется для масштабирования, не дружит с иконками Dima пишет: приходится держать пару - тройку одинаковых икон с разными размерами. Попробуй конвертировать самую большую иконку в PNG формат Возможно, тогда проблема с избыточными ресурсами будет решена

Andrey: Dima пишет: А так пока приходится держать пару - тройку одинаковых икон с разными размерами. Давно так мучаюсь... Куча дублей одной иконки...

Dima: gfilatov2002 пишет: Попробуй конвертировать самую большую иконку в PNG формат Идея отличная Так и сделал , поигрался.... Личные наблюдения: [pre2] 1. ICO и BMP идеально ложатся на кнопку без искажений (играл с размером 32x32) 2. Тот же PNG такого же размера (говорю примерно о такой пикче но 32x32 http://www.icons101.com/icon_png/size_512/id_73282/Excel.png лечь то она легла , но края "обгрызаны" будто хомячки погрызли. В редакторе (вьювере) картинок , ICO и такой же PNG с таким же размером выглядят идентично Попробовал ее масштабировать средствами BUTTONEX до 24x24 , та же песня , края "погрызаны" [/pre2] Куда копать пока не понял. Остался на варианте 1 , там все идеально.

Andrey: Dima пишет: Куда копать пока не понял. Нужно менять (допиливать) функцию. За вывод PNG на форму и кнопки в минигуи отвечают две функции: HBITMAP HMG_LoadImage( char * FileName ); HBITMAP HMG_LoadPicture( char * FileName, int New_Width, int New_Height, HWND hWnd, int ScaleStretch, int Transparent, long BackgroundColor, int AdjustImage ); Вот есть подсказки как нужно делать: https://msdn.microsoft.com/en-us/library/ee719902(v=VS.85).aspx https://code.logos.com/blog/2008/09/displaying_a_splash_screen_with_c_part_i.html Григорий написал: "Теперь дело за "МАЛЫМ" - найти сишника, который согласится конвертировать эту "радость" в среду Харбора." Я пока не смог найти Сишника, лето... пора отпусков... Жду сентября... Вот пример для ICO - https://cloud.mail.ru/public/85DF/VqQteEoJp Вот пример для PNG - https://cloud.mail.ru/public/DMSe/n43rPEZnk А вот так выглядит PNG на C# - https://cloud.mail.ru/public/HuNC/xaHcVzLLz

Dima: Andrey пишет: А вот так выглядит PNG на C# Выглядит отлично

gfilatov2002: Завершена подготовка новой (возможно, последней с моим участием) сборки библиотеки, которая будет опубликована завтра. Полный список изменений см. ниже [pre2] * New: Added support for a cue banner (banner text) in the BtnTextBox control. Syntax: @ <row>,<col> BTNTEXTBOX <name> [ OF <parent> ] ; [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] ; [ VALUE <value> ] [ ACTION <action> ] ; [ CUEBANNER | PLACEHOLDER <cCueText> ] Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo4.prg in folder \samples\Advanced\CueBanner) * New: Added the commands for the animated GIF support. Standard syntax: @ <row>,<col> ANIGIF <controlname> [ OBJ <oGif> ] [ OF <parent> ] ; PICTURE <filename> [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] ; [ BACKGROUNDCOLOR <aBKGcolor> ] [ DELAY <nDelay> ] RELEASE ANIGIF <name> OF <parent> Alternative syntax: DEFINE ANIGIF Gif_1 ROW 20 COL 20 WIDTH 100 HEIGHT 100 PICTURE filename BKGNDCOLOR WHITE END ANIGIF Based upon a contribution of Petr Chornyj and the TGif class. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\tgif) * Enhanced: The standard ComboBox control with DISPLAYEDIT clause supports an optional AUTOCOMPLETE clause with a facultative SHOWDROPDOWN option. It will be automatically completes input strings by comparing the prefix being entered to the prefixes of all strings in the maintained items. This is useful for ComboBox controls in which URLs, addresses, file names, or commands will be frequently entered. Sample code: DEFINE COMBOBOX combo_1 ROW 10 COL 10 WIDTH 150 HEIGHT 200 ITEMS aItems SORT .T. DISPLAYEDIT .T. AUTOCOMPLETE .T. SHOWDROPDOWN .T. END COMBOBOX Based upon a contribution of S.Rathinagiri <srgiri@dataone.in>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\AutoFill_2) * Enhanced: The Grid control supports the optional 'ColumnSort {}' clause. This clause specifies that column's headers allows to sort a data via a mouse click with showing a corresponding headers image. Syntax: @ <row>,<col> GRID <name> [ OF <parent> ] ; [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] ; [ HEADERS <aHeaders> ] [ WIDTHS <aWidths> ] ; [ ITEMS <aItems> ] [ VALUE <value> ] [ COLUMNSORT <aSort> ] where the array aSort may have the following values for each column: 0 - no sorting; 1 - ascending sort; 2 - descending sort. Based upon a contribution by Bicahi Esgici <esgici@gmail.com>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see demo7.prg in folder \samples\Basic\Grid_3) * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - Fixed: a small correction in the method SortArray(). Contributed by Janusz Pora <januszpora@onet.eu>. - Updated: added workaround for a problem with a current row painting at WinXP/Seven. Suggested by Igor Nazarov. * Updated: Harbour Compiler 3.2.0dev (SVN 2016-06-29 23:02). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: HMGS-IDE v.1.3.0 Project Manager and Two-Way Visual Form Designer. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look for what's new at changelog.txt in folder \Ide) * New: 'Charts DBF' sample is based on the Selector library of Janusz Piwowarski: - implementation of pseudo-SQL command SELECT for the queries to DBF. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\Charts_3) * New: 'OptionBox() function' sample. Based upon a contribution of Roberto Lopez <mail.box.hmg@gmail.com> (see in folder \samples\Basic\OptionBox) * Updated: 'Gif89 Demo' sample for compatibility with the last Minigui changes. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\AnimatedGif) * Updated: 'TGif class' sample for compatibility with the last Minigui changes. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\tgif) * Updated: 'Print Pie Graph' sample: updated the data for June 2016. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'Sort Grid Columns' sample: show of the alternative syntax. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\HeaderImage) * Updated: 'Browse with LOGRDD rdd driver' sample: misc bugfix. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\LogRdd) [/pre2] Благодарю за Ваше внимание, а также за финансовую поддержку данного проекта P.S. Отдельный респект Андрею Верченко и Владимиру Рудоманову за посильную материальную помощь разработки этой библиотеки

gfilatov2002: Как и обещал, выложил очередную сборку на оф.сайте библиотеки. Ссылки на дистрибутивы есть на этой странице http://hmgextended.com/download.html Желаю успеха в нелегком труде программиста

Dima: gfilatov2002 Есть проблема. Окно + бровс. В винде жму свернуть все окна и так раз 5 подряд , после очередного восстановления окна , бровс куда то исчез :) Похожий пример из FW , отработал нормально. К примеру вот на этом примере глючит C:\MiniGUI\SAMPLES\Advanced\Tsb_LoadFields\ ЗЫ Вынь 7

Haz: Dima пишет: ЗЫ Вынь 7 В этом ЗЫ у минигуи наблюдаются проблемы с передачей фокуса. Как исправлять - не представляю, т.к. ты сам пишешь не на каждый раз глючит и ловить причину не ясно где. На 8/10 устал нажимать на свернуть окна - все работает штатно.

Dima: Haz пишет: В этом ЗЫ у минигуи наблюдаются проблемы с передачей фокуса А дедько Линарес в FW как то решил эту проблему однако Но я не хочу FW , мне нравится Минигуи !

Петр: Dima пишет: К примеру вот на этом примере глючит C:\MiniGUI\SAMPLES\Advanced\Tsb_LoadFields\ ЗЫ Вынь 7 А у меня не заглючило, Win7 тоже

Dima: Петр Пару раз клацнул наверное. У меня получилось на 4-ом разе. Глючат исключительно приложения на минигуи со всем остальным все идеально. Еще одно ЗЫ :) Mingw у меня в приложениях (так же глючит) А примерчик собран в BCC55

Dima: Петр А вот кино https://cloud.mail.ru/public/Bfu1/JCCd19jhg В примере происходит тоже , кино снимать не стал.

Петр: Dima пишет: Пару раз клацнул наверное. У меня получилось на 4-ом разе. Да нет, вроде. Клацал пока не надоело. MiniGUI свежий, компилятор BCC55, Win7 со всеми доступными обновлениями, AVG.

Dima: Петр пишет: MiniGUI свежий +1 Петр пишет: компилятор BCC55 +1 Петр пишет: Win7 со всеми доступными обновлениями на момент установки 15.05.2015 все стояло самое свежее + KB Петр пишет: AVG Drweb ХЗ что делать , не за себя душа болит а за юзеров а у них только XP и 7 , начнут вот так вот клацать и начнутся вопросы а ответить то и не чего

Петр: Понятно, что собака зарыта здесь: FUNCTION Events ( hWnd, nMsg, wParam, lParam ) Понятно, что код там (и не только там) нужно оптимизировать в любом случае, даже если бы не было артефактов. Посмотрю, что можно сделать и отпишусь. Но нужно время, и отдельная тема, например "Обработка событий в MiniGUI", что бы ветку не зас..ть окончательно, причем из лучших побуждений.

Dima: Петр пишет: Посмотрю, что можно сделать и отпишусь. Но нужно время, и отдельная тема, например "Обработка событий в MiniGUI" Петр я готов тестить в любое время суток если что.

SergKis: Поковырял команды ООП This... : i_this.ch [pre2] ... // WINDOWS (THISWINDOW) #xtranslate ThisWindow . <p:Title,NotifyIcon,NotifyTooltip,FocusedControl,BackColor,Name,Row,Col,Width,Height,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost> => GetProperty ( _HMG_THISFORMNAME , <"p"> ) #xtranslate ThisWindow . <p:Title,NotifyIcon,NotifyTooltip,Cursor,BackColor,Row,Col,Width,Height,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost> := <arg> => SetProperty ( _HMG_THISFORMNAME , <"p"> , <arg> ) #xtranslate ThisWindow . <p:Activate,Center,Release,Maximize,Minimize,Restore,Show,Hide,SetFocus> [ () ] => DoMethod ( _HMG_THISFORMNAME , <"p"> ) #xtranslate ThisWindow . <p:Handle> => GetFormHandle ( _HMG_THISFORMNAME ) #xtranslate ThisWindow . <p:Index> => GetFormIndex ( _HMG_THISFORMNAME ) #xtranslate ThisWindow . <p:ClientWidth> => GetCliWidth ( GetFormHandle ( _HMG_THISFORMNAME ) ) #xtranslate ThisWindow . <p:ClientHeight> => GetCliHeight( GetFormHandle ( _HMG_THISFORMNAME ) ) ... // COMMON ( REQUIRES TYPE CHECK ) #xtranslate This . <p:Name,Row,Col,Width,Height,BackColor> => iif ( _HMG_THISType == 'C' , GetProperty ( _HMG_THISFORMNAME , _HMG_THISCONTROLNAME , <"p"> ) , GetProperty ( _HMG_THISFORMNAME , <"p"> ) ) #xtranslate This . <p:Row,Col,Width,Height,BackColor> := <arg> => iif ( _HMG_THISType == 'C' , SetProperty ( _HMG_THISFORMNAME , _HMG_THISCONTROLNAME , <"p"> , <arg> ) , SetProperty ( _HMG_THISFORMNAME , <"p"> , <arg> ) ) #xtranslate This . <p:Show,Hide,SetFocus> [ () ] => iif ( _HMG_THISType == 'C' , DoMethod ( _HMG_THISFORMNAME , _HMG_THISCONTROLNAME , <"p"> ) , DoMethod ( _HMG_THISFORMNAME , <"p"> ) ) #xtranslate This . <p:Handle> => iif ( _HMG_THISType == 'C' , GetControlHandle ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , GetFormHandle ( _HMG_THISFORMNAME ) ) #xtranslate This . <p:Index> => iif ( _HMG_THISType == 'C' , GetControlIndex ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , GetFormIndex ( _HMG_THISFORMNAME ) ) #xtranslate This . <p:ClientWidth> => GetCliWidth ( iif ( _HMG_THISType == 'C' , GetControlHandle ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , GetFormHandle ( _HMG_THISFORMNAME ) ) ) #xtranslate This . <p:ClientHeight> => GetCliHeight( iif ( _HMG_THISType == 'C' , GetControlHandle ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , GetFormHandle ( _HMG_THISFORMNAME ) ) ) #xtranslate This . <c> . <p:ClientWidth> => GetCliWidth ( GetControlHandle ( <"c"> , _HMG_THISFORMNAME ) ) #xtranslate This . <c> . <p:ClientHeight> => GetCliHeight( GetControlHandle ( <"c"> , _HMG_THISFORMNAME ) ) #xtranslate This . <c> . <p:Value,Name,Address,BackColor,FontColor,Picture,Icon,ToolTip,FontName,FontSize,FontBold,FontUnderline,FontItalic,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Cargo,Tabstop> => GetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> ) #xtranslate This . <c> . <p:Value,Name,Address,BackColor,FontColor,Picture,Icon,ToolTip,FontName,FontSize,FontBold,FontUnderline,FontItalic,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Cargo,Tabstop> := <n> => SetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <n> ) #xtranslate This . <c> . <p:ListWidth,Position,CaretPos,ForeColor,AllowAppend,AllowDelete,AllowEdit,InputItems,DisplayItems,FormatString,Indent,Linecolor,ItemHeight,AutoFont,RichValue> => GetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> ) #xtranslate This . <c> . <p:ListWidth,Position,CaretPos,ForeColor,AllowAppend,AllowDelete,AllowEdit,Blink,InputItems,DisplayItems,FormatString,Indent,Linecolor,ItemHeight,AutoFont,RichValue> := <n> => SetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <n> ) #xtranslate This . <c> . <p:Caption,Header,Image,Item,Icon,ToolTip,Width,ColumnWidth,Enabled,RichValue,HeaderImage,CheckboxItem> (<arg>) => GetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <arg> ) #xtranslate This . <c> . <p:Velocity> := <n> => SetProperty ( _HMG_THISFORMNAME, <"c"> , "Velocity" , <n> ) #xtranslate This . <c> . <p:Caption,Header,Image,Item,Icon,ToolTip,Width,ColumnWidth,Enabled,RichValue,CheckboxItem> (<arg>) := <n> => SetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <arg> , <n> ) #xtranslate This . <c> . <p:Cell> (<arg1> , <arg2>) => GetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <arg1> , <arg2> ) #xtranslate This . <c> . <p:Cell> (<arg1> , <arg2>) := <n> => SetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <arg1> , <arg2> , <n> ) #xtranslate This . <c> . <p:HeaderImage> (<arg1>) := <arg2> => SetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <arg1> , <arg2> ) #xtranslate This . <c> . <p:HeaderImage> (<arg1>) := {<arg2> , <arg3>} => SetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <arg1> , <arg2> , <arg3> ) #xtranslate This . <c> . <p:EnableUpdate,DisableUpdate,Refresh,SetFocus,DeleteAllItems,Release,Show,Save,Hide,Play,Stop,Close,Pause,Eject,OpenDialog,Resume,Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick,ColumnsAutoFit,ColumnsAutoFitH> \[()\] => Domethod ( _HMG_THISFORMNAME, <"c"> , <"p"> ) #xtranslate This . <c> . <p:AddItem,DeleteItem,Open,DeletePage,DeleteColumn,Expand,Collapse,Seek,ColumnAutoFit,ColumnAutoFitH> (<a>) => Domethod ( _HMG_THISFORMNAME, <"c"> , <"p"> , <a> ) #xtranslate This . <c> . <p:AddItem,AddPage> (<a1> , <a2>) => Domethod ( _HMG_THISFORMNAME, <"c"> , <"p"> , <a1> , <a2> ) #xtranslate This . <c> . <p:AddItem,AddPage> (<a1> , <a2> , <a3> ) => Domethod ( _HMG_THISFORMNAME, <"c"> , <"p"> , <a1> , <a2> , <a3> ) #xtranslate This . <c> . <p:AddItem,AddColumn,AddControl,AddPage> (<a1> , <a2> , <a3> , <a4> ) => Domethod ( _HMG_THISFORMNAME, <"c"> , <"p"> , <a1> , <a2> , <a3> , <a4> ) #xtranslate This . <c> . <p:ReadOnly,DisableEdit,Length> => GetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> ) #xtranslate This . <c> . <p:ReadOnly,DisableEdit,Speed,Volume,Zoom,Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick> := <n> => SetProperty ( _HMG_THISFORMNAME, <"c"> , <"p"> , <n> ) #xtranslate This . <x> . <c> . <p:Caption,Enabled,Value> => GetProperty ( _HMG_THISFORMNAME , <"x"> , <"c"> , <"p"> ) #xtranslate This . <x> . <c> . <p:Caption,Enabled,Value> := <n> => SetProperty ( _HMG_THISFORMNAME , <"x"> , <"c"> , <"p"> , <n> ) #xtranslate This . <x> (<k>) . <c> . <p:Value,Name,Address,BackColor,FontColor,Picture,ToolTip,FontName,FontSize,FontBold,FontItalic,FontUnderline,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Cargo> => GetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> ) #xtranslate This . <x> (<k>) . <c> . <p:Value,Name,Address,BackColor,FontColor,Picture,ToolTip,FontName,FontSize,FontBold,FontItalic,FontUnderline,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Cargo> := <n> => SetProperty ( _HMG_THISFORMNAME , <"x"> , <k> , <"c"> , <"p"> , <n> ) #xtranslate This . <x> (<k>) . <c> . <p:ListWidth,Position,CaretPos,ForeColor,RichValue> => GetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> ) #xtranslate This . <x> (<k>) . <c> . <p:ListWidth,Position,CaretPos,ForeColor,RichValue> := <n> => SetProperty ( _HMG_THISFORMNAME , <"x"> , <k> , <"c"> , <"p"> , <n> ) #xtranslate This . <x> (<k>) . <c> . <p:Caption,Header,Item,Icon,RichValue,CheckboxItem> (<arg>) => GetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <arg> ) #xtranslate This . <x> (<k>) . <c> . <p:Caption,Header,Item,Icon,RichValue,CheckboxItem> (<arg>) := <n> => SetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <arg> , <n> ) #xtranslate This . <x> (<k>) . <c> . <p:Refresh,SetFocus,DeleteAllItems,Release,Show,Save,Hide,Play,Stop,Close,Pause,Eject,OpenDialog,Resume,Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick> \[()\] => Domethod ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> ) #xtranslate This . <x> (<k>) . <c> . <p:AddItem,DeleteItem,Open,DeletePage,DeleteColumn,Expand,Collapse,Seek> (<a>) => Domethod ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <a> ) #xtranslate This . <x> (<k>) . <c> . <p:AddItem,AddPage> (<a1> , <a2>) => Domethod ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <a1> , <a2> ) #xtranslate This . <x> (<k>) . <c> . <p:AddItem,AddPage> (<a1> , <a2> , <a3> ) => Domethod ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <a1> , <a2> , <a3> ) #xtranslate This . <x> (<k>) . <c> . <p:AddItem,AddColumn,AddControl,AddPage> (<a1> , <a2> , <a3> , <a4> ) => Domethod ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <a1> , <a2> , <a3> , <a4> ) #xtranslate This . <x> (<k>) . <c> . <p:Length> => GetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> ) #xtranslate This . <x> (<k>) . <c> . <p:ReadOnly,DisableEdit,Speed,Volume,Zoom> := <n> => SetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <n> ) #xtranslate This . <x> (<k>) . <c> . <p:Cell> (<arg1> , <arg2>) => GetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <arg1> , <arg2> ) #xtranslate This . <x> (<k>) . <c> . <p:Cell> (<arg1> , <arg2>) := <n> => SetProperty ( _HMG_THISFORMNAME, <"x"> , <k> , <"c"> , <"p"> , <arg1> , <arg2> , <n> ) #xtranslate This . SplitBox . <c> . <p:Value,Name,Address,BackColor,FontColor,Picture,ToolTip,FontName,FontSize,FontBold,FontItalic,FontUnderline,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Position,CaretPos,ForeColor,AllowEdit,Object,InputItems,DisplayItems,Cargo> => GetProperty ( _HMG_THISFORMNAME, "SplitBox" , <"c"> , <"p"> ) #xtranslate This . SplitBox . <c> . <p:Value,Name,Address,BackColor,FontColor,Picture,ToolTip,FontName,FontSize,FontBold,FontItalic,FontUnderline,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Position,CaretPos,ForeColor,AllowEdit,Blink,InputItems,DisplayItems,Cargo> := <n> => SetProperty ( _HMG_THISFORMNAME, "SplitBox" , <"c"> , <"p"> , <n> ) #xtranslate This . SplitBox . <c> . <p:AllowAppend,AllowDelete,DisableEdit,ReadOnly> => GetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> ) #xtranslate This . SplitBox . <c> . <p:AllowAppend,AllowDelete,DisableEdit,ReadOnly> := <n> => SetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <n> ) #xtranslate This . SplitBox . <c> . <p:Caption,Header,Item,Icon,HeaderImages,CheckboxItem> (<arg>) => GetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <arg> ) #xtranslate This . SplitBox . <c> . <p:Caption,Header,Item,Icon,HeaderImages,CheckboxItem> (<arg>) := <n> => SetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <arg> , <n> ) #xtranslate This . SplitBox . <c> . <p:Cell> (<arg1> , <arg2>) => GetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <arg1> , <arg2> ) #xtranslate This . SplitBox . <c> . <p:Cell> (<arg1> , <arg2>) := <n> => SetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <arg1> , <arg2> , <n> ) #xtranslate This . SplitBox . <c> . <p:Refresh,SetFocus,DeleteAllItems,Release,Show,Save,Hide,Play,Stop,Close,Pause,Eject,OpenDialog,Resume,Action,OnClick,OnGotFocus,OnLostFocus,OnChange,OnDblClick> \[()\] => Domethod ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> ) #xtranslate This . SplitBox . <c> . <p:AddItem,DeleteItem,Open,DeletePage,DeleteColumn,Expand,Collapse,Seek> (<a>) => Domethod ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <a> ) #xtranslate This . SplitBox . <c> . <p:AddItem,AddPage> (<a1> , <a2>) => Domethod ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <a1> , <a2> ) #xtranslate This . SplitBox . <c> . <p:AddItem,AddPage> (<a1> , <a2> , <a3> ) => Domethod ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <a1> , <a2> , <a3> ) #xtranslate This . SplitBox . <c> . <p:AddItem,AddColumn,AddControl,AddPage> (<a1> , <a2> , <a3> , <a4> ) => Domethod ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <a1> , <a2> , <a3> , <a4> ) #xtranslate This . SplitBox . <c> . <p:Name,Length> => GetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> ) #xtranslate This . SplitBox . <c> . <p:ReadOnly,DisableEdit,Speed,Volume,Zoom> := <n> => SetProperty ( _HMG_THISFORMNAME, "SplitBox", <"c"> , <"p"> , <n> ) #xtranslate This . SplitBox . <x> . <c> . <p:Caption,Enabled,Value> => GetProperty ( _HMG_THISFORMNAME , "SplitBox" , <"x"> , <"c"> , <"p"> ) #xtranslate This . SplitBox . <x> . <c> . <p:Caption,Enabled,Value> := <n> => SetProperty ( _HMG_THISFORMNAME , "SplitBox", <"x"> , <"c"> , <"p"> , <n> ) // EVENT PROCEDURES ... [/pre2] Для команд выделенных цветом использовал доп. функции ( назвал так, что бы не пересечься с похожими ) [pre2] FUNCTION GetCliWidth ( nHandle ) LOCAL aRect := {0,0,0,0} GetClientRect( nHandle, aRect ) RETURN ( aRect[3] - aRect[1] ) FUNCTION GetCliHeight( nHandle ) LOCAL aRect := {0,0,0,0} GetClientRect( nHandle, aRect ) RETURN ( aRect[4] - aRect[2] ) [/pre2] Если ф-ии лишнии, то надо убрать выделенные цветом команды. Использовать как обычно This.Width , This.Height , This.Handle , This.Index This.Btn.Width, This.Btn.Height, This.Btn.Handle , This.Btn.Index This.ClientWidth, This.ClientHeight This.Btn.ClientWidth, This.Btn.ClientHeight Все варианты написания не проверял (может совместными усилиями ?)

gfilatov2002: SergKis пишет: Для команд выделенных цветом использовал доп. функции Благодарю за дополнение команды This P.S. Заменил доп. функции на одну уже существующую в коде библиотеки функцию _GetClientRect()

SergKis: gfilatov2002 Еще к командам ООП [pre2] i_window.ch ======== ... #ifdef _SOOP_CONTAINERS_ ... #xcommand DECLARE WINDOW <w> ; =>; #xtranslate <w> . \<p:Handle\> => GetFormHandle ( <"w"> ) ;; #xtranslate <w> . \<p:Index\> => GetFormIndex ( <"w"> ) ;; #xtranslate <w> . \<p:Name,Title,Height,Width,Col,Row,NotifyIcon,NotifyToolTip,FocusedControl,BackColor,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,HelpButton\> => GetProperty ( <"w">, \<"p"\> ) ;; ... #xtranslate <w> . \<p:SaveAs\> (\<a\>) => DoMethod ( <"w"> , "SaveAs", \<a\> ) ;; #xtranslate <w> . \<p:ClientHeight\> => GetCliHeight( GetFormHandle ( <"w"> ) ) ;; #xtranslate <w> . \<p:ClientWidth\> => GetCliWidth ( GetFormHandle ( <"w"> ) ) ;; #xtranslate <w> . \<c\> . \<p:SaveAs\> (\<a\>) => DoMethod ( <"w"> , \<"c"\> , "SaveAs", \<a\> ) ;; #xtranslate <w> . \<c\> . \<p:Handle\> => GetControlHandle ( \<"c"\> , <"w"> ) ;; #xtranslate <w> . \<c\> . \<p:Index\> => GetControlIndex ( \<"c"\> , <"w"> ) ;; #xtranslate <w> . \<c\> . \<p:ClientHeight\> => GetCliHeight( GetControlHandle ( \<"c"\> , <"w"> ) ) ;; #xtranslate <w> . \<c\> . \<p:ClientWidth\> => GetCliWidth ( GetControlHandle ( \<"c"\> , <"w"> ) ) ;; #xtranslate <w> . \<c\> . \<p:Value,Name,Address,BackColor,FontColor,Picture,Icon,ToolTip,FontName,FontSize,FontBold,FontUnderline,FontItalic,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Cargo,Tabstop\> => GetProperty ( <"w">, \<"c"\> , \<"p"\> ) ;; ... #else #xcommand DECLARE WINDOW <w> ; =>; #xtranslate <w> . \<p:Handle\> => GetFormHandle ( <"w"> ) ;; #xtranslate <w> . \<p:Index\> => GetFormIndex ( <"w"> ) ;; #xtranslate <w> . \<p:Name,Title,Height,Width,Col,Row,NotifyIcon,NotifyToolTip,FocusedControl,BackColor,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,HelpButton\> => GetProperty ( <"w">, \<"p"\> ) ;; ... #xtranslate <w> . \<p:SaveAs\> (\<a\>) => DoMethod ( <"w"> , "SaveAs", \<a\> ) ;; #xtranslate <w> . \<p:ClientHeight\> => GetCliHeight( GetFormHandle ( <"w"> ) ) ;; #xtranslate <w> . \<p:ClientWidth\> => GetCliWidth ( GetFormHandle ( <"w"> ) ) ;; #xtranslate <w> . \<c\> . \<p:SaveAs\> (\<a\>) => DoMethod ( <"w"> , \<"c"\> , "SaveAs", \<a\> ) ;; #xtranslate <w> . \<c\> . \<p:Handle\> => GetControlHandle ( \<"c"\> , <"w"> ) ;; #xtranslate <w> . \<c\> . \<p:Index\> => GetControlIndex ( \<"c"\> , <"w"> ) ;; #xtranslate <w> . \<c\> . \<p:ClientHeight\> => GetCliHeight( GetControlHandle ( \<"c"\> , <"w"> ) ) ;; #xtranslate <w> . \<c\> . \<p:ClientWidth\> => GetCliWidth ( GetControlHandle ( \<"c"\> , <"w"> ) ) ;; #xtranslate <w> . \<c\> . \<p:Value,Name,Address,BackColor,FontColor,Picture,Icon,ToolTip,FontName,FontSize,FontBold,FontUnderline,FontItalic,FontStrikeOut,Caption,Row,DisplayValue,Col,Width,Height,Visible,Enabled,Checked,ItemCount,RangeMin,RangeMax,Cargo,Tabstop\> => GetProperty ( <"w">, \<"c"\> , \<"p"\> ) ;; ... #endif ... i_pseudofunc.ch ========== ... #translate Application.Height := <arg> => MoveWindow ( Application.Handle , Application.Col , Application.Row , Application.Width , <arg> , .t. ) #translate Application.ClientWidth => GetCliWidth ( Application.Handle ) #translate Application.ClientHeight => GetCliHeight( Application.Handle ) #translate Application.Title => GetWindowText ( Application.Handle ) ... Лень все время писать Application..... сделал себе вариант App.... #translate App.ExeName => GetExeFileName() #translate App.Handle => _HMG_MainHandle #translate App.FormName => _HMG_aFormNames \[ _HMG_MainIndex \] #translate App.Col => GetWindowCol ( App.Handle ) #translate App.Col := <arg> => MoveWindow ( App.Handle , <arg> , App.Row , App.Width , App.Height , .t. ) #translate App.Row => GetWindowRow ( App.Handle ) #translate App.Row := <arg> => MoveWindow ( App.Handle , App.Col , <arg> , App.Width , App.Height , .t. ) #translate App.Width => GetWindowWidth ( App.Handle ) #translate App.Width := <arg> => MoveWindow ( App.Handle , App.Col , App.Row , <arg> , App.Height , .t. ) #translate App.ClientWidth => GetCliWidth ( App.Handle ) #translate App.ClientHeight => GetCliHeight ( App.Handle ) #translate App.Height => GetWindowHeight ( App.Handle ) #translate App.Height := <arg> => MoveWindow ( App.Handle , App.Col , App.Row , App.Width , <arg> , .t. ) #translate App.Title => GetWindowText ( App.Handle ) #translate App.Title := <arg> => SetWindowText ( App.Handle, <arg> ) #translate App.Cursor := <arg> => SetWindowCursor ( App.Handle, <arg> ) #translate App.BackColor => _HMG_aFormBkColor \[ _HMG_MainIndex \] #translate App.BackColor := <arg> => _SetWindowBackColor ( App.Handle, <arg> ) #translate App.Topmost => GetProperty ( App.FormName, 'Topmost' ) #translate App.Topmost := <arg> => _ChangeWindowTopmostStyle ( App.Handle, <arg> ) #translate App.HelpButton => GetProperty ( App.FormName, 'HelpButton' ) #translate App.HelpButton := <arg> => _ChangeWindowHelpButtonStyle ( App.FormName, <arg> ) ... [/pre2]

Andrey: SergKis пишет: Использовать как обычно This.Width , This.Height , This.Handle , This.Index Т.е. вместо nFWidth := GetClientWidth( GetFormHandle( _HMG_ThisFormName ) ) nFHeight := GetClientHeight( GetFormHandle( _HMG_ThisFormName ) ) можно будет писать так: nFWidth := This.Width nFHeight := This.Height

Dima: Andrey пишет: This.Width This.ClientWidth

gfilatov2002: SergKis пишет: Еще к командам ООП Благодарю Добавил эти модификации также...

SergKis: Andrey пишет можно будет писать так: nFWidth := This.Width nFHeight := This.Height пример использования [pre2] DEFINE WINDOW wndCalc AT 0,0 ; ... nWidth := This.ClientWidth - x * 2 ... @ y, x LABEL Itog VALUE "" ; ... y += This.Itog.Height + n ... For i := 1 To len(a) If ! empty(a[ i ]) j := "Btn"+a[ i ][1] DEFINE BUTTONEX &j ... ACTION PostMsg() END BUTTONEX This.&(j).Cargo := a[ i ][2] EndIf ... nW := This.ClientWidth - int(n * 0.6) nH := y DRAW RECTANGLE IN WINDOW &( This.Name ) AT nY, nX TO nH, nW ; PENCOLOR BLUE END WINDOW ... STATIC FUNCTION PostMsg( nKey, lFocus ) LOCAL c, j := This.Name Default lFocus := .T. If j != ThisWindow.Name // это контрол не окно c := This.&(j).Cargo If c == "." ; nKey := 190 Elseif c == "C" ; nKey := 32 ElseIf c $ "0123456789"; nKey := 48 + val(c) EndIf EndIf If ! empty(nKey) PostMessage( ThisWindow.Handle, WM_KEYDOWN, nKey, 0) EndIf If lFocus This.Itog.SetFocus EndIf RETURN Nil [/pre2]

SergKis: gfilatov2002 Еще немного ООП строк [pre2] i_this.ch ========= ... // WINDOWS (THISWINDOW) #xtranslate ThisWindow . <p:Type> => GetWindowType ( _HMG_THISFORMNAME ) #xtranslate ThisWindow . <p:Handle> => GetFormHandle ( _HMG_THISFORMNAME ) ... // COMMON ( REQUIRES TYPE CHECK ) ... #xtranslate This . <p:Type> => iif ( _HMG_THISType == 'C' , GetControlType ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , GetWindowType ( _HMG_THISFORMNAME ) ) #xtranslate This . <p:Handle> => iif ( _HMG_THISType == 'C' , GetControlHandle ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , GetFormHandle ( _HMG_THISFORMNAME ) ) ... #xtranslate This . <c> . <p:Type> => GetControlType ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) #xtranslate This . <c> . <p:Handle> => GetControlHandle ( <"c"> , _HMG_THISFORMNAME ) ... i_window.ch =========== #ifdef _SOOP_CONTAINERS_ ... #xcommand DECLARE WINDOW <w> ; =>; #xtranslate <w> . \<p:Type\> => GetWindowType ( <"w"> ) ;; #xtranslate <w> . \<p:Handle\> => GetFormHandle ( <"w"> ) ;; ... #xtranslate <w> . \<c\> . \<p:Type\> => GetControlType ( \<"c"\> , <"w"> ) ;; #xtranslate <w> . \<c\> . \<p:Handle\> => GetControlHandle ( \<"c"\> , <"w"> ) ;; ... #else #xcommand DECLARE WINDOW <w> ; =>; #xtranslate <w> . \<p:Type\> => GetWindowType ( <"w"> ) ;; #xtranslate <w> . \<p:Handle\> => GetFormHandle ( <"w"> ) ;; ... #xtranslate <w> . \<c\> . \<p:Type\> => GetControlType ( \<"c"\> , <"w"> ) ;; #xtranslate <w> . \<c\> . \<p:Handle\> => GetControlHandle ( \<"c"\> , <"w"> ) ;; ... #endif ... i_pseudofunc.ch =============== ... //////////////////////////////////////////// // System pseudo-commands //////////////////////////////////////////// #translate Desktop.Col => GetDesktopRealLeft() #translate Desktop.Row => GetDesktopRealTop() #translate Desktop.Width => GetDesktopRealWidth() #translate Desktop.Height => GetDesktopRealHeight() #translate System.Clipboard => RetrieveTextFromClipboard() ... [/pre2]

gfilatov2002: SergKis пишет: #xtranslate This . <p:Type> Благодарю за дополнение - добавил SergKis пишет: #translate Desktop.Col => GetDesktopRealLeft() #translate Desktop.Row => GetDesktopRealTop() #translate Desktop.Width => GetDesktopRealWidth() #translate Desktop.Height => GetDesktopRealHeight() Не стал добавлять, поскольку эти функции не входят в библиотеку (они взяты из примеров). Кстати, завершена подготовка очередной сборки 16.08, которая выйдет на следующей неделе. Список изменений см. ниже [pre2] * Fixed: Missing NOBORDER clause handling in a GetBox control at the alternative syntax. Problem was reported by Dusko Radojcin. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Changed: ANIMATERES User Component was moved from the samples to MiniGUI core. This control opens and displays continuously an AVI clip from a resource in a specified module. Note: You can only use silent AVI clips. Syntax: @ <row>,<col> ANIMATERES <name> [ OF <parent> ] ; [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] ; FILE <DLL or EXE filename> ID <resource> [ TOOLTIP <tooltip> ] Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\AVI_Animation) * Changed: The ON CANCEL action in the ComboBox control will fire only if a last pressed key was <Escape> key. It indicates the user's initial selection is to be ignored. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: Added the readonly 'Index', 'Type', 'ClientWidth' and 'ClientHeight' properties to 'This' object reference. Common syntax: Control_idx := This.Index, Form_idx := This.Index etc. Windows only syntax: Form_idx := ThisWindow.Index Based upon a contribution of Russian user SergKis (see demo in folder \samples\Basic\GetClientSize) * Enhanced: Added a shorten form 'App' for the 'Application' object. Examples: App.ExeName, App.Handle, App.FormName etc. Suggested by SergKis. * Enhanced: The function PutFile() supports an optional 7-th parameter to control the overwriting if a file already exists. Syntax: PutFile( aFilter, title, cIniFolder, lNoChangeCurDir, cDefFileName,; /*@*/ nFilterIndex, lPromptOverwrite ) If <lPromptOverwrite> set to .T. (default is .F.) and a file already exists, user will be asked to overwrite it or not. Contributed by Pete Dionysopoulos <pete_westg@yahoo.gr> (see demo2.prg in folder \samples\Basic\PutFile) * Updated: Synchronized Extended HMG for compatibility with Official HMG: * Added MiniPrint2 library with the following modifications: - Enhanced look and feel of Print Preview; - Enhanced quality of images of ThumbNails in printer preview; - Changed cursor behavior in Print Preview window: Zoom and Glass Cursor only into page to print. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see source in folder \Source\MiniPrint2) (see demo in folder \samples\Advanced\MiniPrint2) * Updated: Header file i_hmgcompat.ch for compatibility with Official HMG: - added the following commands: SET CONTROL <ControlName> OF <FormName> ; CLIENTEDGE | STATICEDGE | WINDOWEDGE | NOTEDGE Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: C-code cleaning for correct compiling with the Embarcadero BCC 10.1: - added missing casting for C++ mode into the MiniGUI core, CallDll, HbPrinter and MiniPrint libraries. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - fixed a tooltip handle assigning error at Windows Server 2008. Problem was reported by Dusko Radojcin. - fixed a wrong workaround (introduced in the build 16.07). Bug was reported by Jaroslaw Kadziola <kadziola@tlen.pl> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.14.0dev. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2016-07-18 20:32). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'DO REPORT command with a simple formatting' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Basic\DO_REPORT) * New: 'ActiveX Report Generator' sample. Based upon a freeware CatchysoftReport.Dll from the following URL: http://www.catchysoft.com/report_generator.html. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\ActiveX_Report) * New: 'Run the executable file from an application resource' console sample. Based upon a contribution at Harbour developer forum. (see in folder \samples\Advanced\RCDataToFile) * Updated: 'HMG Cursor' sample: - added the function PutMouse(). Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see in folder \samples\Basic\CURSOR) * Updated: 'TSBrowse Incremental Seek With Footer's GetBox' sample: - fixed using of "hole" detection. Problem was reported by russian user. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\Tsb_seek_2) [/pre2] И напоследок - небольшой запрос Требуется помощь в портировании winapi-функции TaskDialogIndirect в среду Харбор/Минигуи. Петр, возьметесь

Петр: gfilatov2002 пишет: Требуется помощь в портировании winapi-функции TaskDialogIndirect в среду Харбор/Минигуи. Петр, возьметесь Вечером посмотрю, чем могу помочь

gfilatov2002: Петр пишет: посмотрю, чем могу помочь Заранее благодарен В принципе, вызов этой функции на Си выглядит несложно: [pre]HRESULT hr; TASKDIALOGCONFIG tdc = { sizeof(TASKDIALOGCONFIG) }; int nClickedBtn; BOOL bCheckboxChecked; TASKDIALOG_BUTTON aCustomButtons[] = { { 1000, MAKEINTRESOURCE(IDS_DOWNLOAD_BTN_TEXT) }, { 1001, MAKEINTRESOURCE(IDS_DONT_DOWNLOAD_BTN_TEXT) } }; tdc.hwndParent = m_hWnd; tdc.hInstance = _AtlBaseModule.GetResourceInstance(); tdc.dwFlags = TDF_USE_COMMAND_LINKS|TDF_ENABLE_HYPERLINKS; tdc.pButtons = aCustomButtons; tdc.cButtons = _countof(aCustomButtons); tdc.pszWindowTitle = MAKEINTRESOURCE(IDS_TASKDLG_TITLE); tdc.pszMainIcon = MAKEINTRESOURCE(IDI_MY_TD_ICON); tdc.pszMainInstruction = MAKEINTRESOURCE(IDS_TASKDLG_HEADER); tdc.nDefaultButton = 1001; tdc.pszExpandedInformation = MAKEINTRESOURCE(IDS_TASKDLG_EXTRA_INFO); tdc.pszVerificationText = MAKEINTRESOURCE(IDS_TASKDLG_CHKBOX_TEXT); tdc.pszFooter = MAKEINTRESOURCE(IDS_TASKDLG_FOOTER); tdc.pszFooterIcon = TD_INFORMATION_ICON; tdc.pfCallback = TDCallback; tdc.lpCallbackData = (LONG_PTR) this; // not used, but I'm setting this for demonstration purposes hr = TaskDialogIndirect ( &tdc, &nClickedBtn, NULL, &bCheckboxChecked ); [/pre] Вопрос в том, как это оформить для удобного использования в Харборе (с учетом вызова Callback-функции и использования ресурсных строк)

Петр: gfilatov2002 пишет: Вопрос в том, как это оформить для удобного использования в Харборе (с учетом вызова Callback-функции и использования ресурсных строк) Вот так пойдет? TaskDialogIndirect( aConfig, @nButton, @nRadioButton, @lVerificationFlagChecked ) Шаблон демо [pre2]#include "tdi.ch" PROCEDURE TDI_Demo() LOCAL aConfig, nButton, nRadioButton, lVerificationFlagChecked := .f. LOCAL nResult aConfig := Array( TDC_CONFIG ) /* 2. TDC_HWND - handle to the parent window. This member can be NIL. */ aConfig[TDC_HWND] := ThisWindow.Handle /* 3. TDC_HINSTANCE - handle to the module that contains the icon resource identified by the pszMainIcon or pszFooterIcon members, and the string resources identified by the pszWindowTitle, pszMainInstruction, pszContent, pszVerificationText, pszExpandedInformation, pszExpandedControlText, pszCollapsedControlText or pszFooter members. */ aConfig[TDC_HINSTANCE] := GetInstance() /* 4. TDC_TASKDIALOG_FLAGS - Specifies the behavior of the task dialog. This parameter can be a combination of flags. */ aConfig[TDC_TASKDIALOG_FLAGS] := hb_bitOr( TDF_USE_COMMAND_LINKS, TDF_ENABLE_HYPERLINKS ) /* 6. TDC_WINDOWTITLE - the string to be used for the task dialog title. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro. If this parameter is NIL, the filename of the executable program is used */ aConfig[TDC_WINDOWTITLE] := "Window Title" /* 8. TDC_MAININSTRUCTION - the string to be used for the main instruction. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro */ aConfig[TDC_MAININSTRUCTION] := "Main Instruction" /* 9. TDC_CONTENT - the string to be used for the dialog's primary content. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro. If the ENABLE_HYPERLINKS flag is specified for the TDC_DWFLAGS, then this string may contain hyperlinks in the form: <A HREF="executablestring">Hyperlink Text</A>. */ aConfig[TDC_CONTENT] := "Content" /* 16. TDC_VERIFICATIONTEXT - the string to be used to label the verification checkbox. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro. If this parameter is NIL, the verification checkbox is not displayed in the task dialog. If the lVerificationFlagChecked parameter of TaskDialogIndirect is NIL, the checkbox is not enabled. */ aConfig[TDC_VERIFICATIONTEXT] := "Verification Text" /* 17. TDC_EXPANDEDINFORMATION - the string to be used for displaying additional information. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro. The additional information is displayed either immediately below the content or below the footer text depending on whether the TDF_EXPAND_FOOTER_AREA flag is specified. If the TDF_ENABLE_HYPERLINKS flag is specified for the TDC_DWFLAGS, then this string may contain hyperlinks in the form: <A HREF="executablestring">Hyperlink Text</A>. */ aConfig[TDC_EXPANDEDINFORMATION] := "Expanded Information" /* 18. TDC_EXPANDEDCONTROLTEXT - the string to be used to label the button for collapsing the expandable information. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro. This member is ignored when the TDC_EXPANDEDINFORMATION member is NIL. If this member is NIL and the TDC_COLLAPSEDCONTROLTEXT is specified, then the TDC_COLLAPSEDCONTROLTEXT value will be used for this member as well. */ aConfig[TDC_EXPANDEDCONTROLTEXT] := "Expanded Control Text" /* 19. TDC_COLLAPSEDCONTROLTEXT - the string to be used to label the button for expanding the expandable information. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro. This member is ignored when the TDC_EXPANDEDINFORMATION member is NIL. ?? If this member is NIL and the TDC_COLLAPSEDCONTROLTEXT is specified, then the TDC_COLLAPSEDCONTROLTEXT value will be used for this member as well. ?? */ aConfig[TDC_COLLAPSEDCONTROLTEXT] := "Collapsed Control Text" /* 21. TDC_FOOTER - the string to be used in the footer area of the task dialog. This parameter can be either a string or an integer resource identifier passed to the MAKEINTRESOURCE macro. If the TDF_ENABLE_HYPERLINKS flag is specified for the TDC_DWFLAGS, then this string may contain hyperlinks in the form: <A HREF="executablestring">Hyperlink Text</A>. */ aConfig[TDC_FOOTER] := "Footer" /* 22. TDC_CALLBACK */ aConfig[TDC_CALLBACK] := {|h,n,w,l| callback( h,n,w,l )} /* 24. TDC_WIDTH - the width of the task dialog's client area, in dialog units. If 0, the task dialog manager will calculate the ideal width. */ aConfig[TDC_WIDTH] := 0 nResult := TaskDialogIndirect( aConfig, @nButton, @nRadioButton, @lVerificationFlagChecked ) /* TODO */ RETURN [/pre2]

Петр: Шаблон callback функции [pre2]STATIC FUNCTION callback( hWnd, nNotification, wParam, lParam ) LOCAL lResult := .F. /* To prevent the task dialog from closing, the application must return FALSE, otherwise the task dialog is closed */ HB_SYMBOL_UNUSED( hWnd ) HB_SYMBOL_UNUSED( lParam ) SWITCH nNotification CASE TDN_CREATED EXIT CASE TDN_DESTROYED EXIT CASE TDN_BUTTON_CLICKED // wParam - an int that specifies the ID of the button or comand link that was selected IF wParam == ID_OK ... lResult := .T. ELSEIF wParam == ID_CANCEL ... lResult := .T. EXIT CASE TDN_RADIO_BUTTON_CLICKED // wParam - an int that specifies the ID corresponding to the radio button that was clicked ... EXIT CASE TDN_EXPANDO_BUTTON_CLICKED // the user clicks on the dialog's expando button: wParam is 1 if the dialog is expanded, or 0 if not IF wParam == 1 ... ELSE ... EXIT CASE TDN_HELP // the user presses F1 on the keyboard while the dialog has focus ... EXIT CASE TDN_VERIFICATION_CLICKED // the user clicks the task dialog verification check box: wParam is the status of the checkbox. // It is 1 if the verification checkbox is checked, or 0 if it is unchecked. ... EXIT END SWITCH RETURN lResult // .t. or .f., that is the question :) [/pre2]

Петр: Если внешний harbour интерфейс сочтете удобным, то займусь дальшей реализацией С части. Пожелания приветствуются сейчас - не люблю переделывать Наброски (не проверялось компилятором - ошибки конечно присутствуют, но мысль, надеюсь, понятна ) [pre2]HRESULT CALLBACK TDCallbackProc( HWND hwnd, UINT uNotification, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData ); HRESULT CALLBACK TDCallbackProc( HWND hwnd, UINT uNotification, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData ) { HRESULT hRes; PHB_ITEM pCallback = ( PHB_ITEM ) dwRefData; if( pCallback && hb_vmRequestReenter() ) { hb_vmPushEvalSym(); hb_vmPush( pCallback ); hb_vmPushNumInt( ( HB_MAXINT ) ( HB_PTRUINT ) hWnd ); hb_vmPushNumInt( ( HB_PTRUINT ) uNotification ); // typecast ?? hb_vmPushNumInt( wParam ); hb_vmPushNumInt( lParam ); hb_vmSend( 4 ); hRes = ( ( hb_parl( -1 ) == HB_TRUE ) ? S_OK : S_FALSE ); hb_vmRequestRestore(); return hRes; } return S_OK; // S_FALSE ?? } [/pre2] [pre2] /* 16 PCWSTR pszVerificationText */ HB_TYPE hb_typ = hb_arrayGetType( pConfig, TDC_VERIFICATIONTEXT ) if ( ( hb_typ & HB_IT_STRING ) || ( hb_typ & HB_IT_NUMERIC ) ) { tdc.pszVerificationText = ( PCWSTR ) ( ( hb_typ & HB_IT_STRING ) ? hb_arrayGetCPtr( pConfig, TDC_VERIFICATIONTEXT ) : MAKEINTRESOURCE( ( WORD ) hb_arrayGetNL( pConfig, TDC_VERIFICATIONTEXT ) ) ); } else { hb_errRT_BASE_SubstR( EG_ARG, 0, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } [/pre2] [pre2] /* 22 PFTASKDIALOGCALLBACK pfCallback */ tdc.pfCallback = TDCallbackProc; /* 23 LONG_PTR lpCallbackData */ if ( hb_arrayGetType( pConfig, TDC_CALLBACK ) & HB_IT_EVALITEM ) { pCallbackData = hb_itemNew( hb_arrayGetItemPtr( pConfig, TDC_CALLBACK ) ); hb_gcUnlock( pCallbackData ); tdc.lpCallbackData = (LONG_PTR) pCallbackData; } else { hb_errRT_BASE_SubstR( EG_ARG, 0, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } [/pre2]

gfilatov2002: Петр пишет: Пожелания приветствуются сейчас Шаблон с благодарностью принимается Желательно предусмотреть конвертацию строк в unicode формат, поскольку эта функция работает только в unicode формате. hb_Translate( cWindowTitle, cCurrentCdp, "UTF8EX" ) Возможна ли обработка возврата функции типа такого [pre2] IF xRet == NIL xRet := 0x80004005 ENDIF IF ! ( xRet == 0x00000000 ) // 0x00000000 = success cMess := "" IF xRet == 0x8007000E // out of memory cMess := "There is insufficient memory to complete the operation." ELSEIF xRet == 0x80070057 // invalid argument(s) cMess := "One or more arguments are not valid." ELSEIF xRet == 0x80004005 // Unspecified failure cMess := "Operation failed! (unknown reason)." ENDIF MsgExclamation( "Requested Icon : " + hb_ntos( nIcon ) + hb_eol() + ; cMess + hb_eol() + ; "TaskDialog responded : " + hb_ntos( xRet ) + "->" + MGM_GetWinErrorStr( xRet ) + hb_eol() + ; "(non-existent ?) resource ID: " + hb_ntos( nError ) + hb_eol(), "TaskDialog" ) ENDIF [/pre2] Используемые константы для файла-заголовка tdi.ch по типу [pre2]/* buttons */ #define TDCBF_OK_BUTTON 1 // 0x1 #define TDCBF_YES_BUTTON 2 // 0x2 #define TDCBF_NO_BUTTON 4 // 0x4 #define TDCBF_CANCEL_BUTTON 8 // 0x8 #define TDCBF_RETRY_BUTTON 16 // 0x10 #define TDCBF_CLOSE_BUTTON 32 // 0x20 /* button-click return values */ #define IDOK 1 #define IDCANCEL 2 #define IDABORT 3 #define IDRETRY 4 #define IDIGNORE 5 #define IDYES 6 #define IDNO 7 #define IDCLOSE 8 /* icons */ #define TD_NO_ICON 0 // No icon appears in the task dialog. This is the default. #define TD_WARNING_ICON 65535 // An exclamation-point icon, along with warning sound. #define TD_ERROR_ICON 65534 // A stop-sign icon, along with error sound. #define TD_INFORMATION_ICON 65533 // An icon consisting of a lowercase letter `i` in a circle, along with info sound. #define TD_SHIELD_ICON 65532 // A shield icon. NOTE: All shield icons have no sound! #define TD_SHIELD_BLUE_ICON 65531 // A shield icon on a blue background. #define TD_SHIELD_WARNING_ICON 65530 // An icon consisting of an exclamation-point in a shield. appears in yellow/orange background. #define TD_SHIELD_ERROR_ICON 65529 // An icon consisting of a stop-sign in a shield. appears in red background. #define TD_SHIELD_SUCCESS_ICON 65528 // An icon consisting of a tick-sign in a shield. appears in green background. #define TD_SHIELD_BROWN_ICON 65527 // A shield icon on a brown background. #define TD_QUESTION 99 // An icon consisting of a a question-mark in a circle, no sound![/pre2]

Петр: [pre2]nResult := TaskDialogIndirect( aConfig, @nButton, @nRadioButton, @lVerificationFlagChecked ) /* TODO */[/pre2] gfilatov2002 пишет: Возможна ли обработка возврата функции типа такого Вот на месте TODO и будет такой разбор nResult.

Петр: gfilatov2002 пишет: Используемые константы для файла-заголовка tdi.ch по типу Спасибо, Григорий, а вот этот фрагмент кода откуда, если не секрет.

gfilatov2002: Петр пишет: этот фрагмент кода откуда Этот код взят из реализации функции TaskDialog() из поставки MiniguiM

Петр: gfilatov2002 пишет: из поставки MiniguiM Простите, а что это за поставка такая MiniguiM Просто любопытно.

gfilatov2002: Петр пишет: что это за поставка такая MiniguiM Лежит по адресу https://sourceforge.net/projects/hbpidew/ Один умный грек продвигает Minigui Ex на базе компилятора MinGW

Петр: gfilatov2002 пишет: Один умный грек продвигает Minigui Ex на базе компилятора MinGW Спасибо, не знал, посмотрю, но уже после завершения работы над TaskDialogIndirect Т.е. уже скоро.

Andrey: Григорий, посмотри пожалуйста Пост N: 5034 и Пост N: 1126

gfilatov2002: Andrey Любые дополнения - уже не в этой сборке (работа над ней завершена)

Andrey: gfilatov2002 пишет: Любые дополнения - уже не в этой сборке Да мы не торопимся... Лишь бы потом было !

SergKis: gfilatov2002 Мелочь (просто короче писать), но потом забуду (i_pseudofunc.ch) [pre2] #translate System.WindowsFolder => GetWindowsFolder() #translate Folder.Desktop => GetDesktopFolder() #translate Folder.MyDocuments => GetMyDocumentsFolder() #translate Folder.ProgramFiles => GetProgramFilesFolder() #translate Folder.System => GetSystemFolder() #translate Folder.Temp => GetTempFolder() #translate Folder.Windows => GetWindowsFolder() [/pre2]

SergKis: gfilatov2002 Понял, почему валится на child окне конструкция [pre2] DEFINE WINDOW wChild1 ... CHILD ; ... nW := This.Width - GetBorderWidth()*2 - 2 тип окна child C, т.е. _HMG_ThisType равно C FUNCTION _SetThisFormInfo ( i ) *-----------------------------------------------------------------------------* #ifdef _HMG_COMPAT_ _HMG_LastActiveFormIndex := i #endif _PushEventInfo() _HMG_ThisFormIndex := i _HMG_ThisEventType := 'DEFINE_WINDOW' _HMG_ThisType := _HMG_aFormType [ _HMG_ThisFormIndex ] _HMG_ThisIndex := i _HMG_ThisFormName := _HMG_aFormNames [ _HMG_ThisFormIndex ] _HMG_ThisControlName := "" RETURN NIL в i_this.ch везде проверяется iif ( _HMG_THISType == 'C' , GetControlHandle (...) , GetFormHandle (...) ) и путается с контролом в PROCEDURE _ProcessInitProcedure( i ) ... _HMG_ThisType := 'W' ... надо и в _SetThisFormInfo ( i ) тоже поставить _HMG_ThisType := 'W' [/pre2]

gfilatov2002: SergKis пишет: надо и в _SetThisFormInfo ( i ) тоже поставить _HMG_ThisType := 'W' Благодарю за помощь Вы абсолютно правы! Поправлю ...

Петр: В продолжении поста №1227 демка лежит здесь Не все реализовано до конца (в основном из-за лени :)), но в принципе использовать можно уже сейчас. UPD. Добавлено define TDC_MAINICON 7 TDC_FOOTERICON 20 Исправлено [pre2]radiobuttons.pszButtonText = HB_ARRAYGETSTR( button, 2, &hRadioButton[ iRadioButton++ ], NULL );[/pre2]

gfilatov2002: Петр Благодарю за все Ваши усилия Посмотрю демку вечером ...

gfilatov2002: Сегодня выпущен очередной релиз библиотеки Minigui Ex. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.08-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1608-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1608.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1608_xhb10156.zip Выложил также первую рабочую сборку для BCC 10.1 по адресу: http://hmgextended.com/files/CONTRIB/hmg1608_bcc101.zip Дополнение к файлу changelog текщей сборки: [pre2] * New: Added output of any information to an external file for debugging purposes with extremely easy syntax: ? <explist,...> ?? <explist,...> ?a <arr> ?v <arr> Added the optional command SET LOGFILE TO <filename>. Based upon a contribution of Russian user SergKis (see demo in folder \samples\Basic\OptionBox)[/pre2] Благодарю за Вашу поддержку

Andrey: Что-то две последние ссылки не идут... Page Not Found The page you requested on hmgextended.com was not found. You requested http://hmgextended.com/files/CONTRIB/xhmg1608_xhb10151.zip This request was referred from http://clipper.borda.ru/?1-1-0-00000465-000-0-1-1470645530

gfilatov2002: Andrey пишет: две последние ссылки не идут Поправил ...

SergKis: Подправил \BASIC\GetClientSize\demo.prg на использование This... [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo */ #include "minigui.ch" FUNCTION MAIN LOCAL nCol DEFINE WINDOW FORM_1 ; AT 0,0 WIDTH 350 HEIGHT 235 ; MINWIDTH 350 MINHEIGHT 235 ; TITLE "Get Form Client Height" ; MAIN ; ON INIT Form_Resize() ; ON SIZE Form_Resize() ; ON MAXIMIZE Form_Resize() DEFINE MAIN MENU POPUP "&File" NAME mnuFile MENUITEM "&Exit" NAME mnuFileExit ; ACTION ThisWindow.Release END POPUP END MENU DEFINE STATUSBAR STATUSITEM "Ready" RAISED DATE CLOCK END STATUSBAR @ 05,10 LABEL lblWindow VALUE "WindowHeight = " AUTOSIZE @ 25,10 LABEL lblBorder VALUE "BorderHeight = " AUTOSIZE @ 45,10 LABEL lblTitlebar VALUE "TitleHeight = " AUTOSIZE @ 65,10 LABEL lblMenubar VALUE "MenubarHeight = " AUTOSIZE @ 85,10 LABEL lblStatusbar VALUE "StatusbarHeight = " AUTOSIZE @105,10 LABEL lblClient VALUE "ClientHeight = " AUTOSIZE @125,10 LABEL lblClientW VALUE "ClientWidth = " AUTOSIZE @145,10 LABEL lblWorkArea VALUE "WorkAreaHeight = " AUTOSIZE nCol := This.lblStatusbar.Width + 10 @ 05,nCol LABEL lblWindowHeight VALUE "" WIDTH 70 HEIGHT 16 RIGHTALIGN @ 25,nCol LABEL lblBorderHeight VALUE hb_ntos(GetBorderHeight()) WIDTH 70 RIGHTALIGN @ 45,nCol LABEL lblTitleHeight VALUE hb_ntos(GetTitleHeight()) WIDTH 70 RIGHTALIGN @ 65,nCol LABEL lblMenubarHeight VALUE hb_ntos(GetMenubarHeight()) WIDTH 70 RIGHTALIGN @ 85,nCol LABEL lblStatusbarHeight VALUE hb_ntos(This.StatusBar.Height) WIDTH 70 RIGHTALIGN @105,nCol LABEL lblClientHeight VALUE "" WIDTH 70 RIGHTALIGN @125,nCol LABEL lblClientWidth VALUE "" WIDTH 70 RIGHTALIGN @145,nCol LABEL lblWorkAreaHeight VALUE "" WIDTH 70 HEIGHT 16 RIGHTALIGN @ 0,nCol+100 EDITBOX edx WIDTH 100 HEIGHT 100 //NOHSCROLL END WINDOW CENTER WINDOW FORM_1 ACTIVATE WINDOW FORM_1 RETURN NIL STATIC PROCEDURE Form_Resize() LOCAL nWindowHeight, nClientHeight nWindowHeight := This.Height nClientHeight := nWindowHeight - 2 * GetBorderHeight() nClientHeight -= GetTitleHeight() + GetMenubarHeight() nClientHeight -= This.StatusBar.Height This.lblWindowHeight.Value := hb_ntos(nWindowHeight) This.edx.Height := nClientHeight This.edx.Width := This.Width - This.edx.Col - 2 * GetBorderWidth() This.lblClientHeight.Value := hb_ntos(This.edx.ClientHeight) This.lblClientWidth.Value := hb_ntos(This.edx.ClientWidth) This.lblWorkAreaHeight.Value := hb_ntos(This.ClientHeight - This.StatusBar.Height) RETURN [/pre2]

SergKis: gfilatov2002 ChangeLog.txt * Enhanced: Added a shorten form 'App' for the 'Application' object. Examples: App.ExeName, App.Handle, App.FormName etc. Похоже потерялось в сборке

gfilatov2002: SergKis пишет: потерялось в сборке Не потерялось, посмотри [pre2]//////////////////////////////////////////// // Application pseudo-commands //////////////////////////////////////////// #translate <p:Application,App>.ExeName => GetExeFileName() #translate <p:Application,App>.Handle => _HMG_MainHandle ...[/pre2]

SergKis: gfilatov2002 пишет Не потерялось, посмотри Виноват исправлюсь. Наверно пытался в старом сделать ? _HMG_aFormNames [ _HMG_MainIndex ] ? Application.FormName ? App.FormName

gfilatov2002: SergKis пишет: Подправил \BASIC\GetClientSize\demo.prg Благодарю за упрощение кода этого примера - так лучше

gfilatov2002: Петр пишет: в принципе использовать можно уже сейчас Благодарю за помощь Как первый шаг - весьма неплохо, но за кадром осталось использование CommandLink, RadioButton и ProgressBar в этом диалоге. Если автор не потерял интерес к этому примеру, то ждем продолжения ... Иначе придется допиливать самостоятельно, по мере сил

Петр: gfilatov2002 пишет: за кадром осталось использование CommandLink, RadioButton и ProgressBar в этом диалоге Вроде бы не заказывали такого Callback, ипользование ресурсов, поддержка Unicode и возврат стандартного для TaskDialogIndirect результата.. Вот такой нужен пример (картинка)? В принципе планировал написать несколько другой пример, но можно и такой.

Петр: Добавлена функция-обертка к TaskDialog, простой пример использования, пофиксены найденные ошибки. обновленные исходники

gfilatov2002: Петр пишет: Вот такой нужен пример Да Возможно, потребуется не один, а несколько примеров для демонстрации различных возможностей этой многогранной функции (от простого - к сложному) Петр пишет: Добавлена функция-обертка к TaskDialog, пример использования Премного благодарен, буду вечером разбираться ...

gfilatov2002: Петр, Добавил поддержку вывода стандартных иконок в диалоге (см.ниже) [pre2]/* tdi_test2.prg */ #include "minigui.ch" #include "tdi.ch" PROCEDURE main() LOCAL aConfig := Array( TDC_CONFIG ) LOCAL nButton, nRadioButton LOCAL lVerificationFlagChecked := .F. LOCAL nResult LOCAL aButton := { { IDOK, "Ok!" } } aConfig[ TDC_COMMON_BUTTON_FLAGS ] := hb_bitOr( TDCBF_OK_BUTTON, TDCBF_CANCEL_BUTTON ) //aConfig[ TDC_BUTTON ] := Len( aButton ) //aConfig[ TDC_TASKDIALOG_BUTTON ] := aButton aConfig[ TDC_HWND ] := 0 aConfig[ TDC_HINSTANCE ] := GetInstance() aConfig[ TDC_MAINICON ] := TD_INFORMATION_ICON aConfig[ TDC_WINDOWTITLE ] := "Task Dialog Title" aConfig[ TDC_MAININSTRUCTION ] := "The main instruction text for the TaskDialog goes here." aConfig[ TDC_CONTENT ] := "The content text for the task dialog is shown here and the text will automatically wrap as needed." // aConfig[ TDC_VERIFICATIONTEXT ] := NILL aConfig[ TDC_VERIFICATIONTEXT ] := "Don't show me this message again" aConfig[ TDC_EXPANDEDINFORMATION ] := "Any expanded content text for the task dialog is shown here and the text will automatically wrap as needed." aConfig[ TDC_EXPANDEDCONTROLTEXT ] := "Expanded Control Text" aConfig[ TDC_COLLAPSEDCONTROLTEXT ] := "Collapsed Control Text" aConfig[ TDC_FOOTERICON ] := TD_INFORMATION_ICON aConfig[ TDC_FOOTER ] := "Optional footer text with an icon can be included" aConfig[ TDC_CALLBACK ] := { |h,n,w,l| callback( h,n,w,l ) } nResult := win_TaskDialogIndirect( aConfig, @nButton, @nRadioButton, @lVerificationFlagChecked ) IF nResult == 0 // no error occurs SWITCH nButton CASE IDOK ? "Button OK pressed" EXIT OTHERWISE ? "Button ID is", hb_ntos( nButton ) EXIT END SWITCH ? "Verification Flag is", If( lVerificationFlagChecked, "Checked", "UnChecked" ) ELSE ? "TaskDialogIndirect0() returns", nResult END IF RETURN STATIC FUNCTION callback( hWnd, nNotification, wParam, lParam ) LOCAL lResult := .F. /* To prevent the task dialog from closing, the application must return FALSE, otherwise the task dialog is closed */ SWITCH nNotification CASE TDN_CREATED ? "Notification: TDN_CREATED" EXIT CASE TDN_DESTROYED ? "Notification: TDN_DESTROYED" EXIT CASE TDN_BUTTON_CLICKED // wParam - an int that specifies the ID of the button or comand link that was selected ? "Notification: TDN_BUTTON_CLICKED. ID of the button:", wParam IF wParam == IDOK lResult := .T. ELSEIF wParam == IDCANCEL lResult := .T. ENDIF EXIT CASE TDN_RADIO_BUTTON_CLICKED // wParam - an int that specifies the ID corresponding to the radio button that was clicked ? "Notification: TDN_RADIO_BUTTON_CLICKED. ID of the button:", wParam EXIT CASE TDN_EXPANDO_BUTTON_CLICKED // the user clicks on the dialog's expando button: wParam is 1 if the dialog is expanded, or 0 if not ? "Notification: TDN_EXPANDO_BUTTON_CLICKED. Dialog is", If( wParam == 1, "expanded", "colapsed" ) EXIT CASE TDN_HELP // the user presses F1 on the keyboard while the dialog has focus ? "Notification: TDN_HELP" EXIT CASE TDN_VERIFICATION_CLICKED // the user clicks the task dialog verification check box: wParam is the status of the checkbox. // It is 1 if the verification checkbox is checked, or 0 if it is unchecked. ? "Notification: TDN_VERIFICATION_CLICKED. Verification checkbox is", If( wParam == 1, "checked", "unchecked" ) EXIT CASE TDN_HYPERLINK_CLICKED ? "Notification: TDN_HYPERLINK_CLICKED" ShellExecute( hWnd, "open", lParam, , , SW_SHOW ) END SWITCH RETURN lResult #pragma BEGINDUMP #define _WIN32_WINNT 0x0600 //VISTA #define UNICODE #if( defined( __MINGW32__ )) #define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i)))) #define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i)))) #ifdef UNICODE #define MAKEINTRESOURCE MAKEINTRESOURCEW #else #define MAKEINTRESOURCE MAKEINTRESOURCEA #endif #endif #include <hbwinuni.h> #include <windows.h> #include <commctrl.h> #include "hbapi.h" #include "hbapierr.h" #include "hbapiitm.h" #include "hbvm.h" #define TDC_CONFIG 24 #define TDC_HWND 2 #define TDC_HINSTANCE 3 #define TDC_TASKDIALOG_FLAGS 4 #define TDC_COMMON_BUTTON_FLAGS 5 #define TDC_WINDOWTITLE 6 #define TDC_MAINICON 7 #define TDC_MAININSTRUCTION 8 #define TDC_CONTENT 9 #define TDC_BUTTON 10 #define TDC_TASKDIALOG_BUTTON 11 #define TDC_DEFAULTBUTTON 12 #define TDC_RADIOBUTTON 13 #define TDC_TASKDIALOG_RADIOBUTTON 14 #define TDC_DEFAULTRADIOBUTTON 15 #define TDC_VERIFICATIONTEXT 16 #define TDC_EXPANDEDINFORMATION 17 #define TDC_EXPANDEDCONTROLTEXT 18 #define TDC_COLLAPSEDCONTROLTEXT 19 #define TDC_FOOTERICON 20 #define TDC_FOOTER 21 #define TDC_CALLBACK 22 #define TDC_WIDTH 24 static HB_BOOL checkButton( const PHB_ITEM arrayOfButtons, HB_SIZE arraysize ); HRESULT CALLBACK TDCallbackProc( HWND hWnd, UINT uNotification, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData ); HB_FUNC( WIN_TASKDIALOGINDIRECT ) { PHB_ITEM pConfig = hb_param( 1, HB_IT_ARRAY ); if ( pConfig && hb_arrayLen( pConfig ) >= TDC_CONFIG ) { TASKDIALOGCONFIG config = {0}; int nButton; int nRadioButton; BOOL fVerificationFlagChecked; HRESULT hResult; HB_TYPE typ; void ** hText = ( void ** ) hb_xgrab( sizeof( void * ) * 10 ); int iText = 0; TASKDIALOG_BUTTON * buttons = NULL; void ** hButton; int iButton = 0; TASKDIALOG_BUTTON * radiobuttons = NULL; void ** hRadioButton; int iRadioButton = 0; PHB_ITEM pCallbackData; // 1 UINT cbSize config.cbSize = sizeof( config ); // 2 HWND hwndParent if ( hb_arrayGetType( pConfig, TDC_HWND ) & HB_IT_NUMERIC ) { config.hwndParent = ( HWND ) hb_arrayGetNL( pConfig, TDC_HWND ); } else { config.hwndParent = NULL; } // 3 HINSTANCE hInstance config.hInstance = ( HINSTANCE ) hb_arrayGetNL( pConfig, TDC_HINSTANCE ); // 4 TASKDIALOG_FLAGS dwFlags if ( hb_arrayGetType( pConfig, TDC_TASKDIALOG_FLAGS ) & HB_IT_NUMERIC ) { config.dwCommonButtons = hb_arrayGetNInt( pConfig, TDC_TASKDIALOG_FLAGS ); } // 5 TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons if ( hb_arrayGetType( pConfig, TDC_COMMON_BUTTON_FLAGS ) & HB_IT_NUMERIC ) { config.dwCommonButtons = hb_arrayGetNInt( pConfig, TDC_COMMON_BUTTON_FLAGS ); } // 6 PCWSTR pszWindowTitle typ = hb_arrayGetType( pConfig, TDC_WINDOWTITLE ); if ( typ & HB_IT_STRING ) { config.pszWindowTitle = HB_PARASTRDEF( 1, TDC_WINDOWTITLE, &hText[iText++], NULL ); } else if ( typ & HB_IT_NUMERIC ) { config.pszWindowTitle = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_WINDOWTITLE ) ); } else { config.pszWindowTitle = NULL; } // 7 union { HICON hMainIcon; PCWSTR pszMainIcon; }; if ( hb_arrayGetType( pConfig, TDC_MAINICON ) & HB_IT_NUMERIC ) { config.pszMainIcon = ( PCWSTR ) hb_arrayGetNL( pConfig, TDC_MAINICON ); } else { config.pszMainIcon = NULL; } // 8 PCWSTR pszMainInstruction typ = hb_arrayGetType( pConfig, TDC_MAININSTRUCTION ); if ( typ & HB_IT_STRING ) { config.pszMainInstruction = HB_PARASTRDEF( 1, TDC_MAININSTRUCTION, &hText[iText++], NULL ); } else if (typ & HB_IT_NUMERIC ) { config.pszMainInstruction = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_MAININSTRUCTION ) ); } // 9 PCWSTR pszContent; typ = hb_arrayGetType( pConfig, TDC_CONTENT ); if ( typ & HB_IT_STRING ) { config.pszContent = HB_PARASTRDEF( 1, TDC_CONTENT, &hText[iText++], NULL ); } else if (typ & HB_IT_NUMERIC ) { config.pszContent = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_CONTENT ) ); } // 10 UINT cButtons config.cButtons = ( hb_arrayGetType( pConfig, TDC_BUTTON ) & HB_IT_NUMERIC ) ? hb_arrayGetNI( pConfig, TDC_BUTTON ) : 0; // 11 const TASKDIALOG_BUTTON *pButtons typ = hb_arrayGetType( pConfig, TDC_TASKDIALOG_BUTTON ); if ( typ & HB_IT_ARRAY ) { PHB_ITEM pButtons = hb_arrayGetItemPtr( pConfig, TDC_TASKDIALOG_BUTTON ); HB_SIZE arrsize; arrsize = hb_arrayLen( pButtons ); if ( ( arrsize > 0 ) && checkButton( pButtons, arrsize ) ) { HB_SIZE i; buttons = ( TASKDIALOG_BUTTON * ) hb_xgrab( sizeof( TASKDIALOG_BUTTON ) * arrsize ); memset( buttons, 0, sizeof( TASKDIALOG_BUTTON ) * arrsize ); hButton = ( void ** ) hb_xgrab( sizeof( void * ) * ( arrsize ) ); for ( i = 0; i < arrsize; ++i ) { PHB_ITEM button = hb_arrayGetItemPtr( pButtons, i + 1 ); buttons.nButtonID = hb_arrayGetNI( button, 1 ); if ( ( hb_arrayGetType( button, 2 ) & HB_IT_STRING ) != 0 ) { buttons.pszButtonText = HB_ARRAYGETSTR( button, 2, &hButton[ iButton++ ], NULL ); } else { buttons.pszButtonText = MAKEINTRESOURCE( hb_arrayGetNI( button, 2 ) ); } } config.cButtons = HB_MIN( config.cButtons, arrsize ); config.pButtons = buttons; } } // 12 int nDefaultButton config.nDefaultButton = ( hb_arrayGetType( pConfig, TDC_DEFAULTBUTTON ) & HB_IT_NUMERIC ) ? hb_arrayGetNI( pConfig, TDC_DEFAULTBUTTON ) : 0; // 13 UINT cRadioButtons config.cRadioButtons = ( hb_arrayGetType( pConfig, TDC_RADIOBUTTON ) & HB_IT_NUMERIC ) ? hb_arrayGetNI( pConfig, TDC_RADIOBUTTON ) : 0; // 14 const TASKDIALOG_BUTTON *pRadioButtons typ = hb_arrayGetType( pConfig, TDC_TASKDIALOG_RADIOBUTTON ); if ( typ & HB_IT_ARRAY ) { PHB_ITEM pButtons = hb_arrayGetItemPtr( pConfig, TDC_TASKDIALOG_RADIOBUTTON ); HB_SIZE arrsize; arrsize = hb_arrayLen( pButtons ); if ( ( arrsize > 0 ) && checkButton( pButtons, arrsize ) ) { HB_SIZE i; radiobuttons = ( TASKDIALOG_BUTTON * ) hb_xgrab( sizeof( TASKDIALOG_BUTTON ) * arrsize ); memset( radiobuttons, 0, sizeof( TASKDIALOG_BUTTON ) * arrsize ); hRadioButton = ( void ** ) hb_xgrab( sizeof( void * ) * ( arrsize ) ); for ( i = 0; i < arrsize; ++i ) { PHB_ITEM button = hb_arrayGetItemPtr( pButtons, i + 1 ); radiobuttons.nButtonID = hb_arrayGetNI( button, 1 ); if ( ( hb_arrayGetType( button, 2 ) & HB_IT_STRING ) != 0 ) { radiobuttons.pszButtonText = HB_ARRAYGETSTR( button, 2, &hRadioButton[ iRadioButton++ ], NULL ); } else { radiobuttons.pszButtonText = MAKEINTRESOURCE( hb_arrayGetNI( button, 2 ) ); } } config.cRadioButtons = HB_MIN( config.cRadioButtons, arrsize ); config.pRadioButtons = radiobuttons; } } // 15 int nDefaultRadioButton config.nDefaultRadioButton = ( hb_arrayGetType( pConfig, TDC_DEFAULTRADIOBUTTON ) & HB_IT_NUMERIC ) ? hb_arrayGetNI( pConfig, TDC_DEFAULTRADIOBUTTON ) : 0; // 16 PCWSTR pszVerificationText typ = hb_arrayGetType( pConfig, TDC_VERIFICATIONTEXT ); if ( typ & HB_IT_STRING ) { config.pszVerificationText = HB_PARASTRDEF( 1, TDC_VERIFICATIONTEXT, &hText[iText++], NULL ); } else if (typ & HB_IT_NUMERIC ) { config.pszVerificationText = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_VERIFICATIONTEXT ) ); } else { config.pszVerificationText = NULL; } // 17 PCWSTR pszExpandedInformation typ = hb_arrayGetType( pConfig, TDC_EXPANDEDINFORMATION ); if ( typ & HB_IT_STRING ) { config.pszExpandedInformation = HB_PARASTRDEF( 1, TDC_EXPANDEDINFORMATION, &hText[iText++], NULL ); } else if (typ & HB_IT_NUMERIC ) { config.pszExpandedInformation = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_EXPANDEDINFORMATION ) ); } // 18 PCWSTR pszExpandedControlText typ = hb_arrayGetType( pConfig, TDC_EXPANDEDCONTROLTEXT ); if ( typ & HB_IT_STRING ) { config.pszExpandedControlText = HB_PARASTRDEF( 1, TDC_EXPANDEDCONTROLTEXT, &hText[iText++], NULL ); } else if (typ & HB_IT_NUMERIC ) { config.pszExpandedControlText = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_EXPANDEDCONTROLTEXT ) ); } // 19 PCWSTR pszCollapsedControlText typ = hb_arrayGetType( pConfig, TDC_COLLAPSEDCONTROLTEXT ); if ( typ & HB_IT_STRING ) { config.pszCollapsedControlText = HB_PARASTRDEF( 1, TDC_COLLAPSEDCONTROLTEXT, &hText[iText++], NULL ); } else if (typ & HB_IT_NUMERIC ) { config.pszCollapsedControlText = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_COLLAPSEDCONTROLTEXT ) ); } // 20 union { HICON hFooterIcon; PCWSTR pszFooterIcon; } if ( hb_arrayGetType( pConfig, TDC_FOOTERICON ) & HB_IT_NUMERIC ) { config.pszFooterIcon = ( PCWSTR ) hb_arrayGetNL( pConfig, TDC_FOOTERICON ); } else { config.pszFooterIcon = NULL; } // 21 PCWSTR pszFooter; typ = hb_arrayGetType( pConfig, TDC_FOOTER ); if ( typ & HB_IT_STRING ) { config.pszFooter = HB_PARASTRDEF( 1, TDC_FOOTER, &hText[iText++], NULL ); } else if (typ & HB_IT_NUMERIC ) { config.pszFooter = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_FOOTER ) ); } // 22 PFTASKDIALOGCALLBACK pfCallback; // 23 LONG_PTR lpCallbackData; if ( hb_arrayGetType( pConfig, TDC_CALLBACK ) & HB_IT_EVALITEM ) { pCallbackData = hb_itemNew( hb_arrayGetItemPtr( pConfig, TDC_CALLBACK ) ); hb_gcUnlock( pCallbackData ); config.lpCallbackData = ( LONG_PTR ) pCallbackData; config.pfCallback = TDCallbackProc; } // 24 UINT cxWidth; config.cxWidth = ( hb_arrayGetType( pConfig, TDC_WIDTH ) & HB_IT_NUMERIC ) ? hb_arrayGetNI( pConfig, TDC_WIDTH ) : 0; hResult = TaskDialogIndirect( &config, &nButton, &nRadioButton, &fVerificationFlagChecked ); while( --iText >= 0 ) hb_strfree( hText[ iText ] ); hb_xfree( hText ); while( --iButton >= 0 ) hb_strfree( hButton[ iButton ] ); if ( hButton ) hb_xfree( hButton ); while( --iRadioButton >= 0 ) hb_strfree( hRadioButton[ iRadioButton ] ); if ( hRadioButton ) hb_xfree( hRadioButton ); if ( hb_arrayGetType( pConfig, TDC_CALLBACK ) & HB_IT_EVALITEM ) { hb_itemRelease( ( PHB_ITEM ) config.lpCallbackData ); } if ( hResult == S_OK ) { if ( nButton ) { hb_storni( nButton, 2 ); } else { hb_stor( 2 ); } if ( nRadioButton ) { hb_storni( nRadioButton, 3 ); } else { hb_stor( 3 ); } hb_storl( fVerificationFlagChecked, 4 ); } else { hb_stor( 2 ); hb_stor( 3 ); hb_stor( 4 ); } hb_retnint( hResult ); } else { hb_errRT_BASE_SubstR( EG_ARG, 0, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } } static HB_BOOL checkButton( const PHB_ITEM arrayOfButtons, HB_SIZE arraysize ) { PHB_ITEM button; HB_SIZE i; for ( i = 1; i <= arraysize; ++i ) { button = hb_arrayGetItemPtr( arrayOfButtons, i ); if( HB_IS_ARRAY( button ) && hb_arrayLen( button ) > 1 ) { if ( ! ( ( ( hb_arrayGetType( button, 1 ) & HB_IT_NUMERIC ) != 0 ) && ( ( hb_arrayGetType( button, 2 ) & ( HB_IT_STRING | HB_IT_NUMERIC ) ) !=0 ) ) ) { return HB_FALSE; } } else { return HB_FALSE; } } return HB_TRUE; } HRESULT CALLBACK TDCallbackProc( HWND hWnd, UINT uNotification, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData ) { HRESULT hRes; PHB_ITEM pCallback = ( PHB_ITEM ) dwRefData; if( pCallback && hb_vmRequestReenter() ) { hb_vmPushEvalSym(); hb_vmPush( pCallback ); hb_vmPushNumInt( ( HB_MAXINT ) ( HB_PTRUINT ) hWnd ); hb_vmPushNumInt( ( HB_MAXINT ) uNotification ); hb_vmPushNumInt( wParam ); hb_vmPushNumInt( lParam ); hb_vmSend( 4 ); hRes = ( ( hb_parl( -1 ) == HB_TRUE ) ? S_OK : S_FALSE ); hb_vmRequestRestore(); return hRes; } return S_OK; } #pragma ENDDUMP[/pre2] Возникли следующие вопросы: 1) как сделать в этом диалоге вывод картинок из внешнего файла (использовать MAKEINTRESOURCE ); 2) как правильно сделать неявный вызов функции TaskDialogIndirect() из comctl32.dll (с использованием LoadLibrary() / GetProcAddress()) Это требуется для вызова этой функции под BCC 5.5: [pre2] #if ( defined( __BORLANDC__ ) && __BORLANDC__ <= 1410 ) #include "tdi.h" // <-- здесь определения для структур TaskDialogIndirect #endif [/pre2] P.S. Благодарю за реализацию на Си функции TaskDialog() - пригодится

Петр: gfilatov2002 пишет: Добавил поддержку вывода стандартных иконок в диалоге (см.ниже) gfilatov2002 пишет: // 7 union { HICON hMainIcon; PCWSTR pszMainIcon; }; if ( hb_arrayGetType( pConfig, TDC_MAINICON ) & HB_IT_NUMERIC ) { config.pszMainIcon = ( PCWSTR ) hb_arrayGetNL( pConfig, TDC_MAINICON ); } else { config.pszMainIcon = NULL; } Что-то здесь не так. при присвоении значения MainIcon мы можем использовать строку - имя ресурса, ID - числовой идентификатор ресурса, хендл HICON при этом в первых двух случаях используется pszMainIcon, а в последнем hMainIcon. [pre] typ = hb_arrayGetType( pConfig, TDC_MAINICON ); if ( typ & HB_IT_STRING ) { config.pszMainIcon = HB_PARASTRDEF( 1, TDC_MAINICON, &hText[iText++], NULL ) } else if (typ & HB_IT_NUMERIC ) { config.pszMainIcon = MAKEINTRESOURCE( hb_arrayGetNI( pConfig, TDC_MAINICON ) ); } else if (typ & HB_IT_POINTER ) { config.hMainIcon = (HICON) ( hb_arrayGetPtr( pConfig, TDC_MAINICON ) ); } else { config.pszMainIcon = NULL; }[/pre] Поскольку в Minigui есть своя, скажем так, специфика в интерпретации указателей, я осознанно (не только из-за лени ) упустил присвоение значения нескольким членам структуры TASKDIALOGCONFIG.

gfilatov2002: Петр пишет: при присвоении значения MainIcon мы можем использовать Благодарю за помощь - работает

Петр: gfilatov2002 пишет: как сделать в этом диалоге вывод картинок из внешнего файла Что значит внешний файл. TaskDialogIndirect ориентирован в первую очередь на использование ресурсов (строк и иконок). При этом ресурсы могут находиться как в собственно исполняемом файле config.hInstance = NULL или GetModuleHandle(NULL), так и в других файлах (например динамической библиотеке dll или другом исполняемом файле exe). О hMainIcon уже писал, т.е иконку можно загрузить из файла, сгенерировать на лету или сконвертировать из другого формата с помощью gdi+ или других библиотек для обработки изображений.

Петр: gfilatov2002 пишет: Благодарю за помощь - работает Все это, я думаю вы уже поняли, относится и к FooterIcon.

gfilatov2002: Петр пишет: в других файлах (например динамической библиотеке dll Имел в ввиду этот случай - конкретно, системные dll

gfilatov2002: Петр пишет: Все это, я думаю вы уже поняли, относится и к FooterIcon Да, понял Благодарю за разъяснение Увы, но работа этих диалоговых функций под bcc 5.5 приводит к вылету программы (не судьба, видимо, использовать со старым компилятором )

gfilatov2002: Петр, Обратил внимание, что параметр lParam в callback-функции при использовании флажка TDF_ENABLE_HYPERLINKS должен быть строкового типа (и содержать адрес URL), а не число, как сейчас Возможно ли это поправить

Петр: gfilatov2002 пишет: Возможно ли это поправить Попробуйте это (нет возможности проверить самому) [pre2]HRESULT CALLBACK TDCallbackProc( HWND hWnd, UINT uNotification, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData ) { HRESULT hRes; PHB_ITEM pCallback = ( PHB_ITEM ) dwRefData; if( pCallback && hb_vmRequestReenter() ) { PHB_ITEM itm = hb_itemNew( NULL ); hb_vmPushEvalSym(); hb_vmPush( pCallback ); hb_vmPushNumInt( ( HB_MAXINT ) ( HB_PTRUINT ) hWnd ); hb_vmPushNumInt( ( HB_MAXINT ) uNotification ); hb_vmPushNumInt( wParam ); if ( uNotification == TDN_HYPERLINK_CLICKED) { HB_ITEMPUTSTR( itm, (HB_WCHAR *) lParam ); hb_vmPushItemRef( itm ); } else { hb_vmPushNumInt( lParam ); } hb_vmSend( 4 ); hRes = ( ( hb_parl( -1 ) == HB_TRUE ) ? S_OK : S_FALSE ); hb_itemRelease( itm ); hb_vmRequestRestore(); return hRes; } return S_OK; }[/pre2]

gfilatov2002: Петр пишет: Попробуйте это Проверю сегодня вечером ... Судя по коду - должно работать Благодарю за помощь

Softlog86: Вопрос вроде как уже поднимался ..... не нашел в темах . Извините если что Имеем - стандартное окно . В нем организовано еще одно типа PANEL с VIRTUAL HEIGHT - оно со скроллингом разумеется . в это окно (назовем его VIRTUAL_W ) - имеется некоторое количество контролов , лабелов и т д . 1 проблема >> после заполнения всех контролов - пока не сдвинешь в этом окне (стрелками или скролбаром) - некоторые элементы отображаются неверно Например LABEL - задан один цвет - а при первичной прорисовке он вовсе не такой . Нужно это окно сдвинуть вверх-вниз . тогда цвет уже такой как задавал Пытаюсь передать в это окно команду PageUp - чтоб имитировать нажатие форма всё-равно не прорисовывается правильно ....: hwnd:=ASCAN(_HMG_aFormNames,'HC_VIRT') IF hwnd >0 SendMessage ( hwnd, WM_VSCROLL, SB_PAGEUP, 0 ) ENDIF 2 Проблема - в окне есть элемент DRAW GRADIENT или DRAW LINE при каких то изменениях в этом окне - например передвижение или изменение LABEL VALUE и т д , этот самый DRAW LINE /GRADIENT не перерисовывается . Причем не всегда - то нормально - то с запаздыванием от от пары секунд до десятка . Иногда вообще не перерисовывается . прилагаю скрин

gfilatov2002: Softlog86 пишет: организовано еще одно типа PANEL с VIRTUAL HEIGHT Окна типа PANEL появились в Минигуи сравнительно недавно и поэтому недоработки здесь вполне вероятны (по причине малого использования). Softlog86 пишет: не перерисовывается Обычно в таком случае помогает вызов следующей функции при инициализации окна [pre2]InvalidateRect( GetFormHandle( <имя формы> ), 0 )[/pre2] Возможно также добавить этот вызов и по мере использования окна для принудительной перерисовки элементов

Softlog86: У меня в этом окне еще контрол GRID . Как только он получает фокус - всё , колесо прокрутки мыши не скроллирует в этом окне . Как сделать чтоб скроллинг работал всегда если мыша в этом окне (крутит колёсико прокрутки) ? Разумеется - если фокус в гриде - чтоб работал скрол внутри таблицы . То есть принудительно давать фокус на всё окно - если колёсико крутанули внутри указанного окна (но не в гриде) - это тоже позволяет правильно использовать Mouse Wheel Замечено вот еще что : Когда колёсико мышки крутим чтоб покрутить вниз - всё работает замечательно а вот вверх - уже с заминками - "два шага вверх - один вниз" - дёргается . хорошо работает если крутить медленно . Это касается скролла в окнах типа PANEL

Dima: Softlog86 пишет: Это касается скролла в окнах типа PANEL Похоже в них еще пилить и пилить что бы нормально работали

gfilatov2002: Softlog86 пишет: Как только он получает фокус Указать класс NOTABSTOP при определении этого грида пробовали

gfilatov2002: Петр пишет: Попробуйте это Проверил - работает

Softlog86: gfilatov2002 пробовал . Всё равно . видимо придётся переопределять колесо прокрутки на скролл всего окна , даже если активен GRID . Там хватит и обычного Up/DN + скролбар . Мне важнее чтоб всё окно крутилось вверх-вниз . Только не знаю пока как это преопределение сделать ....

Петр: Петр пишет: Добавлена функция-обертка к TaskDialog, простой пример использования, пофиксены найденные ошибки. обновленные исходники Очередные мелкие исправления, TaskDlgs.ch дополнен TDF_ Task Dialog Flags, добавлен еще один пример использования (радиокнопки, командные ссылки и пр.), добавлен простой класс CLASS TTaskDialog FUNCTION TaskDialog, который, надеюсь, со временем будет расширен, и пример его использования. качать отсюда

gfilatov2002: Петр пишет: добавлен простой класс CLASS TTaskDialog То, что надо Вечером посмотрю Благодарю за все Ваши усилия

gfilatov2002: Петр пишет: класс CLASS TTaskDialog FUNCTION TaskDialog, который, надеюсь, со временем будет расширен Да, этот класс - это пока только шаблон, но пользоваться им удобнее, чем просто вызывать функцию с параметрами ИМХО З.Ы. Всем - пока, уезжаю в отпуск

Петр: gfilatov2002 пишет: Всем - пока, уезжаю в отпуск Желаю хорошо отдохнуть! А класс уже вполне рабочий

Andrey: Пример - \MiniGUI\SAMPLES\BASIC\CURSOR - опечатка ! Не собирается, ошибка: Compiling 'demo.prg'... demo.prg(237) Error E0030 Syntax error "syntax error at 'Col'" 1 error No code generated. Compile error. Там в 237 строке надо поставить знак "," в GetProperty( Form, obj "Col" )

Dima: Andrey пишет: Пример - \MiniGUI\SAMPLES\BASIC\CURSOR - опечатка Ни чего не спутал ? там строк меньше чем 237 и GetProperty там нет совсем.

Петр: Andrey пишет: Там в 237 строке надо поставить знак "," в GetProperty( Form, obj "Col" ) Подтверждаю

Dima: Петр пишет: Подтверждаю Стрянно У меня HMG Extended Edition version 16.07 и в этом примере такого нет да и строк менее 237 Пример датируется 2011 годом от 18 июля В чем прикол ?

SergKis: Dima 2016/08/08: HMG Extended Edition version 16.08. line 237 ocol := GetProperty( Form, "col" ) + GetProperty( Form, obj "Col" ) + rect [1] 2016/07/14: HMG Extended Edition version 16.07. действительно нет такой строки, как впрочем и в предыдущей

Dima: SergKis Точно , пропустил я эту сборку (16.08) ...

gfilatov2002: Для тех, кому это интеоесно. Выпустил сегодня 3-ю бету для новой сборки библиотеки. Полный список изменений см. ниже [pre2] * New: The Task Dialog support is based upon the Vista's TaskDialog API: - win_TaskDialog0( ,, cWindowTitle, cMainMessage, cContent, ; dwCommonButtons, nIcon, @nButton ) -> nResult - win_TaskDialogIndirect0( aConfig, @nButton, @nRadioButton, ; @lVerificationFlagChecked ) -> nResult - simple CLASS TTaskDialog FUNCTION TaskDialog. Usage: WITH OBJECT TaskDialog() :Title := 'Simple TaskDialog' :Instruction := 'My Main Text here' :Content := 'A simple text only function TaskDialog()' IF :Execute() == 0 MsgInfo( :ButtonResult ) ENDIF ENDWITH It is MinGW-based and BCC 10.1-based possibility only. Note: This feature works properly at Windows Vista or later only. Contributed by Petr Chornyj <myorg63@mail.ru> (see demos in folder \samples\TaskDialogs) (see demo in folder \samples\Basic\TTaskDialog) * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.14.1. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2016-08-10 20:12): * Updated: HbSqlDD library source code (see in folder \Source\HbSqlDD) Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'MultiThread usage in HMG' sample. Based upon a contribution of Roberto Lopez <mail.box.hmg@gmail.com>. Enhanced by Pete D. <pete_westg/at/yahoo.gr> (see in folder \samples\Basic\MultiThread) * New: 'Enhanced CLASS TTaskDialogEx FUNCTION TaskDialogEx' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\TaskDialogs\TaskDialogEx) * New: 'Quick Message functions are based on TaskDialog API' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\TaskDialogs\demo3) (see in folder \samples\Basic\TaskDialogs) * New: 'Directory Watcher' sample is based on 'Change Notification' WinAPI. Based upon a contribution of Petr Chornyj <myorg63@mail.ru>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\DirWatcher) * Updated: 'Get Form Client Height' sample. Based upon a contribution of Russian user SergKis (see in folder \samples\Basic\GetClientSize) * Updated: The following samples are revised for compatibility with the latest Harbour changes: - \Utils\SqlDBU; - \samples\Basic\Charts_2; - \samples\Advanced\MSSQL; - \samples\Advanced\MySqlDD; - \samples\Advanced\OdbcDD; - \samples\Advanced\Sqlit3DD; - \samples\Advanced\Tsb_sqlite. Contributed by Grigory Filatov <gfilatov@inbox.ru> [/pre2] Особая благодарность - Петру за оказанную помощь

Andrey: gfilatov2002 пишет: Выпустил сегодня 3-ю бету для новой сборки библиотеки. А можно обновить MiniGUI\SOURCE\HbPgSql ?

gfilatov2002: Andrey пишет: А можно обновить MiniGUI\SOURCE\HbPgSql ? Не вопрос, присылайте, что нужно обновить...

Andrey: Сейчас там PostgreSQL version 8.4 А уже 9.5 версия есть. https://postgrespro.ru/ Как и что обновлять не знаю... Может в Харборе взять новее библиотеки - hbpgsql ?

Петр: gfilatov2002 пишет: Особая благодарность - Петру за оказанную помощь Да не за что. А где бету можна скачать? Может к релизу что-то и дополнить можно было бы.

gfilatov2002: Петр пишет: где бету можна скачать? Отправил ссылку на бету по почте Да, до релиза еще далековато, поэтому с удовольствием рассмотрю Ваши дополнения

Петр: gfilatov2002 пишет: Отправил ссылку на бету по почте Спасибо. А где можно посмотреть * New: 'Enhanced CLASS TTaskDialogEx FUNCTION TaskDialogEx' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\TaskDialogs\TaskDialogEx)

gfilatov2002: Петр пишет: А где можно посмотреть Здесь [pre2] /* TTaskDialogEx.prg - Using of the inheritance for class function TaskDialog() */ #include "minigui.ch" #include "hbclass.ch" #include "TaskDlgs.ch" CREATE CLASS TTaskDialogEx FUNCTION TaskDialogEx FROM TaskDialog EXPORTED: METHOD Flags( nFlags ) SETGET // 4 METHOD MainIcon( nIcon ) SETGET // 7 METHOD CustomButtons( aCustButton ) SETGET // 11 METHOD VerificationText( cText ) SETGET // 16 METHOD ExpandedInfo( cText ) SETGET // 17 METHOD ExpandedCtrlText( cText ) SETGET // 18 METHOD CollapsedCtrlText( cText ) SETGET // 19 METHOD FooterIcon( nIcon ) SETGET // 20 METHOD CallbackFunc( bFunc ) SETGET // 22 ENDCLASS /* */ METHOD Flags( nFlags ) CLASS TTaskDialogEx IF HB_ISNUMERIC( nFlags ) ::aConfig[ TDC_TASKDIALOG_FLAGS ] := nFlags ENDIF RETURN ::aConfig[ TDC_TASKDIALOG_FLAGS ] /* */ METHOD MainIcon( nIcon ) CLASS TTaskDialogEx IF HB_ISNUMERIC( nIcon ) ::aConfig[ TDC_MAINICON ] := nIcon ENDIF RETURN ::aConfig[ TDC_MAINICON ] /* */ METHOD FooterIcon( nIcon ) CLASS TTaskDialogEx IF HB_ISNUMERIC( nIcon ) ::aConfig[ TDC_FOOTERICON ] := nIcon ENDIF RETURN ::aConfig[ TDC_FOOTERICON ] /* */ METHOD VerificationText( cText ) CLASS TTaskDialogEx IF HB_ISSTRING( cText ) .OR. HB_ISNUMERIC( cText ) ::aConfig[ TDC_VERIFICATIONTEXT ] := cText ENDIF RETURN ::aConfig[ TDC_VERIFICATIONTEXT ] /* */ METHOD ExpandedInfo( cText ) CLASS TTaskDialogEx IF HB_ISSTRING( cText ) .OR. HB_ISNUMERIC( cText ) ::aConfig[ TDC_EXPANDEDINFORMATION ] := cText ENDIF RETURN ::aConfig[ TDC_EXPANDEDINFORMATION ] /* */ METHOD ExpandedCtrlText( cText ) CLASS TTaskDialogEx IF HB_ISSTRING( cText ) .OR. HB_ISNUMERIC( cText ) ::aConfig[ TDC_EXPANDEDCONTROLTEXT ] := cText ENDIF RETURN ::aConfig[ TDC_EXPANDEDCONTROLTEXT ] /* */ METHOD CollapsedCtrlText( cText ) CLASS TTaskDialogEx IF HB_ISSTRING( cText ) .OR. HB_ISNUMERIC( cText ) ::aConfig[ TDC_COLLAPSEDCONTROLTEXT ] := cText ENDIF RETURN ::aConfig[ TDC_COLLAPSEDCONTROLTEXT ] /* */ METHOD CustomButtons( aCustButton ) CLASS TTaskDialogEx IF HB_ISARRAY( aCustButton ) .AND. Len( aCustButton ) > 0 ::aConfig[ TDC_BUTTON ] := Len( aCustButton ) ::aConfig[ TDC_TASKDIALOG_BUTTON ] := aCustButton ENDIF RETURN ::aConfig[ TDC_TASKDIALOG_BUTTON ] /* */ METHOD CallbackFunc( bFunc ) CLASS TTaskDialogEx IF HB_ISBLOCK( bFunc ) ::aConfig[ TDC_CALLBACK ] := bFunc ENDIF RETURN ::aConfig[ TDC_CALLBACK ] /* */ PROCEDURE main() LOCAL nResult SET LOGFILE TO "_debug.txt" WITH OBJECT TaskDialogEx() :Title := 'TaskDialog with expandable text & footer with hyperlink' :Instruction := 'What do you think about of the Windows Vista TaskDialog?' :Content := 'The new TaskDialog provides a standard & enhanced way for interacting with the user' :Footer := "Optional footer text with an icon can be included" :MainIcon := TD_QUESTION :FooterIcon := TD_WARNING_ICON :ExpandedInfo := "Any expanded content text for the task dialog is shown " + ; "here and the text will automatically wrap as needed." :CollapsedCtrlText := "Click to see more" :ExpandedCtrlText := "Hide Expanded Text" :CallbackFunc := {|h,n,w,l| callback( h,n,w,l )} nResult := :Execute() IF nResult == 0 ? "Button ID is", :ButtonResult ENDIF ENDWITH RETURN STATIC FUNCTION callback( hWnd, nNotification, wParam, lParam ) LOCAL lResult := .F. /* To prevent the task dialog from closing, the application must return FALSE, otherwise the task dialog is closed */ LOCAL hResp := { 1=>"OK", 2=>"CANCEL", 3=>"ABORT", 4=>"RETRY", 5=>"IGNORE", 6=>"YES", 7=>"NO", 8=>"CLOSE" } SWITCH nNotification CASE TDN_BUTTON_CLICKED // wParam - an int that specifies the ID of the button or comand link that was selected IF hb_HPos( hResp, wParam ) != 0 IF wParam == IDOK ? "Button OK was pressed" ENDIF lResult := .T. ENDIF EXIT CASE TDN_HYPERLINK_CLICKED ShellExecute( hWnd, "open", lParam, , , SW_SHOW ) END SWITCH RETURN lResult[/pre2]

Петр: Andrey пишет: А можно обновить MiniGUI\SOURCE\HbPgSql ? Наверное для Андрея обновление уже не актуально Andrey пишет: Может в Харборе взять новее библиотеки - hbpgsql ? Функционально версии hbpgsql в MiniGUI и Harbour (https://github.com/harbour/core/) не отличаются. Более того, hbpgsql от MiniGUI есть старой версией harbour hbpgsql. Не учтены сл. важные поправки 2014-03-27 16:13 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/hbpgsql/rddcopy.c ! fixed typos in my recent modification and potential memory corruption and/or wrong output due to ugly hack for last field terminator in old code. Thanks to Aleksander Czajczynski for reporting the problem. К тому же rddcopy.c является юниксовым файлом (перевод строки LF вместо CRLF), что выглядит странно для MiniGUI 2011-10-20 15:21 UTC+0200 Viktor Szakats (vszakats.net/harbour) * contrib/hbpgsql/hbpgsql.hbx * contrib/hbpgsql/hbpgsql.hbp - contrib/hbpgsql/hdbcpg.prg - Deleted HDBC class layer due references to deprecated wrapper function which caused link errors in dynamic builds or HDBC apps. Please readd the file if interested in making this technially simple fix. Поэтому с чистой совестью можете копировать файлы из harbour\contrib\hbpgsql и пересобирать библиотеку, как я уже говорил, новой функциональности вы не получите. Работать должно стабильнее. Изменения в копирайтах и т.п. не в счет.

Петр: Вот hbpgsql с harbour-core (https://github.com/vszakats/harbour-core) выглядит сейчас более интересно, в основном за счет изменений в tpostgre.prg В часности, расширен METHOD New( cHost, cDatabase, cUser, cPass, nPort, cSchema, hCustom ) :New( ..., { 'timeout' => '10' } )

Andrey: Григорий, а нельзя ли прикрутить показ иконок (ICO) для объекта MENUITEM ? SET MENUSTYLE EXTENDED SetMenuBitmapHeight( 48 ) DEFINE CONTEXT MENU OF &cForm MENUITEM "Меню..." ACTION .. IMAGE "W_add32х32"

gfilatov2002: Andrey пишет: нельзя ли прикрутить показ иконок (ICO) для объекта MENUITEM Да, это возможно при добавлении в Ваш проект следующих 2-х функций [pre2]extern HBITMAP Icon2Bmp( HICON hIcon ); HB_FUNC( MENUITEM_SETICON ) { HBITMAP himage1; HICON hIcon; hIcon = ( HICON ) LoadImage( GetModuleHandle( NULL ), hb_parc( 3 ), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR ); if( hIcon == NULL ) hIcon = ( HICON ) LoadImage( 0, hb_parc( 3 ), IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_DEFAULTCOLOR ); // convert icon to bitmap himage1 = Icon2Bmp( hIcon ); if( newStyle ) { MENUITEMINFO MenuItemInfo; MYMENUITEM * pmyMenuItem; MenuItemInfo.cbSize = sizeof( MENUITEMINFO ); MenuItemInfo.fMask = MIIM_DATA; if( GetMenuItemInfo( ( HMENU ) HB_PARNL( 1 ), hb_parni( 2 ), FALSE, &MenuItemInfo ) ) { pmyMenuItem = ( MYMENUITEM * ) MenuItemInfo.dwItemData; if( pmyMenuItem->hBitmap != NULL ) DeleteObject( pmyMenuItem->hBitmap ); pmyMenuItem->hBitmap = himage1; } } HB_RETNL( ( LONG_PTR ) himage1 ); } [/pre2] и на PRG уровне [pre2]*-----------------------------------------------------------------------------* PROCEDURE _SetMenuItemIcon ( ItemName , FormName , Icon ) *-----------------------------------------------------------------------------* LOCAL a := _GetMenuIds ( ItemName , FormName ) _HMG_aControlBrushHandle [GetControlIndex ( ItemName , FormName )] := MenuItem_SetIcon ( a [1] , a [2] , Icon ) RETURN [/pre2] Пример использования: [pre2]... POPUP "&Help" FONT Font0 ITEM "Index" IMAGE "BMPHELP" ITEM "Using help" SEPARATOR ITEM "Online forum" IMAGE "WORLD" ITEM "Buy/register" IMAGE "CART_ADD" SEPARATOR ITEM "About" NAME SetIcon ACTION MsgInfo ( MiniGuiVersion() ) END POPUP END MENU _SetMenuItemIcon( "SetIcon" , "Form_1" , "demo.ico" ) [/pre2]

Andrey: gfilatov2002 пишет: Да, это возможно при добавлении в Ваш проект следующих 2-х функций Спасибо БОЛЬШОЕ ! А по умолчанию в библиотеку добавить сразу нельзя ?

gfilatov2002: Andrey пишет: в библиотеку добавить сразу нельзя ? Уже добавил эти функции в следующую сборку

Andrey: gfilatov2002 пишет: Уже добавил эти функции в следующую сборку Спасибо БОЛЬШОЕ !

Andrey: Приятно увидеть свои художества... http://clipper64bits.blogspot.ru/p/minigui_21.html

gfilatov2002: Просто к сведению. Выпустил сегодня первый RC для новой сборки библиотеки. Полный список изменений см. ниже [pre2] * Fixed: Wrong executing of a new debug logging at console or mixed appls. Problem was reported by Mitja Podgornik. You can enable the logging output if you uncommented the constant _HMG_OUTLOG in the minigui header file. By default this is turned off to preserve the proper Harbour functionality. (look at minigui.ch in folder \include) Syntax of the logging output is below: ? <explist,...> ?? <explist,...> ?a <arr> ?v <arr> There is also the optional command SET LOGFILE TO <filename>. (see demo in folder \samples\Basic\OptionBox) * New: The Task Dialog support is based upon the Vista's TaskDialog API: - win_TaskDialog0( ,, cWindowTitle, cMainMessage, cContent, ; dwCommonButtons, nIcon, @nButton ) -> nResult - win_TaskDialogIndirect0( aConfig, @nButton, @nRadioButton, ; @lVerificationFlagChecked ) -> nResult - simple CLASS TTaskDialog FUNCTION TaskDialog. Usage: WITH OBJECT TaskDialog() :Title := 'Simple TaskDialog' :Instruction := 'My Main Text here' :Content := 'A simple text only function TaskDialog()' IF :Execute() == 0 MsgInfo( :ButtonResult ) ENDIF ENDWITH Note: This feature works properly at Windows Vista or later only. Contributed by Petr Chornyj <myorg63@mail.ru> (see demos in folder \samples\Basic\TaskDialogs) * Enhanced: The OwnerDraw Menu style supports the optional function: - _SetMenuItemIcon( ItemName , FormName , Icon ). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\MenuEx) * Enhanced: Added the following features to batch\Compile.bat file: - Descriptions of the syntax was moved to a separate file. - Added the reading of the variables from an external minigui.cfg in the batch files Compile.bat and MakeLibOpt.bat. The reading takes place if a variable MG_ROOT is not defined. If the configuration file is not present, the sequence of actions is the same as before. Contributed by Petr Chornyj <myorg63@mail.ru> * Updated: HbPgSQL harbour library: - update for using PostgreSQL version 9.5. Contributed by Petr Chornyj <myorg63@mail.ru> (see in folder \Source\HbPgSql) * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.14.1. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2016-09-05 17:04): * Updated: HbSqlDD library source code (see in folder \Source\HbSqlDD). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'MultiThread usage in HMG' sample. Based upon a contribution of Roberto Lopez <mail.box.hmg@gmail.com>. Enhanced by Pete D. <pete_westg/at/yahoo.gr> (see in folder \samples\Basic\MultiThread) * New: 'Enhanced CLASS TTaskDialogEx FUNCTION TaskDialogEx' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\TaskDialogs\TaskDialogEx) * New: 'Quick Message functions are based on TaskDialog API' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\TaskDialogs\ShowMessage) * New: 'Directory Watcher' sample is based on 'Change Notification' WinAPI. Based upon a contribution of Petr Chornyj <myorg63@mail.ru>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\DirWatcher) * Updated: 'Get Form Client Height' sample. Based upon a contribution of Russian user SergKis (see in folder \samples\Basic\GetClientSize) * Updated: The following samples are revised for compatibility with the latest Harbour changes: - \Utils\SqlDBU; - \samples\Basic\Charts_2; - \samples\Advanced\MSSQL; - \samples\Advanced\MySqlDD; - \samples\Advanced\OdbcDD; - \samples\Advanced\Sqlit3DD; - \samples\Advanced\Tsb_sqlite. Contributed by Grigory Filatov <gfilatov@inbox.ru> [/pre2] Благодарю за Ваше внимание

Петр: gfilatov2002 пишет: Выпустил сегодня первый RC для новой сборки библиотеки Так и не понял куда вы их выкладываете..

gfilatov2002: Петр пишет: куда вы их выкладываете Ссылку на новую сборку отправил Вам по почте Буду благодарен за любые комментарии...

Dima: gfilatov2002 А нельзя ли в модальном окне возле крестика закрытия окна добавить кнопку минимизации , при нажатии на которую сворачивалось бы все приложение ?

SergKis: Dima Зачем эти ручные манипуляции ? Андрей показал решение. Можно в любое окно сунуть такое:[pre2] FUNC MinAll( lMinimize) LOCAL i, cWnd, cForm := ThisWindow.Name If lMinimize For i := 1 To Len(_HMG_aFormNames) cWnd := _HMG_aFormNames [ i ] If cWnd != cForm .and. _IsWindowDefined(cWnd) // что Андрей писал EndIf Next EndIf RETURN NIL [/pre2]

Dima: SergKis я о кнопке

SergKis: Dima пишет я о кнопке Если именно о кнопке, то делай стандартный заголовок с (Minimaize, Maximaize) кнопками и вешай на события блоки кода с обработчиками (ON MINIMAIZE ... ON MAXIMAIZE ...), но по мне решение на ON INIT MinAll( .T. ) и ON RELEASE MaxAll( .T. ) от внешнего управления (переменной) лучше. Можно и свой Title окна сделать (в примерах где то было) со своими кнопками\контролами ... и обрабатывать нажатия так же

gfilatov2002: Dima пишет: нельзя ли в модальном окне возле крестика закрытия окна добавить кнопку минимизации Можно, и это всего одна строчка в коде (см.пример ниже) [pre2]#include "minigui.ch" Function Main SET DEFAULT ICON TO GetStartupFolder() + "\new.ico" SET CENTERWINDOW RELATIVE PARENT DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 600 HEIGHT 400 ; TITLE 'MiniGUI StatusBar Demo (Based Upon a Contribution Of Janusz Pora)' ; MAIN ; FONT 'Arial' SIZE 10 DEFINE MAIN MENU POPUP '&StatusBar Test' ITEM 'Set StatusBar Item 1' ACTION Form_1.StatusBar.Item(1) := "New value 1" ITEM 'Set StatusBar Item 2' ACTION Form_1.StatusBar.Item(2) := "New value 2" ITEM 'Set StatusBar Item Icon' ; ACTION ( Form_1.StatusBar.Icon (3) := 'New.ico', Form_1.StatusBar.Item(3) := "A Smile!" ) ITEM 'Open Other Window...' ACTION Modal_Click() END POPUP POPUP '&Help' ITEM '&About' ACTION MsgInfo ("MiniGUI StatusBar Demo") END POPUP END MENU DEFINE STATUSBAR FONT 'MS Sans Serif' SIZE 8 STATUSITEM "Item 1" ACTION MsgInfo('Click! 1') STATUSITEM "Item 2" WIDTH 100 ACTION MsgInfo('Click! 2') STATUSITEM 'A Car!' WIDTH 100 ICON 'Car.Ico' CLOCK DATE END STATUSBAR END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil *-----------------------------------------------------------------------------* Procedure Modal_Click *-----------------------------------------------------------------------------* DEFINE WINDOW Form_2 ; AT 0,0 ; WIDTH 400 HEIGHT 300 ; TITLE 'StatusBar Test' ; MODAL NOSIZE DEFINE STATUSBAR STATUSITEM "Modal 1" WIDTH 100 ACTION MsgInfo('Click! 1') STATUSITEM "Modal 2" WIDTH 100 ACTION MsgInfo('Click! 2') END STATUSBAR END WINDOW Form_2.MinButton := .T. CENTER WINDOW Form_2 ACTIVATE WINDOW Form_2 Return[/pre2]

Dima: gfilatov2002 пишет: Form_2.MinButton := .T.

Dima: Петр пишет: Понятно, что собака зарыта здесь: FUNCTION Events ( hWnd, nMsg, wParam, lParam ) Понятно, что код там (и не только там) нужно оптимизировать в любом случае, даже если бы не было артефактов. Просто решил напомнить , было бы не плохо починить оптимизировать код , глядишь и косяков не будет....

Петр: Dima пишет: Просто решил напомнить , было бы не плохо починить оптимизировать код Код создания окна, в котором размещен tsbrowse можно увидеть? Обработчики [ ONGOTFOCUS <GotFocusProcedure> ] ; [ ONLOSTFOCUS <LostFocusProcedure> ] ; использовались?

Dima: Петр пишет: Код создания окна, в котором размещен tsbrowse можно увидеть? Да конечно. Только глючит и в примерах так же на семерке. [pre2] DEFINE WINDOW SPR_REC AT GetDesktopRealTop(),GetDesktopRealLeft() ; WIDTH WidthWindow_MyApl HEIGHT HighWindow_MyApl ; TITLE if (n_fltrecept==0,"Готовая продукция",if(n_fltrecept==1,"Черновые рецептуры","Архив рецептур")) ; ICON if(n_fltrecept==0,"AMAINICON",if(n_fltrecept==1,"BLACKS","YELLOW")) ; WINDOWTYPE STANDARD ; NOMAXIMIZE ; NOSIZE ; ON INIT Domethod("Form_0","Hide") ; ON RELEASE {||closebase(a_base),Domethod("Form_0","Show") } ; ON INTERACTIVECLOSE {|| .t.} ; ON GOTFOCUS {|| IsFocBut()} -------------- Func IsFocBut() // это костыль так как obrw:setfocus() не становился на нужный бровс , переделал на _PUSHKEY(VK_TAB) if lbut4x _PUSHKEY(VK_TAB) if lfocbrw4 _PUSHKEY(VK_TAB) endif lbut4x:=.f. endif return nil [/pre2]

Петр: Dima пишет: DEFINE WINDOW SPR_REC AT И в этом окне помещены два tsbrowse, так? У меня примеры не глючат, библиотека стандартная или своя?

Dima: да два бровса библиотека стандартная

Dima: Петр пишет: У меня примеры не глючат Я взял поклацал свертку и разворот всех окон , на 5 попытке в примере C:\MiniGUI\SAMPLES\Advanced\Tsb_LoadFields\ получил чистое окно , без бровса. Могу кино снять если надо. PS Винда не глючит и другие приложения тоже. Глюки исключительно в Минигуи.

Петр: Пока спасибо за ответы, буду смотреть. А у бровса bWhen установлены?

Петр: Dima пишет: Я взял поклацал свертку и разворот всех окон , на 5 попытке в примере C:\MiniGUI\SAMPLES\Advanced\Tsb_LoadFields\ получил чистое окно , без бровса. Могу кино снять если надо. На 7? Кино не надо, а откомпилированный пример куда-то выложить?

Dima: Петр пишет: откомпилированный пример куда-то выложить? https://cloud.mail.ru/public/H8FA/QSn8KuenV Петр пишет: А у бровса bWhen установлены? Не нашел у себя в сырцах такого.

Петр: Протестировал на XP и 7 - ничего необычного.

Dima: Петр Понял , спасибо ! Придется мириться с тем что есть ...

PSP: У меня на 10-ке "эффект" воспроизвёлся: WIN-D, затем клик по свернутому окну в панели задач. Так несколько раз. В восстановленном окне пусто. Когда щелкаешь мышой внутрь, появляются ячейки бровса.

Dima: PSP пишет: У меня на 10-ке "эффект" воспроизвёлся: Забавно а Has утверждал что на оси win 8 и выше таких косяков нет. Видимо он не шибко то и "гонял" свою задачу.

Петр: Dima пишет: Придется мириться с тем что есть Нет-нет, просто копать глубже надо. Пока соображаю

SergKis: PSP пишет У меня на 10-ке "эффект" На 2-х 8.1 получил следующее: - Win+D Win+D окно в фокусе, но с TSB фокус снят (раскраска курсора об этом говорит) и VK_TAB не восстанавливает фокус курсора (хоть ужмись) - клик на кнопке минимизации и по свернутой иконке (фокуса на TSB нет) жмем VK_TAB, фокус на TSB (курсор) восстановился, ALt+VK_TAB и ALt+VK_TAB + VK_TAB также восстанавливает фокус курсора TSB

ММК: 10-ка корпоративная 64. Пример Димы работает без проблем при любом управлении.

Dima: ММК Да проблема происходит рандомно , у меня с 5 раза получилось , у тебя может получится с тысячного или сотого. Я пробовал мучать так же , окно задачи на FW , вот там все работает как надо и ни чего не ломается. Но мне нравится Минигуи

ММК: Dima пишет: Но мне нравится Минигуи Слишком много надо менять в Минигуи , что бы все работало , как в FW. Кстати TsBrows в FW так и не заработал ( нормально) . Его просто заменили

gfilatov2002: Опубликована новая сборка 16.09 для следующих С-компиляторов: - BCC 5.51 (Harbour и xHarbour) - MinGW 6.2.0 32/64 bits (только Harbour) - BCC 10.1 (только Harbour) - XCC (xHarbour) Прямые ссылки на дистрибутивы есть на домашней странице библиотеки Если кого-то интересует компилятор Pelles C 8.0, то я могу подготовить сборку для него также... Благодарю за помощь Петра и Андрея Верченко

Dima: gfilatov2002 пишет: MinGW 6.2.0 32 Сборка похудела аж на 15 метров. Так и надо ? Брал тут http://hmgextended.com/files/CONTRIB/hmg1609-mingw.exe

gfilatov2002: Dima пишет: Сборка похудела аж на 15 метров Я почистил неиспользуемые компоненты из поставки компилятора MinGW (библиотеки для поддержки python и т.п.) Теперь качать надо меньше...

sashaBG: Привет ! в версии 16.09 Модальное окно с кнопочкой (Form_2.MinButton := .T.) для сворачивания работает по другому сворачивается само окно а не вся прога !?

Dima: sashaBG пишет: сворачивается само окно а не вся прога это не айс... уверен что окно модальное ?

sashaBG: Да уверен . Понравился трюк с ( Form_2.MinButton := .T. ) и переделал у себя в программе, на версии 16.08 все было ОК , но на новой сворачивает в низ только окно .

Dima: Тогда это косячок... С модальным так не должно быть !

Dima: sashaBG Добрался я до новой сборки. Собрал пример который дал Григорий в этой теме. Все работает нормально. Сворачивается все приложение !

sashaBG: Странно , когда запускаю через FAR все похоже OK , запускаю через проводник Виндовса - сворачивается , но в нижнем левом углу остается полоска окна . А когда сделаеш ссылку demo.exe на десктоп наблюдается тот ефект о котором я говорил. У меня Windows 10 + anniversary update PS: под Windows 8.1 32bit - тоже самое

Dima: sashaBG пишет: Странно , когда запускаю через FAR все похоже OK , запускаю через проводник Виндовса - сворачивается , но в нижнем левом углу остается полоска окна Точно. И у меня так. До этого проверял из FAR. Win 7 PS Вывод: Запускать из FAR

Andrey: Не работает вывод отладки в файл. Наверное из-за переключения в другие папки. Нужно наверно сделать в h_ini.prg: FUNCTION _SetGetLogFile( cFile ) *-----------------------------------------------------------------------------* LOCAL cOld STATIC MLog_File := GetStartUpFolder()+"\_MsgLog.txt" Если делаю у себя в программе cFileLog := GetStartUpFolder()+"\_MsgLog.txt" //_SetGetLogFile() DELETEFILE(cFileLog) SET LOGFILE TO &cFileLog То вывод отладки в файл начинает происходить.... На маленьких программках вывод отладки в файл всегда проходит...

gfilatov2002: Andrey пишет: MLog_File := GetStartUpFolder()+"\_MsgLog.txt" Сделал

Andrey: Если выводить массив ?v M->aDim, то в файле отладке массив выводиться через строчку. А зачем ?

gfilatov2002: Andrey пишет: в файле отладке массив выводиться через строчку Попробуй изменить эти команды: [pre]#command ?a [<arr>] => aEval( <arr>, { |xv, ne| _LogFile( (ne==1), ne, xv ), _LogFile() } ) #command ?v [<arr>] => aEval( <arr>, { |xv, ne| _LogFile( (ne==1), ne, iif( Valtype(xv) == "A", hb_valtoexp(xv), xv ) ), _LogFile() } ) [/pre]

Andrey: Перешёл на версию 16.09 Перестала работать отладка в файл, не компилируется вообще проекты ! ain.prg(393) Error E0030 Syntax error "syntax error at '?'" Строка 393: ?v aDim Проверял на 3-х проектах. Вернулся на 16.08 - всё нормально компилируется... Только у меня так или ошибка в МиниГуи ?

Петр: Andrey пишет: Только у меня так или ошибка в МиниГуи ? Вы это читали? [pre2]2016/09/21: HMG Extended Edition version 16.09. * Fixed: Wrong executing of a new debug logging at console or mixed appls (introduced in the build 16.08). Problem was reported by Mitja Podgornik. You can enable the logging output if you uncommented the constant _HMG_OUTLOG in the minigui header file. By default this is turned off to preserve the proper Harbour functionality. (look at minigui.ch in folder \include) Syntax of the logging output is below: ? <explist,...> ?? <explist,...> ?a <arr> ?v <arr> [/pre2]

Andrey: Петр пишет: Вы это читали? Да конечно же не читал... Всегда раньше читал и смотрел, а вот в этот раз установил и побежала работа ! Спасибо за подсказку !

Andrey: gfilatov2002 пишет: Попробуй изменить эти команды: То что нужно ! Спасибо !

gfilatov2002: Опубликована новая сборка 16.10 для следующих С-компиляторов: - BCC 5.51 (Harbour и xHarbour) - MinGW 6.2.0 32/64 bits (только Harbour) - BCC 10.1 (только Harbour) - XCC (xHarbour) Прямые ссылки на дистрибутивы есть на домашней странице библиотеки Искренняя благодарность за помощь - Петру

Andrey: gfilatov2002 пишет: Опубликована новая сборка 16.10 для следующих С-компиляторов: Классная сборка ! Особенно понравились примеры samples\Basic\CURSOR_2 samples\Basic\IMAGE

gfilatov2002: gfilatov2002 пишет: Опубликована новая сборка 16.10 Выложил срочное обновление для этой сборки (только для BCC) по адресу http://hmgextended.com/files/CONTRIB/hmg-16.10-setup.zip Что исправлено: - опечатка в Си-функции RegisterWindow(), которая приводила к пропаданию основной иконки приложения, если она была задана из внешнего файла. - отображение CueBanner на WinVista с классической темой оформления. Инсталляторы для других Си-компиляторов обновлю позже вечером



полная версия страницы