Форум » 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

gfilatov2002: Всем кому это интересно Подготовил вторую бету для новой мартовской сборки библиотеки Благодарю за Ваше внимание

Andrey: Всем привет. Созрело предложение по цветам. Сейчас в i_color.ch только 19 цветов и все задаются через {....} Для новых кнопок с градиентами нужны числовые цвета. В TSBROWSE.CH только 16 цветов, нет ORANGE и неск.других, да и не всегда удобно к проекту его добавлять, там куча всего. Название цветов мне нравиться больше как в TSBROWSE.CH Посмотреть заодно и как в FW сделано. Предлагаю в i_color.ch добавить цвета: [pre2]#define CLR_YELLOW RGB( 255 , 255 , 0 ) #define CLR_PINK RGB( 255 , 128 , 192 ) #define CLR_HRED RGB( 255 , 0 , 0 ) #define CLR_HMAGENTA RGB( 255 , 0 , 255 ) #define CLR_BROWN RGB( 128 , 64 , 64 ) #define CLR_ORANGE RGB( 255 , 128 , 64 ) #define CLR_HGREEN RGB( 0 , 255 , 0 ) #define CLR_PURPLE RGB( 128 , 0 , 128 ) #define CLR_BLACK RGB( 0 , 0 , 0 ) #define CLR_WHITE RGB( 255 , 255 , 255 ) #define CLR_GRAY RGB( 128 , 128 , 128 ) #define CLR_HBLUE RGB( 0 , 0 , 255 ) #define CLR_HGRAY RGB( 192 , 192 , 192 ) #define CLR_RED RGB( 128 , 0 , 0 ) #define CLR_OLIVE RGB( 128 , 128 , 0 ) #define CLR_LGREEN RGB( 0 , 128 , 0 ) #define CLR_HCYAN RGB( 0 , 255 , 255 ) #define CLR_BLUE RGB( 0 , 0 , 128 ) #define CLR_CYAN RGB( 0 , 128 , 128 )[/pre2] Может что и упустил... И ещё можно добавить вот такие цвета: [pre2]#define CLR_SKYPE RGB( 0, 176,240 ) // голубой, как SKYPE #define CLR_VIBER RGB( 125, 82,158 ) // фиолетовый, как в Viber #define CLR_VK RGB( 93, 114,148 ) // сине-серый, как в Контакте #define CLR_TWIT RGB( 118, 170,235 ) // голубой, как TWITER #define CLR_FB RGB( 71, 89,149 ) // синеватый, как Фейсбук #define CLR_OK RGB( 238, 89,149 ) // оранжевый, как Одноклассники[/pre2]

SergKis: gfilatov2002 Предложение заменить, подправить[pre2] METHOD DoEvent ( Key, nHandle ) CLASS TWndData LOCAL o := Self LOCAL i := o:Index LOCAL w := o:IsWindow IF ! empty(nHandle) IF hmg_IsWindowObject( nHandle ) // control handle o := hmg_GetWindowObject( nHandle ) i := o:Index w := o:IsWindow ELSEIF nHandle > 0 .and. nHandle <= Len( _HMG_aControlHandles ) // control index IF hmg_IsWindowObject( _HMG_aControlHandles[ nHandle ] ) o := hmg_GetWindowObject( _HMG_aControlHandles[ nHandle ] ) i := o:Index w := o:IsWindow ELSE i := nHandle w := .F. ENDIF ENDIF ENDIF IF w RETURN Do_WindowEventProcedure ( ::oEvent:Get( Key ), i, o, Key ) ENDIF RETURN Do_ControlEventProcedure( ::oEvent:Get( Key ), i, o, Key ) и пример APP_OOPEVENTS DEFINE MAIN MENU POPUP 'MENU_1' NAME 100 ITEM 'Item main menu 1.1' NAME 101 IMAGE 'n1' ; ACTION (ThisWindow.Object):PostMsg(val(This.Name), This.Index) ITEM 'Item main menu 1.2' NAME 102 IMAGE 'n2' ; ACTION (ThisWindow.Object):PostMsg(val(This.Name)) ITEM 'Item main menu 1.3 ( This -> Button_2 )' NAME 103 IMAGE 'n3' ; ACTION (ThisWindow.Object):PostMsg(val(This.Name), This.Button_2.Index) SEPARATOR ITEM 'Exit' NAME 199 ; ACTION (ThisWindow.Object):PostMsg(val(This.Name)) END POPUP [/pre2]


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

