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

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

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

SergKis: gfilatov2002 Предлагаю в GetBox для valid исп. вызов со средой This. контрола, т.е.[pre2] FUNCTION OGETEVENTS( hWnd, nMsg, wParam, lParam ) ... CASE nMsg == WM_INVALID ... //IF ! Eval( oGet:postblock, oGet ) IF ! Do_ControlEventProcedure ( oGet:postblock, __mvGet( oGet:name ), oGet ) // valid SetFocus( hWnd ) ... [/pre2] Пример тут [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Sergej Kiselev <bilance@bilance.lv> * Copyright 2021 Verchenko Andrey <verchenkoag@gmail.com> */ ANNOUNCE RDDSYS #define _HMG_OUTLOG #include "minigui.ch" Function Main Local nFSize := 16, cFName := "Arial" Local nWDate, nWTime, x, y, nG, x2, cTime, oGet, cSay, nHObj Local ix,cv SET CENTURY ON SET NAVIGATION EXTENDED nWDate := 290 nWTime := 160 nG := 20 cTime := Space(6) nHObj := nFSize*2 DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 600 ; HEIGHT 490 ; TITLE "MiniGUI Date + Time Demo" ; MAIN ; FONT cFName SIZE nFSize y := 20 x := nG cSay := "Period from:" @ y, x LABEL Label_1 VALUE cSay WIDTH nWDate HEIGHT nHObj y += Form_1.Label_1.Height // дата период начало @ y, x DATEPICKER Date_1 VALUE DATE() WIDTH nWDate HEIGHT nHObj ; DATEFORMAT "dd'.'MMMM' 'yyyy" SHOWNONE x2 := Form_1.Date_1.Col + Form_1.Date_1.Width + nG // время период начало @ y, x2 GETBOX Time_1 OBJ oGet VALUE cTime WIDTH nWTime HEIGHT nHObj ; PICTURE "@R 99:99:99" VALID {|og| bValid( og ) } BUTTONWIDTH nHObj ; ON GOTFOCUS {|| SendMessage(This.Handle, 177 /*EM_SETSEL*/, 0, Len( This.Value )) } ; ON INIT {|| _SetAlign ( This.Name, ThisWindow.Name, "CENTER" ) } ; IMAGE {"MINIGUI_EDIT_CANCEL",NIL } ; ACTION ( This.Value := space(6) ) y += Form_1.Date_1.Height + nG*2 cSay := "Period to:" @ y, x LABEL Label_2 VALUE cSay WIDTH nWDate HEIGHT nHObj y += Form_1.Label_2.Height // дата период конец @ y, x DATEPICKER Date_2 VALUE DATE()+2 WIDTH nWDate HEIGHT nHObj ; DATEFORMAT "dd'.'MMMM' 'yyyy" SHOWNONE // время период конец @ y, x2 GETBOX Time_2 OBJ oGet VALUE cTime WIDTH nWTime HEIGHT nHObj ; PICTURE "@R 99:99:99" VALID {|og| bValid( og ) } BUTTONWIDTH nHObj ; ON GOTFOCUS {|| SendMessage(This.Handle, 177 /*EM_SETSEL*/, 0, Len( This.Value )) } ; ON INIT {|| _SetAlign ( This.Name, ThisWindow.Name, "CENTER" ) } ; IMAGE { "MINIGUI_EDIT_CANCEL", "MINIGUI_EDIT_OK" } ; ACTION ( This.Time_2.Value := cTime ) ; ACTION2 ( This.Time_2.Value := "235959" ) y += Form_1.Date_2.Height + nG @ y, x BUTTON Button_1 CAPTION "Get search bar" ; WIDTH nWDate + nWTime + nG HEIGHT 35 ; ACTION ( Form_1.Label_Search.Value := mySearchString() ) y += Form_1.Button_1.Height + nG * 2 @ y, x LABEL Label_Search VALUE "Search line:" WIDTH Form_1.Width - 40 ; HEIGHT 80 TOOLTIP "Search line" FONTCOLOR RED END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil * ----------------------------------------------------------------------------------- * Function mySearchString() * ----------------------------------------------------------------------------------- * Local cDate1, cDate2, cTime1, cTime2, cRet cDate1 := HB_DTOC( Form_1.Date_1.Value, 'YYYY-MM-DD') cDate2 := HB_DTOC( Form_1.Date_2.Value, 'YYYY-MM-DD') cTime1 := left(trim(This.Time_1.Value) + repl("0", 6), 6) cTime2 := left(trim(This.Time_2.Value) + repl("0", 6), 6) cTime1 := Transform(cTime1, "@R 99:99:99") cTime2 := Transform(cTime2, "@R 99:99:99") cRet := "" // поиск по полю TSZ типа "T@=" // = ModTime 8 Last modified date & time of this record // @ DayTime 8 Date & Time // T Time 4 or 8 Only time (if width is 4 ) or Date & Time (if width is 8 ) IF VAL(cTime1) > 0 .OR. VAL(cTime2) > 0 // время задано cRet += '( HB_TSTOSTR(SKLAD->TSZ) >= "'+cDate1+'" .AND. ' cRet += 'HB_TSTOSTR(SKLAD->TSZ) <= "'+cDate2+'" )' cRet += ' ???? ' + cTime1 + ' ???? ' + cTime2 ELSE // время не задано cRet += '( HB_TSTOSTR(SKLAD->TSZ) >= "'+cDate1+'" .AND. ' cRet += 'HB_TSTOSTR(SKLAD->TSZ) <= "'+cDate2+'" )' ENDIF cRet += ' .AND. !DELETED()' Return cRet * ----------------------------------------------------------------------------------- * STATIC FUNCTION bValid( oGet, nPost ) // проверка правильности времени в GetBox * ----------------------------------------------------------------------------------- * LOCAL lRet, lVl1, lVl2, lVl3, nVal LOCAL cVal := left(trim(oGet:VarGet()) + repl("0", 6), 6) LOCAL hGet := This.Handle LOCAL hWnd := ThisWindow.Handle lVl1 := lVl2 := lVl3 := .F. nVal := Val(left(cVal, 2)) IF nVal >= 0 .and. nVal < 24 ; lVl1 := .T. ENDIF nVal := Val(subs(cVal, 3, 2)) IF nVal >= 0 .and. nVal < 60 ; lVl2 := .T. ENDIF nVal := Val(subs(cVal, 5, 2)) IF nVal >= 0 .and. nVal < 60 ; lVl3 := .T. ENDIF lRet := lVl1 .and. lVl2 .and. lVl3 IF ! lRet // есть команды\ф-ии управления временем Tooltip, если надо исп. ShowGetValid можно применить // т.е. сохранить старое, поставить новое и потом после ShowGetValid (InkeyGui) восстановить SetFocus(hGet) ShowGetValid( hGet, This.Name+": Задайте правильно значение времени ! ", 'ОШИБКА '+ThisWindow.Name, 'E' ) InkeyGui( 5 * 1000 ) SetFocus(hWnd) oGet:VarPut(space(6)) oGet:Refresh() SetFocus(hGet) lRet := .T. ENDIF RETURN lRet #pragma BEGINDUMP #define _WIN32_WINNT 0x0600 #include <windows.h> #include "hbapi.h" #include "hbapicdp.h" #include <commctrl.h> #if ( defined( __BORLANDC__ ) && __BORLANDC__ < 0x582 ) typedef struct _tagEDITBALLOONTIP { DWORD cbStruct; LPCWSTR pszTitle; LPCWSTR pszText; INT ttiIcon; // From TTI_* } EDITBALLOONTIP, *PEDITBALLOONTIP; #define EM_SHOWBALLOONTIP (ECM_FIRST + 3) // Show a balloon tip associated to the edit control #define Edit_ShowBalloonTip(hwnd, peditballoontip) (BOOL)SNDMSG((hwnd), EM_SHOWBALLOONTIP, 0, (LPARAM)(peditballoontip)) #define EM_HIDEBALLOONTIP (ECM_FIRST + 4) // Hide any balloon tip associated with the edit control #define Edit_HideBalloonTip(hwnd) (BOOL)SNDMSG((hwnd), EM_HIDEBALLOONTIP, 0, 0) #define ECM_FIRST 0x1500 // Edit control messages #endif // (__BORLANDC__ < 0x582) // ToolTip Icons (Set with TTM_SETTITLE) #define TTI_NONE 0 #define TTI_INFO 1 #define TTI_WARNING 2 #define TTI_ERROR 3 #if (_WIN32_WINNT >= 0x0600) #define TTI_INFO_LARGE 4 #define TTI_WARNING_LARGE 5 #define TTI_ERROR_LARGE 6 #endif // (_WIN32_WINNT >= 0x0600) /* ShowGetValid( hWnd, cText [ , cTitul ] [ , cTypeIcon ] ) */ #if ( HB_VER_MAJOR == 3 ) #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, ch) #else #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, fCtrl, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, fCtrl, ch) #endif HB_FUNC( SHOWGETVALID ) { int i, k; const char *tp, *s; WCHAR Text[512]; WCHAR Title[512]; EDITBALLOONTIP bl; PHB_CODEPAGE s_cdpHost = hb_vmCDP(); HWND hWnd = ( HWND ) hb_parnl(1); if( ! IsWindow( hWnd ) ) return; bl.cbStruct = sizeof( EDITBALLOONTIP ); bl.pszTitle = NULL; bl.pszText = NULL; bl.ttiIcon = TTI_NONE; if( HB_ISCHAR( 2 ) ){ ZeroMemory( Text, sizeof(Text) ); k = hb_parclen(2); s = (const char *) hb_parc(2); for(i=0;i<k;i++) Text[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, s[ i ] ); bl.pszText = Text; } if( HB_ISCHAR( 3 ) ){ ZeroMemory( Title, sizeof(Title) ); k = hb_parclen(3); s = (const char *) hb_parc(3); for(i=0;i<k;i++) Title[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, s[ i ] ); bl.pszTitle = Title; } tp = ( const char * ) hb_parc(4); switch( *tp ){ case 'E' : bl.ttiIcon = TTI_ERROR_LARGE; break; case 'e' : bl.ttiIcon = TTI_ERROR; break; case 'I' : bl.ttiIcon = TTI_INFO_LARGE; break; case 'i' : bl.ttiIcon = TTI_INFO; break; case 'W' : bl.ttiIcon = TTI_WARNING_LARGE; break; case 'w' : bl.ttiIcon = TTI_WARNING; break; } Edit_ShowBalloonTip( hWnd, &bl ); } #pragma ENDDUMP [/pre2]

