Автор | Сообщение |
gfilatov
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
SergKis
|
| постоянный участник
|
Пост N: 3878
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.09.21 17:26. Заголовок: gfilatov2002 Предла..
gfilatov2002 Предлагаю в GetBox для valid исп. вызов со средой This. контрола, т.е. 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 ) ... Пример тут Скрытый текст
/* * 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
|
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7055
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.09.21 18:06. Заголовок: SergKis пишет: Func..
SergKis пишет: цитата: | Function mySearchString() |
| Функцию исправить ! Уже есть правильная у Григория.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3879
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.09.21 19:32. Заголовок: Andrey пишет Уже ест..
Andrey пишет цитата: | Уже есть правильная у Григория. |
| Тут другое, блок кода на valid запускается сейчас по Eval(...), что со средой This, неопределенно предлагаю ... (см. выше). Тогда This среда будет для текущего GETBOX. В примере, что у тебя ThisWindow.Name попадаем на окно GetBox, но можем и промахнуться, а This.Name им GetBox нет, есть опять имя окна.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1930
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.09.21 20:53. Заголовок: SergKis пишет: Пред..
SergKis пишет: цитата: | Предлагаю в GetBox для valid исп. вызов со средой This. контрола |
| Принято Благодарю за помощь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3881
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.09.21 13:53. Заголовок: gfilatov2002 Поправ..
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
|
| moderator
|
Пост N: 1931
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.09.21 14:26. Заголовок: SergKis пишет: Попр..
SergKis пишет: цитата: | Поправил в примере выше bValid() |
| Спасибо, теперь работает хорошо
| |
|
Петр
|
| постоянный участник
|
Пост N: 1708
Зарегистрирован: 09.10.06
|
|
Отправлено: 14.09.21 19:42. Заголовок: Andrey пишет: Уже е..
Andrey пишет: цитата: | Уже есть правильная у Григория |
| Судя по RC2 - пока нету..
| |
|
Петр
|
| постоянный участник
|
Пост N: 1709
Зарегистрирован: 09.10.06
|
|
Отправлено: 16.09.21 14:36. Заголовок: Предложения по измен..
Предложения по изменению 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
|
| moderator
|
Пост N: 1932
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.09.21 15:14. Заголовок: Петр пишет: Предлож..
Петр пишет: цитата: | Предложения по изменению c_datepicker.c |
| Узнаю руку мастера Благодарю за помощь
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1934
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.09.21 10:07. Заголовок: Всем кому это интересно
Опубликована свежая сборка 21.09 Благодарю за помощь Сергея Киселева, Игоря Назарова и Петра Черного Друзья, без Вашей помощи этот релиз не состоялся бы... P.S. Обновил также Unicode архив. P.S. 2 Желаю всем мира и добра
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3882
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.09.21 14:26. Заголовок: gfilatov2002 Можно ..
gfilatov2002 Можно ссылочку на Unicode архив, старая погибла.
| |
|
|
gfilatov2002
|
| moderator
|
Пост N: 1935
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.09.21 15:16. Заголовок: SergKis пишет: ссыл..
SergKis пишет: цитата: | ссылочку на Unicode архив |
| Отправил в личку
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3883
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.09.21 16:14. Заголовок: gfilatov2002 Спасибо..
gfilatov2002 Спасибо PS Может есть смысл перевести Public &mVar и __mv... ф-ии на аналог _SetGetGlobal(), что то такое STATIC _HMG_PUBLIC FUNC _SetGetPublic(...) ... смотрел на эту тему исходники и файлы ch, должно получиться (окна и контролы, по формируемым именам, вроде укладываются в схему) В ф-ии _SetGetGlobal() можно убрать IF ISCHAR( cVarName ) cVarName := Upper( cVarName ) ENDIF т.к. параметр имя проходит через метод :Upp() в нем такое делается, т.к. в :New( lUpper := .T.)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1936
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.09.21 16:38. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может есть смысл перевести Public &mVar и __mv... ф-ии на аналог _SetGetGlobal(), что то такое STATIC _HMG_PUBLIC FUNC _SetGetPublic(...) ... |
| Я не против, жду ваших предложений Но смогу ответить/рассмотреть уже только после отпуска, ухожу на две недели SergKis пишет: цитата: | В ф-ии _SetGetGlobal() можно убрать |
| Убрал, конечно Благодарю за помощь
| |
|
Петр
|
| постоянный участник
|
Пост N: 1710
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.09.21 20:19. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может есть смысл перевести Public &mVar и __mv... ф-ии на аналог _SetGetGlobal() |
| И в чем будет ожидаемый профит ? Убытки в виде потери совместимости и падения производительности - это понятно.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3884
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.09.21 21:43. Заголовок: Петр пишет Убытки в ..
Петр пишет цитата: | Убытки в виде падения производительности |
| Почему ? Для public таблица описаний, если не ошибаюсь массив структуированный, а тут Hash цитата: | Убытки в виде потери совместимости |
| Где то нет Hash ? Сейчас он внутри hmg используется в getbox, TsBrowse, может еще где цитата: | И в чем будет ожидаемый профит ? |
| Уйти на STATIC
| |
|
Петр
|
| постоянный участник
|
Пост N: 1711
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.09.21 22:09. Заголовок: SergKis пишет: Где ..
SergKis пишет: цитата: | Где то нет Hash ? Сейчас он внутри hmg используется в getbox, TsBrowse |
| Причем здесь Hash. Старый код с ухищрениями в виде прямого доступа к публичным переменным перестанет работать. А Hash используется там куда его воткнули, к месту или нет, как будто в getbox без Hash обойтись не было возможности. SergKis пишет: Что это даст? Мне никогда не нравилась "внутренняя" реализация MiniGUI, но по крайней мере она существует не один год в именно в таком виде, как её реализовал Роберто Лопез. У нее есть недостатки, но есть и какая-то концепция. Вот новую концепцию хотелось бы и услышать.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3885
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.09.21 22:29. Заголовок: Петр пишет Вот новую..
Петр пишет цитата: | Вот новую концепцию хотелось бы и услышать. |
| Как то не собирался концепции разводить. Хочется просто уменьшить ко-во Public переменных в динамической памяти. При всем уважении к реализации сборщика мусора (он хорошо работает), но потери адресов public переменных происходят, так же как это было и VO (Access violation). цитата: | как будто в getbox без Hash обойтись не было возможности. |
| Можно, но с hash удобнее и код проще. цитата: | Старый код с ухищрениями в виде прямого доступа к публичным переменным перестанет работать |
| Вот потому и спросил "Может ...", т.к. пока не встречал примеров на эту тему. Не знаю кто будет организовывать прямой доступ к переменной окна или к переменной контрола для хранения индекса (речь идет только о них), т.е. 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 ) цитата: | по крайней мере она существует не один год в именно в таком виде, как её реализовал Роберто Лопез |
| Огромное САСИБО ему за это, но времени уже много прошло, жизнь идет дальше, возможно и тут надо что то менять
| |
|
Петр
|
| постоянный участник
|
Пост N: 1712
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.09.21 23:09. Заголовок: SergKis пишет: но п..
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
|
| постоянный участник
|
Пост N: 3886
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.09.21 23:33. Заголовок: Петр пишет А как буд..
Петр пишет цитата: | А как будет выглядеть такой вот код с использованием Hash |
| Так и будет выглядеть, эти define не трогаем, речь идет о ф-ях __mv... __mvPublic, __mvGet, __mvPut, ... причем для ограниченного применения ТОЛЬКО для переменных от имен form и контрола, которые динамически формируются в момент создания DEFINE ... что то. Это строки 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 ) тут hash просто напрашивается, по мне цитата: | Мне понравился подход Андрея: запретить пользователям пить кофе |
| Так он и не запрещает. По моей рекомендации убирает из блока кода внешнюю для него public переменную и переводит на внутреннюю полученную через параметр и это место работает. Просто мест, сделанных от стандартного подхода от MiniGui, у него много, вот они начинают сыпаться со временем нарастания программы
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|