SergKis: gfilatov2002 Поправьте, пожалуйста[pre2] METHOD Sum( Key, xSum ) CLASS TKeyData LOCAL sum := ::Get( Key, 0 ) IF HB_ISNUMERIC( xSum ) IF HB_ISNUMERIC( sum ); sum += xSum ELSE ; sum := xSum ENDIF ::Set( Key, sum ) ELSEIF HB_ISARRAY( xSum ) IF HB_ISARRAY( sum ) .AND. Len( sum ) == Len( xSum ) AEval( xSum, {| s, i| sum[ i ] := iif( HB_ISNUMERIC( s ), sum[ i ] + s, s ) } ) ELSE sum := xSum ENDIF ::Set( Key, sum ) ENDIF RETURN NIL ... METHOD Sum( Key, xSum ) CLASS TThrData LOCAL sum := ::Get( Key, 0 ) IF HB_ISNUMERIC( xSum ) IF HB_ISNUMERIC( sum ); sum += xSum ELSE ; sum := xSum ENDIF ::Set( Key, sum ) ELSEIF HB_ISARRAY( xSum ) IF HB_ISARRAY( sum ) .AND. Len( sum ) == Len( xSum ) AEval( xSum, {| s, i| sum[ i ] := iif( HB_ISNUMERIC( s ), sum[ i ] + s, s ) } ) ELSE sum := xSum ENDIF ::Set( Key, sum ) ENDIF RETURN NIL ... [/pre2]

gfilatov2002: SergKis пишет: Поправьте, пожалуйста Уже сделал. Благодарю за помощь и внимание

SergKis: gfilatov2002 Предлагаю новый метод для tsb, для растяжки нескольких колонок до размера тсб по ширине. [pre2] METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse LOCAL c, i, k, n, s, w, obr := Self, aCol := {} LOCAL nVisible := 0 Default nDelta := 1 If empty(aColumns) aColumns := array( ::nColCount() ) AEval(aColumns, {|xv,nn| xv := nn, aColumns[ nn ] := xv }) Endif If HB_ISNUMERIC(aColumns) AAdd(aCol, aColumns) ElseIf HB_ISCHAR(aColumns) AAdd(aCol, ::nColumn(aColumns)) Else AEval(aColumns, {|xv| AAdd(aCol, iif( HB_ISCHAR(xv), obr:nColumn(xv), xv )) }) EndIf AEval( ::aColumns, {|oc| nVisible += iif( oc:lVisible, oc:nWidth, 0 ) }) k := Len(aCol) w := GetWindowWidth( ::hWnd ) - nVisible - nDelta - iif( ::lNoVScroll, 0, GetVScrollBarWidth() ) If w > 0 n := int( w / k ) s := 0 For i := 1 To k c := aCol[ i ] If i == k ::aColumns[ c ]:nWidth += ( w - s ) Else s += n ::aColumns[ c ]:nWidth += n EndIf Next EndIf RETURN Nil [/pre2] Использование при ширине tsb > ширины колонок :AdjColumns() - все колонки :AdjColumns({"NAME", "SUMMA"}) - указанные колонки по cName :AdjColumns({3, 4, 5}) - указанные колонки по номеру В пример App_OOPoKeyData, который прислал Andrey, можно вставить[pre2] *-----------------------------------------------------------------------------* STATIC FUNC TsbReport( oWnd, nEvent, aArray, cColName ) *-----------------------------------------------------------------------------* ... :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; {RGB(220, 220, 220), RGB(220, 220, 220)} ) } } ) :AdjColumns({3, 4, 5}) // или :AdjColumns() END TBROWSE oRpt:SetNoHoles() ... [/pre2]

gfilatov2002: SergKis пишет: Предлагаю новый метод для tsb 1. добавил новый полезный метод 2. переименовал пример App_OOPoKeyData в APP_OOPREPORT 3. вставку строки в пример сделал - работает! Благодарю за помошь