Andrey: SergKis пишет: Function mySearchString() Функцию исправить ! Уже есть правильная у Григория.

SergKis: Andrey пишет Уже есть правильная у Григория. Тут другое, блок кода на valid запускается сейчас по Eval(...), что со средой This, неопределенно предлагаю ... (см. выше). Тогда This среда будет для текущего GETBOX. В примере, что у тебя ThisWindow.Name попадаем на окно GetBox, но можем и промахнуться, а This.Name им GetBox нет, есть опять имя окна.


gfilatov2002: SergKis пишет: Предлагаю в GetBox для valid исп. вызов со средой This. контрола Принято Благодарю за помощь

SergKis: gfilatov2002 Поправил в примере выше bValid(), выделил цветом. Позволяет тогда без смены времени (в пределах времени tooltip) управлять длительностью сообщения ShowGetValid, т.е. нажав клавишу или клик мышой на getbox (InkeyGui сработает), переключится фокус и сообщение уйдет, потом возвращаем фокус на getbox или сообщение будет держаться пока время InkeyGui не кончится PS ShowGetValid имеет 6 вариантов image E,e,I,i,W,w, т.е. тут ShowGetValid( hGet, This.Name+": Задайте правильно значение времени ! ", 'ОШИБКА '+ThisWindow.Name, 'E' ) Можно использовать CRLF и chr(9) в тексте ShowGetValid( hGet, This.Name+": Text 1 !"+CRLF+"Text 2"+chr(9)+"ku-ku", 'ИНФОРМАЦИЯ '+ThisWindow.Name, 'i' )

