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

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

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

Ответов - 80, стр: 1 2 3 4 All

gfilatov2002: SergKis пишет: Добавка к классам Принимается с благодарностью Выложу обновленные исходники со всеми последними изменениями для Вашего ознакомления по старому адресу чуть позже P.S. Обновил - можете скачать для проверки

SergKis: gfilatov2002 пишет Обновил - можете скачать для проверки Добавил [pre2] Tsb_UserKeysEvent\demo.prg ... This.FRM_1.Cargo := ' Form <1> created !' cNam := 'Get_1' @ nY, nX+This.FRM_1.Width+2 GETBOX &cNam WIDTH 150 ; VALUE 'Test oGet:SetKeyEvent(...)' ; FONT 'Arial' SIZE 9 ; TOOLTIP 'Press F5 or LDblClick' ; BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ; FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}} (This.&(cNam).Object):Get:SetKeyEvent( VK_F5, {|o| MsgBox( 'VK_F5 : ' + cValToChar( o:VarGet() ), This.Name ) } ) (This.&(cNam).Object):Get:SetKeyEvent( , {|o| MsgBox( 'LDblClick : ' + cValToChar( o:VarGet() ), This.Name ) } ) nY += This.FRM_1.Height + nHgt ... GetBox\demo.prg ... oGet:SetKeyEvent( VK_F5, {|o| MsgBox( 'VK_F5 : ' + cValToChar( o:VarGet() ), This.Name ) } ) oGet:SetKeyEvent( , {|o| MsgBox( 'LDblClick : ' + cValToChar( o:VarGet() ), This.Name ) } ) ... oGet:SetKeyEvent( VK_F5, {|o| MsgBox( 'VK_F5 : ' + cValToChar( o:VarGet() ), This.Name ) } ) oGet:SetKeyEvent( , {|o| MsgBox( 'LDblClick : ' + cValToChar( o:VarGet() ), This.Name ) } ) ... [/pre2] для наглядности

gfilatov2002: SergKis пишет: для наглядности Благодарю Добавил, конечно

SergKis: gfilatov2002 Вы были правы, надо добавить в класс TWndData ACCESS IsStatusBar INLINE ! Empty(::oStatusBar) Немного по GetBox[pre2] FUNCTION OGETEVENTS( hWnd, nMsg, wParam, lParam ) ... CASE wParam == 3 // CTRL+C Copy CopyToClipboard( subs(oGet:Buffer, nStart, nEnd - nStart) ) // CopyToClipboard( oGet:Buffer ) RETURN( 0 ) CASE wParam == 24 .AND. !readonly // CTRL+X Cut IF !lAllowEdit .OR. oGet:type == "L" RETURN( 0 ) ENDIF CopyToClipboard( subs(oGet:Buffer, nStart, nEnd - nStart) ) // CopyToClipboard( oGet:Buffer ) //Franz nStart := LoWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ... ELSEIF wParam == VK_RIGHT IF lShift nEnd := oGet:Pos SendMessage( hWnd , EM_SETSEL , nStart , nEnd ) ELSE SendMessage( hWnd , EM_SETSEL , nStart + 1 , nStart + 1 ) _HMG_aControlMiscData1 [ i ][1] := 0 ENDIF oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_HOME SendMessage( hWnd , EM_SETSEL , 0 , 0 ) oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_END // Patch By Pier July 2008 // Add By Pier patch for the incorrect end position START // IF HiWord( SendMessage( hWnd , EM_GETSEL , 0 , 0 ) ) < Len( Trim( oGet:Buffer ) ) // SendMessage( hWnd , EM_SETSEL , Len( Trim( oGet:Buffer ) ) , Len( Trim( oGet:Buffer ) ) ) // ELSE // SendMessage( hWnd , EM_SETSEL , Len( oGet:Buffer ) , Len( oGet:Buffer ) ) // ENDIF // Add By Pier patch for the incorrect end position STOP // oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 nEnd := Len( Trim(oGet:Buffer) ) nStart := iif( lShift, nStart, nEnd ) SendMessage( hWnd, EM_SETSEL, nStart, nEnd ) RETURN 1 ELSEIF wParam == VK_INSERT ... CASE nMsg == WM_PASTE IF readonly .OR. ! lAllowEdit RETURN( 0 ) ENDIF IF ( cText := RetrieveTextFromClipboard() ) <> NIL nStart := LoWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 nLen := Len( oGet:Buffer ) IF nStart # nEnd ... FOR i := nStart TO nEnd // clear selection by backspacing IF oGet:pos > nStart oGet:BackSpace() ELSE EXIT ENDIF NEXT ENDIF h := oGet:pos FOR i := 1 TO Len( cText ) wParam := Asc( SubStr( cText, i, 1 ) ) IF oGet:type == "N" .AND. wParam == 46 oGet:toDecPos() ELSE IF IsInsertActive() oGet:Insert( Chr( wParam ) ) ELSE oGet:Overstrike( Chr( wParam ) ) ENDIF ENDIF IF h + i > nLen EXIT ENDIF NEXT ... Это, конечно, не все режимы, остальные позже. [/pre2] Потестить надо, я покрутил, но ... Может задуматься об управлении Tone(...), у себя убрали совсем (только мешает). Можно в класс внести Get внести переменную и плясать от нее или как то иначе ...