SergKis: gfilatov2002 поправьте APP_OOPREPORT (передал в TsbReport oWnd, а не показал цель этого)[pre2] FUNCTION Main() ... :Event( 7, {|ow,ky| Report(ow, ky) } ) // ToolBar 2 :Event( 99, {|ow | ow:Release() } ) // StatusBar :Event( 91, {|ow | ow:StatusBar:Say('... W A I T ...') } ) :Event( 92, {|ow | ow:StatusBar:Say('') } ) END WITH // ---- Window events ... STATIC FUNC TsbReport( oWnd, nEvent, aArray, cColName ) ... // ToolBar 1 (This.Object):Event( 1, {|ow| oWnd:StatusBar:Say('... W A I T ...'), ; MsgBox('P r i n t i n g' , ow:Name), ; oWnd:StatusBar:Say('') } ) (This.Object):Event( 2, {|ow| oWnd:PostMsg(91), ; MsgBox('Export to MS Excel', ow:Name), ; oWnd:PostMsg(92) } ) ...[/pre2]

gfilatov2002: SergKis пишет: поправьте APP_OOPREPORT Поправил, конечно. Благодарю за помощь - пример работает нормально

SergKis: gfilatov2002 пишет пример работает нормально Попробую сразу ответить на вопрос "Как улучшить вид отчета ?" [pre2] 1. FUNCTION Main() ... DEFINE FONT FontBold FONTNAME _HMG_DefaultFontName ; SIZE _HMG_DefaultFontSize BOLD DEFINE FONT FontNorm FONTNAME "Courier New" ; SIZE _HMG_DefaultFontSize BOLD USE Employee ALIAS BASE SHARED NEW ... STATIC FUNC Report( oWnd, nEvent ) ... b := { {|| Alltrim( FIRST ) }, ; {|| Alltrim( LAST ) }, ; {|| hb_ntos( AGE ) }, ; {|| Alltrim( STATE ) }, ; {|| Alltrim( CITY ) }, ; {|| STATE + ', ' + LEFT( LAST, 1 ) + '...' }, ; {|| CITY + ', ' + LEFT( LAST, 1 ) + '...' } ; } ... cKey := Eval( b[ nEvent ] ) o:Sum( cKey, { 1, cKey, 1, INCOMING, OUTLAY, INCOMING - OUTLAY } ) SKIP ... STATIC FUNC TsbReport( oWnd, nEvent, aArray, cColName ) ... // посчитаем итоги FOR EACH a IN aArray For i := 1 To Len(a) If i < 3 o:Sum(i, 1) // кол- во Else o:Sum(i, a[ i ]) // сумма EndIf Next NEXT a := o:Eval(.T.) // array {{value}, ...} aAlign := array(Len(a)) aSize := array(Len(a)) aPict := array(Len(a)) aFoot := array(Len(a)) aSize [ 1 ] := 50 aPict [ 1 ] := '9999' aAlign[ 1 ] := DT_CENTER AEVal(a, {|ns,nn| aFoot[ nn ] := iif( nn == 1, '', hb_ntos(ns) ) }) ... // заголовки колонок отчета aHead := { "#", cColName, "Quantity", "Incoming", "Outlay", "Balance" } ... DEFINE WINDOW Report ; AT 0, 0 ; WIDTH 700 ; ... :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; {RGB(220, 220, 220), RGB(220, 220, 220)} ) } } ) :aColumns[ 1 ]:bData := {|| oRpt:nAt } If nEvent == 6 .or. nEvent == 7 :aColumns[ 2 ]:hFont := GetFontHandle('FontNorm') :aColumns[ 2 ]:nWidth += 70 EndIf :AdjColumns({3, 4, 5}) // :AdjColumns() ... 2. Можно разложить, к примеру, cKey на 2-е колонки. Схема такая o:Sum( cKey, { 1, cKey, "", 1, INCOMING, OUTLAY, INCOMING - OUTLAY } ) и потом в массиве разделяем cKey по разделителю на 2-е части 1-ю пишем на место cKey 2-ю пишем на место добавленного элемента "" мняем aHead с добавленной надписью над новой колонкой и aFoot формируем с учетом новой колонки [/pre2]

SergKis: PS надо без BOLD [pre2] DEFINE FONT FontNorm FONTNAME "Courier New" ; SIZE _HMG_DefaultFontSize [/pre2]

SergKis: Заработал My-Files.ru (глючил). Ссылка на пример о чем говорил выше. http://my-files.ru/037m5e