gfilatov2002: SergKis пишет: Поправил в примере выше bValid() Спасибо, теперь работает хорошо

Петр: Andrey пишет: Уже есть правильная у Григория Судя по RC2 - пока нету..

Петр: Предложения по изменению c_datepicker.c #ifdef __XHARBOUR__ #define HB_ISDATETIME ISDATETIME #endif HB_FUNC( SETDATEPICK ) { HWND hwnd; SYSTEMTIME sysTime; hwnd = ( HWND ) HB_PARNL( 1 ); if ( hb_pcount() == 2 && HB_ISDATE( 2 ) ) { long lJulian; int iYear, iMonth, iDay; lJulian = hb_pardl( 2 ); hb_dateDecode( lJulian, &iYear, &iMonth, &iDay ); sysTime.wYear = ( WORD ) iYear; sysTime.wMonth = ( WORD ) iMonth; sysTime.wDay = ( WORD ) iDay; } else if( hb_pcount() > 2 ) { sysTime.wYear = ( WORD ) hb_parni( 2 ); sysTime.wMonth = ( WORD ) hb_parni( 3 ); sysTime.wDay = ( WORD ) hb_parni( 4 ); } else { sysTime.wYear = 2005; // date() ? sysTime.wMonth = 1; sysTime.wDay = 1; } sysTime.wDayOfWeek = 0; sysTime.wHour = 0; sysTime.wMinute = 0; sysTime.wSecond = 0; sysTime.wMilliseconds = 0; if( SendMessage( hwnd, DTM_SETSYSTEMTIME, GDT_VALID, ( LPARAM ) &sysTime ) == GDT_VALID ) hb_retl( HB_TRUE ); else hb_retl( HB_FALSE ); } HB_FUNC( SETTIMEPICK ) { HWND hwnd; SYSTEMTIME sysTime; hwnd = ( HWND ) HB_PARNL( 1 ); sysTime.wYear = 2005; sysTime.wMonth = 1; sysTime.wDay = 1; sysTime.wDayOfWeek = 0; sysTime.wHour = ( WORD ) hb_parni( 2 ); sysTime.wMinute = ( WORD ) hb_parni( 3 ); sysTime.wSecond = ( WORD ) hb_parni( 4 ); sysTime.wMilliseconds = 0; if( SendMessage( hwnd, DTM_SETSYSTEMTIME, GDT_VALID, ( LPARAM ) &sysTime ) == GDT_VALID ) hb_retl( HB_TRUE ); else hb_retl( HB_FALSE ); } HB_FUNC( GETDATEPICDATE ) { SYSTEMTIME st; st.wYear = 0; st.wMonth = 0; st.wDay = 0; SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ); hb_retd( st.wYear, st.wMonth, st.wDay ); } HB_FUNC( GETDATEPICKYEAR ) { SYSTEMTIME st; st.wYear = 0; SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ); hb_retni( st.wYear ); } HB_FUNC( GETDATEPICKMONTH ) { SYSTEMTIME st; st.wMonth = 0; SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ); hb_retni( st.wMonth ); } HB_FUNC( GETDATEPICKDAY ) { SYSTEMTIME st; st.wDay = 0; SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ); hb_retni( st.wDay ); } HB_FUNC( GETDATEPICKHOUR ) { SYSTEMTIME st; st.wHour = 0; if( SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ) == GDT_VALID ) hb_retni( st.wHour ); else hb_retni( -1 ); } HB_FUNC( GETDATEPICKMINUTE ) { SYSTEMTIME st; st.wMinute = 0; if( SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ) == GDT_VALID ) hb_retni( st.wMinute ); else hb_retni( -1 ); } HB_FUNC( GETDATEPICKSECOND ) { SYSTEMTIME st; st.wSecond = 0; if( SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ) == GDT_VALID ) hb_retni( st.wSecond ); else hb_retni( -1 ); } HB_FUNC( DTP_SETDATETIME ) { HWND hwnd; SYSTEMTIME sysTime; BOOL bTimeToZero = FALSE; hwnd = ( HWND ) HB_PARNL( 1 ); if( HB_ISDATETIME( 2 ) ) { int iYear, iMonth, iDay, iHour, iMinute, iSecond, iMSec; #ifdef __XHARBOUR__ long lJulian, lMilliSec; #endif #ifndef __XHARBOUR__ hb_timeStampUnpack( hb_partd( 2 ), &iYear, &iMonth, &iDay, &iHour, &iMinute, &iSecond, &iMSec ); #else if( hb_partdt( &lJulian, &lMilliSec, 2 ) ) { hb_dateDecode( lJulian, &iYear, &iMonth, &iDay ); hb_timeStampDecode( lMilliSec, &iHour, &iMinute, &iSecond, &iMSec ); } #endif sysTime.wYear = ( WORD ) iYear; sysTime.wMonth = ( WORD ) iMonth; sysTime.wDay = ( WORD ) iDay; sysTime.wDayOfWeek = 0; sysTime.wHour = ( WORD ) iHour; sysTime.wMinute = ( WORD ) iMinute; sysTime.wSecond = ( WORD ) iSecond; sysTime.wMilliseconds = ( WORD ) iMSec; } else if( HB_ISDATE( 2 ) ) { long lJulian; int iYear, iMonth, iDay; lJulian = hb_pardl( 2 ); hb_dateDecode( lJulian, &iYear, &iMonth, &iDay ); sysTime.wYear = ( WORD ) iYear; sysTime.wMonth = ( WORD ) iMonth; sysTime.wDay = ( WORD ) iDay; sysTime.wDayOfWeek = 0; bTimeToZero = TRUE; } else { sysTime.wYear = ( WORD ) hb_parnidef( 2, 2005 ); sysTime.wMonth = ( WORD ) hb_parnidef( 3, 1 ); sysTime.wDay = ( WORD ) hb_parnidef( 4, 1 ); sysTime.wDayOfWeek = 0; if( hb_pcount() >= 7 ) { sysTime.wHour = ( WORD ) hb_parni( 5 ); sysTime.wMinute = ( WORD ) hb_parni( 6 ); sysTime.wSecond = ( WORD ) hb_parni( 7 ); sysTime.wMilliseconds = ( WORD ) hb_parni( 8 ); } else bTimeToZero = TRUE; } if( bTimeToZero ) { sysTime.wHour = 0; sysTime.wMinute = 0; sysTime.wSecond = 0; sysTime.wMilliseconds = 0; } if( SendMessage( hwnd, DTM_SETSYSTEMTIME, GDT_VALID, ( LPARAM ) &sysTime ) == GDT_VALID ) hb_retl( HB_TRUE ); else hb_retl( HB_FALSE ); } HB_FUNC( DTP_GETDATETIME ) { SYSTEMTIME st; SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ); #ifdef __XHARBOUR__ hb_retdtl( hb_dateEncode( st.wYear, st.wMonth, st.wDay ), hb_timeStampEncode( st.wHour, st.wMinute, st.wSecond, st.wMilliseconds ) ); #else hb_rettd( hb_timeStampPack( st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds ) ); #endif } Что нового Добавлена функция GetDatePickDate() GetDatePickDate( c ) == hb_Date( GetDatePickYear ( c ), GetDatePickMonth ( c ), GetDatePickDay ( c ) ) SetDatePick в качестве второго аргумента может получать тип Date SetDatePick(c, Date()) dtp_SetDatetime в качестве второго аргумента может получать тип Date, тогда она работает как SetDatePick() dtp_SetDatetime(c, Date()) Улучшена совместимость с xHarbour Также теперь функции SetDatePick(), SetTimePick(), dtp_SetDatetime() в зависимости от того успешно или нет они отработали, возвращают соответственно .T. или .F.