gfilatov2002: Завершена подготовка новой сборки 17.07 для BCC 5.51 (Harbour и xHarbour) , которая будет опубликована завтра. Под заказ возможно сделать индивидуальные сборки для таких дополнительных С-компиляторов: - MinGW 7.1.0 32-bit и Harbour 3.4.0dev (наиболее востребованная); - MinGW 7.1.0 64-bit и Harbour 3.4.0dev; - MS VisualC 2015 32-bit и Harbour 3.2.0dev; - MS VisualC 2017 32-bit и Harbour 3.2.0dev; - BCC 10.1 32-bit и Harbour 3.2.0dev; - PellesC 8.0 32-bit и xHarbour 1.2.3 build 10194 (на любителя). Благодарю за Ваше внимание

gfilatov2002: SergKis пишет: Немного по GetBox Это уже изменения для следующей сборки, если таковая появится в обозримом будущем...

SergKis: gfilatov2002 Если добавить в TsBrowse [pre2] METHOD DrawSelect( xRow ) CLASS TSBrowse ... nBegin := Min( If( ::nColPos <= ::nFreeze, ( ::nColPos := ::nFreeze + 1, ::nColPos - ::nFreeze ), ; ::nColPos - ::nFreeze ), nLastCol ) If ::bOnDrawLine != Nil Eval( ::bOnDrawLine, Self ) EndIf For nI := nBegin To nLastCol ... [/pre2] то можно обходиться без SET RELATION [pre2] LOCAL aName := { "VOP", "SKL" , "KLI" , "DAT" , "DOK" , "GRU" , "KOD" , "NAM" } LOCAL aColumn := { "R_1", "R_2" , "R_3" , "R_4" , "R_5" , "R_6" , "R_7" , "U02->R_3" } LOCAL aHeader := { "Op.", "Sklad", "Klient", "Datums", "Dokum.", "Grupa", "Kods", "Nosaukums" } ... For nI := 1 To nK cFld := aColumn[ nI ] If ( i := AT("->", cFld) ) > 0 j := left(cFld, i - 1) cFld := subs(cFld, i + 2) Else j := cAls EndIf bFld := FieldWBlock( cFld, Select( j ) ) cHdr := aHeader[ nI ] If "\" $ cHdr; cHdr := StrTran(cHdr, "\", CRLF) EndIf cFoo := aFooter[ nI ] If "\" $ cFoo; cFoo := StrTran(cFoo, "\", CRLF) EndIf ADD TO oBrw ; DATA bFld ; HEADER cHdr ; FOOTER cFoo ; COLOR aColor [ nI ] ; ALIGN aAlign [ nI ] ; WIDTH aWidth [ nI ] ; PICTURE aPicture[ nI ] ; MOVE aMoveDir[ nI ] ; NAME aName [ nI ] Next ... :bOnDrawLine := {|ob| MyRelat(ob) } ... FUNC MyRelat( oBrw ) LOCAL cAls := oBrw:cAlias LOCAL cKod := (cAls)->( R_6+R_7 ) IF ! U02->( R_1+R_2 ) == cKod U02->( dbSeek(cKod) ) ENDIF RETURN Nil [/pre2]

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

gfilatov2002: Опубликована очередная сборка 17.07 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу http://hmgextended.com/files/CONTRIB/hmg-17.07-setup.exe Благодарю за Ваше внимание и помощь в подготовке этой сборки

SergKis: gfilatov2002 Пропущено [pre2] h_tbrowse.prg Function _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight,; ... _HMG_aControlMiscData2 [k] := '' IF _HMG_lOOPEnabled Eval ( _HMG_bOnControlInit, k, mVar ) ENDIF Return oBrw ... [/pre2]