gfilatov2002: SergKis пишет: Ссылка на пример Благодарю за обновленный пример! Что сделал: 1. поправил опечатку Alias := Alias() 2. перевел комментарии из OEM-кодировки в ANSI. 3. проверил компиляцию примера по команде compile.bat /e /w

SergKis: gfilatov2002 пишет compile.bat /e /w Спасибо за напоминание, с Borlandом редко собираю, забываю эти параметры для Compile.bat. перевел комментарии из OEM-кодировки в ANSI. Все проекты в OEM и настройки на нее, дергаю куски и комментарии идут, как идут. Сорри. По SET OOP ON показал практически все что хотел. Думаю теперь только вопросы.

SergKis: SergKis пишет показал практически все что хотел Работу с сообщениями из тсб добавил в пример, т.е. кнопки toolbar продублировал клавишами http://my-files.ru/h5e6ms

gfilatov2002: SergKis пишет: кнопки toolbar продублировал клавишами Благодарю за помощь Очень наглядный пример использования ООП

SergKis: gfilatov2002 Надо правку сделать, Andrey неточность нашел, при hide колонки. Считать надо не только ширину видимых колонок, но и их кол-во[pre2] METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse ... LOCAL nVisible := 0, aVisible := {} ... AEval( ::aColumns, {|oc| nVisible += iif( oc:lVisible, oc:nWidth, 0 ) }) AEval( aCol , {|nc| iif( obr:aColumns[ nc ]:lVisible, AAdd(aVisible, nc), Nil ) }) k := Len(aVisible) ... For i := 1 To k c := aVisible[ i ] ... [/pre2]

gfilatov2002: SergKis пишет: Надо правку сделать Поправил, конечно. Благодарю за внимание

SergKis: gfilatov2002 Поправьте APP_OOPREPORT для альтернативного задания клавиш[pre2] BUTTON 01 CAPTION 'First' PICTURE 'n1' ; TOOLTIP 'Column report FIRST Ctrl+1, Shift+1' ; ACTION wPost() SEPARATOR BUTTON 02 CAPTION 'Last' PICTURE 'n2' ; TOOLTIP 'Column report LAST Ctrl+2, Shift+2' ; ACTION wPost() SEPARATOR BUTTON 03 CAPTION 'Age' PICTURE 'n3' ; TOOLTIP 'Column report AGE Ctrl+3, Shift+3' ; ACTION wPost() SEPARATOR BUTTON 04 CAPTION 'State' PICTURE 'n4' ; TOOLTIP 'Column report STATE Ctrl+4, Shift+4' ; ACTION wPost() SEPARATOR BUTTON 05 CAPTION 'City' PICTURE 'n5' ; TOOLTIP 'Column report CITY Ctrl+5, Shift+5' ; ACTION wPost() SEPARATOR BUTTON 06 CAPTION 'State ?' PICTURE 'n6' ; TOOLTIP 'Column report STATE + Left(LAST, 1) Ctrl+6, Shift+6' ; ACTION wPost() SEPARATOR BUTTON 07 CAPTION 'City ?' PICTURE 'n7' ; TOOLTIP 'Column report CITY + Left(LAST, 1) Ctrl+7, Shift+7' ; ACTION wPost() SEPARATOR ... oTabl:SetFocus() ON KEY SHIFT+1 ACTION wPost(1) ON KEY SHIFT+2 ACTION wPost(2) ON KEY SHIFT+3 ACTION wPost(3) ON KEY SHIFT+4 ACTION wPost(4) ON KEY SHIFT+5 ACTION wPost(5) ON KEY SHIFT+6 ACTION wPost(6) ON KEY SHIFT+7 ACTION wPost(7) ON KEY ESCAPE ACTION wPost(99) END WINDOW ... STATIC FUNC Report( oWnd, nEvent ) ... oWnd:Action := .F. oBrw:lEnabled := .F. oWnd:StatusBar:Say('... W A I T ...') ... TsbReport( oWnd, nEvent, aRpt, cNam ) (This.oTabl.Object):Tsb:lEnabled := .T. // oBrw:lEnabled := .T. (This.oTabl.Object):SetFocus() // oBrw:SetFocus() ... [/pre2] PS На время формирования отчета (oWnd:Action := .F.) блокируются действия окна по сообщениям до (oWnd:Action := .T.)



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