gfilatov2002: Петр пишет: Предложения по изменению c_datepicker.c Узнаю руку мастера Благодарю за помощь

gfilatov2002: Опубликована свежая сборка 21.09 Благодарю за помощь Сергея Киселева, Игоря Назарова и Петра Черного Друзья, без Вашей помощи этот релиз не состоялся бы... P.S. Обновил также Unicode архив. P.S. 2 Желаю всем мира и добра

SergKis: gfilatov2002 Можно ссылочку на Unicode архив, старая погибла.

gfilatov2002: SergKis пишет: ссылочку на Unicode архив Отправил в личку

SergKis: gfilatov2002 Спасибо PS Может есть смысл перевести Public &mVar и __mv... ф-ии на аналог _SetGetGlobal(), что то такое STATIC _HMG_PUBLIC FUNC _SetGetPublic(...) ... смотрел на эту тему исходники и файлы ch, должно получиться (окна и контролы, по формируемым именам, вроде укладываются в схему) В ф-ии _SetGetGlobal() можно убрать[pre2] IF ISCHAR( cVarName ) cVarName := Upper( cVarName ) ENDIF т.к. параметр имя проходит через метод :Upp() в нем такое делается, т.к. в :New( lUpper := .T.) [/pre2]

gfilatov2002: SergKis пишет: Может есть смысл перевести Public &mVar и __mv... ф-ии на аналог _SetGetGlobal(), что то такое STATIC _HMG_PUBLIC FUNC _SetGetPublic(...) ... Я не против, жду ваших предложений Но смогу ответить/рассмотреть уже только после отпуска, ухожу на две недели SergKis пишет: В ф-ии _SetGetGlobal() можно убрать Убрал, конечно Благодарю за помощь