Andrey: Пробую новую версию. Глобальный переключатель oBrw:lNoKeyChar := .T. // отключить edit от нажатия клавиш цифр\букв теперь есть ! Это классно. А нельзя ли сделать такой же переключатель - только выборочно по столбцам ? Типа oBrw:aColumns[nI]:lNoKeyChar := .F. Для ENTER же есть - oBrw:aColumns[nI]:lEdit := .F. Или как то блокировать редактирование полей справочника ? Т.е. в тестовом проекте (который я высылал Tsb_composite(1.6).7z), редактируется неизвестно что, после нажатия букв/цифр на колонке справочника. Хотя я там блокирую редактирование: [pre2] oBrw1:aColumns[9]:bPrevEdit := {|| SelectStreet(oBrw1), TblFocus(), FALSE } [/pre2]

SergKis: Andrey такой переключатель у тебя в руках [pre2] If ::bUserKeys != Nil uReturn := Eval( ::bUserKeys, nKey, nFlags, Self ) If uReturn != Nil .and. ValType( uReturn ) == "N" .and. uReturn < 200 // interpreted as a virtual key code to nKey := uReturn // change the original key pressed ElseIf uReturn != Nil .and. ValType( uReturn ) == "L" .and. ! uReturn ::nUserKey := 255 // want to inhibit the KeyDown and KeyChar Methods for key pressed Return 0 EndIf EndIf т.е. надо выключить для 5, 7 cell (в :bUserKeys) IF oBrw:nCell == 5; RETURN .F. ELSEIF oBrw:nCell == 7; RETURN .F. ENDIF RETURN .T. [/pre2]

Andrey: SergKis пишет: такой переключатель у тебя в руках Я согласен что он в руках. Но хочется простоты, без обработки функции - :bKeyDown или :bUserKeys Просто на столбце задать запрет и всё. Если глянешь мой пример, то там нет в основной таблице: oBrw1:bKeyDown или oBrw1:bUserKeys. Для многих программ их и не надо.

SergKis: Andrey пишет Хотя я там блокирую редактирование: :bPrevEdit возвращая .F., блокирует edit в METHOD KeyDown(...), но не блокирует выполнение METHOD KeyChar(...), где вкл. edit от цифр\букв. попробуй поставь перед возвратом из :bPrevEdit oBrw:nUserKey := 255 // want to inhibit the KeyDown and KeyChar Methods for key pressed т.е. oBrw1:aColumns[9]:bPrevEdit := {|xv,ob| xv := ob, SelectStreet(oBrw1), TblFocus(), ob:nUserKey := 255, FALSE }

SergKis: Andrey пишет Для многих программ их и не надо. Ты хочешь управлять METHOD KeyChar(...) на самом деле и тогда, вероятно, надо делать, добавив переменную в класс DATA bKeyChar [pre2] METHOD KeyChar( nKey, nFlags ) CLASS TSBrowse ... Default ::nUserKey := nKey IF ::bKeyChar != Nil .and. !Empty( EVal( ::bKeyChar, Key, Self, nFlag ) RETURN 0 ENDIF If ::nUserKey == 255 .or. ::lNoKeyChar // from KeyDown() method Return 0 EndIf [/pre2]

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

Andrey: SergKis пишет: oBrw1:aColumns[9]:bPrevEdit := {|xv,ob| xv := ob, SelectStreet(oBrw1), TblFocus(), ob:nUserKey := 255, FALSE } Не работает ! Все равно редактирует поле справочника после выбора из справочника !

gfilatov2002: Сделал быстрое обновление новой сборки с учетом последних изменений. Список изменений см. ниже [pre2] * Modified: A dependance of Minigui core from the functions of the tsbrowse library was removed (introduced in the build 17.07). Reported by Marcelo A. L. Carli <malcarli@terra.com.br>. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.20.0rc3. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2017-07-27 18:57). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) [/pre2] Прямая ссылка на архив http://hmgextended.com/files/CONTRIB/hmg-17.07.7z

gfilatov2002: SergKis пишет: Вы были правы, надо добавить в класс TWndData ACCESS IsStatusBar INLINE ! Empty(::oStatusBar) Благодарю Добавил в класс такую строку ACCESS HasStatusBar INLINE !( Empty( ::oStatusBar ) ) Пример использования: [pre2] IF oWnd:HasStatusBar SetStatusbarProperties() ENDIF [/pre2]Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты...

Andrey: gfilatov2002 пишет: Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты... Есть для Tsbrowsa ! Сделать блокирование столбцов на цифры/буквы, что бы можно было задавать отдельно на любой столбец ! Желательно отдельно - вот так: oBrw:aColumns[nI]:lNoKeyChar := .F. Тогда кода можно будет меньше делать, т.е. можно будет обходиться без :bUserKeys и :bKeyDown Для простых задач - самое нужное ! Для примера смотреть - Tsb_composite



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