Петр: SergKis пишет: Может есть смысл перевести Public &mVar и __mv... ф-ии на аналог _SetGetGlobal() И в чем будет ожидаемый профит ? Убытки в виде потери совместимости и падения производительности - это понятно.

SergKis: Петр пишет Убытки в виде падения производительности Почему ? Для public таблица описаний, если не ошибаюсь массив структуированный, а тут Hash Убытки в виде потери совместимости Где то нет Hash ? Сейчас он внутри hmg используется в getbox, TsBrowse, может еще где И в чем будет ожидаемый профит ? Уйти на STATIC

Петр: SergKis пишет: Где то нет Hash ? Сейчас он внутри hmg используется в getbox, TsBrowse Причем здесь Hash. Старый код с ухищрениями в виде прямого доступа к публичным переменным перестанет работать. А Hash используется там куда его воткнули, к месту или нет, как будто в getbox без Hash обойтись не было возможности. SergKis пишет: Уйти на STATIC Что это даст? Мне никогда не нравилась "внутренняя" реализация MiniGUI, но по крайней мере она существует не один год в именно в таком виде, как её реализовал Роберто Лопез. У нее есть недостатки, но есть и какая-то концепция. Вот новую концепцию хотелось бы и услышать.

SergKis: Петр пишет Вот новую концепцию хотелось бы и услышать. Как то не собирался концепции разводить. Хочется просто уменьшить ко-во Public переменных в динамической памяти. При всем уважении к реализации сборщика мусора (он хорошо работает), но потери адресов public переменных происходят, так же как это было и VO (Access violation). как будто в getbox без Hash обойтись не было возможности. Можно, но с hash удобнее и код проще. Старый код с ухищрениями в виде прямого доступа к публичным переменным перестанет работать Вот потому и спросил "Может ...", т.к. пока не встречал примеров на эту тему. Не знаю кто будет организовывать прямой доступ к переменной окна или к переменной контрола для хранения индекса (речь идет только о них), т.е.[pre2] mVar := '_' + ParentFormName + '_' + ControlName k := _GetControlFree() Public &mVar. := k или mVar := '_' + FormName k := AScan ( _HMG_aFormDeleted, .T. ) Public &mVar. := k и *-----------------------------------------------------------------------------* FUNCTION GetControlIndex ( ControlName , ParentForm ) *-----------------------------------------------------------------------------* LOCAL mVar := '_' + ParentForm + '_' + ControlName RETURN __mvGetDef ( mVar , 0 ) [/pre2] по крайней мере она существует не один год в именно в таком виде, как её реализовал Роберто Лопез Огромное САСИБО ему за это, но времени уже много прошло, жизнь идет дальше, возможно и тут надо что то менять

Петр: SergKis пишет: но потери адресов public переменных происходят Мне понравился подход Андрея: запретить пользователям пить кофе (курить, есть, пить, спать.. ). Это лучше чем разбираться в причинах падений программы. SergKis пишет: Как то не собирался концепции разводить. Ну ладно. А как будет выглядеть такой вот код с использованием Hash _HMG_ActiveFormName := IF( Empty( _HMG_ActiveFormName ), 'Form_1', _HMG_ActiveFormName ) _HMG_BeginWindowActive := .T. ну или после препроцессора _HMG_SYSDATA[33] := IF( Empty( _HMG_SYSDATA[33] ), "Form_1", _HMG_SYSDATA[33] ) _HMG_SYSDATA[34] := .T. без потери производительности и с соблюдением безопасности при mt.

SergKis: Петр пишет А как будет выглядеть такой вот код с использованием Hash Так и будет выглядеть, эти define не трогаем, речь идет о ф-ях __mv... __mvPublic, __mvGet, __mvPut, ... причем для ограниченного применения ТОЛЬКО для переменных от имен form и контрола, которые динамически формируются в момент создания DEFINE ... что то. Это строки [pre2] mVar := '_' + ParentFormName + '_' + ControlName k := _GetControlFree() Public &mVar. := k или mVar := '_' + FormName k := AScan ( _HMG_aFormDeleted, .T. ) Public &mVar. := k и *-----------------------------------------------------------------------------* FUNCTION GetControlIndex ( ControlName , ParentForm ) *-----------------------------------------------------------------------------* LOCAL mVar := '_' + ParentForm + '_' + ControlName RETURN __mvGetDef ( mVar , 0 ) [/pre2] тут hash просто напрашивается, по мне Мне понравился подход Андрея: запретить пользователям пить кофе Так он и не запрещает. По моей рекомендации убирает из блока кода внешнюю для него public переменную и переводит на внутреннюю полученную через параметр и это место работает. Просто мест, сделанных от стандартного подхода от MiniGui, у него много, вот они начинают сыпаться со временем нарастания программы



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