Автор | Сообщение |
gfilatov
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть V) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №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: 783
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.08.15 11:30. Заголовок: gfilatov2002 Григор..
gfilatov2002 Григорий, можно добавить в TSColumn парамметер cName в Method New(..., cName) Default cName := "" и в соответствующие #command для колонок задание cName
| |
|
gfilatov2002
|
| moderator
|
Пост N: 802
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.08.15 16:08. Заголовок: SergKis пишет: можн..
SergKis пишет: цитата: | можно добавить в TSColumn парамметер cName |
| Ваша идея понятна Присылайте готовую реализацию для проверки и включения в следующую сборку
| |
|
SergKis
|
| постоянный участник
|
Пост N: 784
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.08.15 11:50. Заголовок: gfilatov2002 пишет:П..
gfilatov2002 пишет: цитата: | Присылайте готовую реализацию |
| TSColumn.prg ~~~~~~~~~~~~ ... 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 ) CLASS TSColumn ... Default cHeading := "" , ; bData := {|| Nil } , ; cData := "{|| Nil }" , ; ... lTotal := .F. , ; //V90 cName := "" ::cName := cName If ValType( cHeading ) == "O" ::uBmpHead := cHeading ... i_tsbrowse.ch ~~~~~~~~~~~~~ ... #command DEFINE COLUMN <oCol> ; [ <dat: DATA, SHOWBLOCK> <uData> ] ; ... [ <total: TOTAL, TOTALIZE> ] ; [ NAME <name> ] ; => ; <oCol> := TSColumn():New( ; ... [<cMsg>], [ <cToolTip> ], [ <.total.> ], [ <"name"> ]) ... #command ADD [ COLUMN ] TO [ TBROWSE ] <oBrw> ; [ <dat: DATA, SHOWBLOCK> <uData> ] ; ... [ <total: TOTAL, TOTALIZE> ] ; [ NAME <name> ] ; => ; <oBrw>:AddColumn( TSColumn():New( ; ... [<(bPostBlock)>], [<cMsg>], [ <cToolTip> ], [ <.total.> ], [ <"name"> ] ) ) ... #command ADD [ COLUMN ] TO [ TBROWSE ] <oBrw> [ DATA ] ARRAY ; [ <el: ELM, ELEMENT> <elm> ] ; ... [ <total: TOTAL, TOTALIZE> ] ; [ NAME <name> ] ; => ; <oBrw>:AddColumn( TSColumn():New( ; ... [<cMsg>], [ <cToolTip> ], [ <.total.> ], [ <"name"> ]) ) ... #command ADD [ COLUMN ] TO [ TBROWSE ] <oBrw> [ DATA ] ; <fi: oDBF, FIELD> [FIELD] <field> ; ... [ <total: TOTAL, TOTALIZE> ] ; [ NAME <name> ] ; => ; <oBrw>:AddColumn( TSColumn():New( ; ... [ <(bPrevBlock)> ], [<(bPostBlock)>], [<cMsg>], [ <cToolTip> ], [ <.total.> ], [ <"name"> ])) ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 803
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.08.15 12:53. Заголовок: SergKis Благодарю з..
SergKis Благодарю за помощь Принято с поправкой, что между [ <.total.> ] и [ <"name"> ] расположены еще 8 переменных
| |
|
SergKis
|
| постоянный участник
|
Пост N: 785
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.08.15 17:57. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | между [ <.total.> ] и [ <"name"> ] расположены еще 8 переменных |
| пока выделял <"name"> bold-ом забыл про запятые. Еще ошибочка при SpecHd, если нет Footer все хорошо, с Footer криво METHOD DrawHeaders( lFooters ) CLASS TSBrowse ... IF ::lDrawSpecHd ... TSDrawCell( hWnd, ; // 1 hDC, ; // 2 0, ; // 3 nStartCol, ; // 4 aColSizes[nJ], ; // 5 cHeading, ; // 6 nAlign, ; // 7 nClrFore, ; // 8 nClrBackS, ; // 9 hFont, ; // 10 hBitMap, ; // 11 nHeightFoot, ; // 12 надо 0 вместо nHeightFoot l3DLook, ; // 13 1, ; // 14 nLineStyle nClrLine, ; // 15 4, ; // 16 1=Header 2=Footer 3=Super 4=Special nHeightHead, ; // 17 nHeightFoot, ; // 18 nHeightSuper, ; // 19 nHeightSpecHd, ; // 20 lAdjBmp, ; // 21 .f., ; // 22 nVAlign, ; // 23 0, ; // 24 nVertText nClrToS, ; // 25 lOpaque, ; // 26 If( lBrush, ; nClrBackS:hBrush, 0 ), ; // 27 l3DText, ; // 28 3D text nClr3dL, ; // 29 3D text light color nClr3dS ) // 30 3D text shadow color элемент // 12 надо 0 вместо nHeightFoot, тогда с прорисовкой SpecHd все Ok с Footer и без
| |
|
gfilatov2002
|
| moderator
|
Пост N: 804
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.08.15 20:20. Заголовок: SergKis пишет: элем..
SergKis пишет: цитата: | элемент // 12 надо 0 вместо nHeightFoot |
| Благодарю, уже поправил для новой сборки
| |
|
SergKis
|
| постоянный участник
|
Пост N: 786
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.08.15 09:50. Заголовок: gfilatov2002 А можн..
gfilatov2002 А можно еще немного изменений ? TSColumn.prg ~~~~~~~~~~~~ ... CLASS TSColumn ... DATA lOnGotFocusSelect AS LOGICAL INIT .F. // .T. - SendMessage( GetBoxHandle, EM_SETSEL, 0, -1 ) ... ENDCLASS h_tbrowse.prg ~~~~~~~~~~~~~ ... #define EM_SETSEL 177 ... Function LoadFields( ControlName, ParentForm, lEdit, aFieldNames) Local ix, oBrw Default lEdit := .f. ix := GetControlIndex (ControlName,ParentForm) oBrw := _HMG_aControlIds [ix] if ISARRAY(aFieldNames) oBrw:aColSel := aFieldNames endif oBrw:LoadFields(lEdit) Return oBrw // было Nil Function SetArray( ControlName, ParentForm, Arr, lAutoCols, aHead, aSizes ) Local ix, oBrw ix := GetControlIndex (ControlName,ParentForm) oBrw:= _HMG_aControlIds [ix] oBrw:SetArray(Arr, lAutoCols, aHead, aSizes) Return oBrw // было Nil ... METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, ; ... DO CASE CASE "TBTNBOX" $ Upper( oCol:oEdit:ClassName() ) oCol:oEdit:bLostFocus := Nil CASE "TGETBOX" $ Upper( oCol:oEdit:ClassName() ) ix := GetControlIndex ( ::cChildControl, ::cParentWnd ) _HMG_InteractiveCloseStarted := .T. if ix > 0 If oCol:lOnGotFocusSelect If ValType(uValue) == "C" _HMG_aControlGotFocusProcedure [ix] := {|| SendMessage( _HMG_aControlHandles [ix], EM_SETSEL, 0, If(empty(uValue), -1, Len(Trim(uValue))) ) } ElseIf ValType(uValue) $ "ND" _HMG_aControlGotFocusProcedure [ix] := {|| SendMessage( _HMG_aControlHandles [ix], EM_SETSEL, 0, -1 ) } EndIf EndIf _HMG_aControlLostFocusProcedure [ix] := { | nKey | ::EditExit( nCell, nKey, uValue, bValid, .F. ) } endif if Empty( ::bLostFocus ) ::bLostFocus := { || iif( _HMG_InteractiveCloseStarted, _HMG_InteractiveCloseStarted := .F., ) } endif ENDCASE ... выделенным изменения
| |
|
gfilatov2002
|
| moderator
|
Пост N: 805
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.08.15 11:08. Заголовок: SergKis пишет: еще ..
SergKis пишет: Добавлено с благодарностью
| |
|
gfilatov2002
|
| moderator
|
Пост N: 806
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.08.15 13:41. Заголовок: Просто к сведению. В..
Просто к сведению. Выпустил сегодня предварительный релиз для следующей сборки 2.5.1. Финальный релиз запланирован на следующей неделе Скрытый текст
* Enhanced: Added a third parameter nFlags (defined in the header file i_misc.ch) and fourth parameter lNewFolderButton to the function GetFolder() and the 3rd and 4th parameters cTitle, cInitPath to the function BrowseForFolder(). These parameters are an optional. If an initial path or BIF flag were not specified then a new UI with an editbox and validation will be used by default in the above functions. Syntax: GetFolder( [ Title ], [ InitPath ], [ BIF Flag ], ; [ New Folder Button ] ) -> Folder Name BrowseForFolder( [Folder Type], [ BIF Flag ], [ Title ], ; [ InitPath ] ) -> Folder Name Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\GetFolder) * Enhanced: Tuning of a back color of the Slider, transparent CheckBox and RadioGroup controls at an owner-draw colored TAB. If the back color of above controls was not specified then it will be defined automatically as Tab's back color. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Changed: Removed a silent assigning of 'Transparent' property to the Label and CheckBox controls when a such control was placed into a Tab control (introduced in the build 18). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: DO REPORT command: cleanup of using of the private variables. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\DO_REPORT) * Updated: The header file i_winuser.ch used to resolve WinAPI constants. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see i_winuser.ch in folder \include) * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - New: added handling of the var cName in TSColumn class; - New: added handling of a new Column var lOnGotFocusSelect; - Updated: minor correction in the function cValToChar(). Contributed by SergKis. * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.8.11.1 (from 3.8.11). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2015-08-01 13:14): - added a new code for the function ASort(). Contributed by Przemyslaw Czerpak. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: 'WAIT WINDOW with an expectation in a thread' sample. Contributed by Verchenko Andrey <verchenkoag@gmail.com>. (see demo2.prg in folder \samples\Basic\WAIT_WINDOW_2) * Updated: 'Paths' sample (demo functions for show system paths). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\Paths) * Updated: 'Process Information' sample is based on the ProcInfo library: - added a hung detection for the applications (based upon the undocumented WinAPI function IsHungAppWindow()); - added a test hunging application. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\ProcInfo)
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 787
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.08.15 15:43. Заголовок: gfilatov2002 Еще пр..
gfilatov2002 Еще предложение для TSBrowse Method SetArray2(...) Скрытый текст
h_tbrowse.prg ~~~~~~~~~~~~~ ... Function SetArray2( ControlName, ParentForm, Arr, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName ) Local ix, oBrw ix := GetControlIndex (ControlName,ParentForm) oBrw:= _HMG_aControlIds [ix] oBrw:SetArray2(Arr, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName) Return oBrw ... CLASS TSBrowse FROM TControl ... METHOD SetArray( aArray, lAutoCols, aHead, aSizes ) //V90 METHOD SetArray2( aArray, uFontHF , aHead, aSize, uFooter, aPicture, aAlign, cName ) ENDCLASS ... METHOD SetArray2( aArray, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName ) CLASS TSBrowse Local nColumns, nI, cType, nMax, bData, cHead Local nN, cData, aDefMaxVal, aDefMaxLen, aDefType, aDefAlign, aDefFooter, oCol, ; nAlign, aAligns, lFooter := .F., cFooter, nFooter, cTemp, cPict, ; hFont := If( ::hFont != Nil, ::hFont, 0 ), aFont, lSelected, ; lFont := hFont != 0, hFontHead := hFont, hFontFoot := hFont If empty(aArray) .or. ValType(aArray) != "A" nN := 1000 aArray := Array(nN) For nI := 1 To nN aArray[ nI ] := { nI, PadR("Line - "+StrZero(nI, 5), 20), ; Date()+(nI-1), ; Round(nN / nI, 3), ; nI % 2 == 0 } Next EndIf Default aHead := AClone(::aHeaders), ; aSizes := AClone(::aColSizes), ; aPicture := AClone(::aFormatPic), ; aAlign := If( ISARRAY(::aJustify), AClone(::aJustify), {} ), ; aName := {} If empty(uFontHF) uFontHF := { hFontHead, hFontFoot } ElseIf ValType(uFontHF) == "N" .and. uFontHF != 0 uFontHF := { uFontHF, uFontHF } ElseIf ValType(uFontHF) == "A" If Len(uFontHF) < 2 ASize(uFontHF, 2) EndIf If ValType(uFontHF[1]) != "N" .or. empty(uFontHF[1]) uFontHF[1] := hFontHead EndIf If ValType(uFontHF[2]) != "N" .or. empty(uFontHF[2]) uFontHF[2] := hFontFoot EndIf Else uFontHF := { hFontHead, hFontFoot } EndIf hFontHead := uFontHF[1] hFontFoot := uFontHF[2] ::aArray := aArray ::lPickerMode := .F. nColumns := If( ! Empty( aHead ), Len( aHead ), If( ! Empty( ::aArray ), Len( ::aArray[ 1 ] ), 0 ) ) //V90 ::aDefValue := Array( Len( aArray[ 1 ] ) ) //V90 aDefMaxVal := Array(nColumns) aDefType := Array(nColumns) aDefAlign := Array(nColumns) aDefMaxLen := Array(nColumns) If Len(aPicture) != nColumns ASize(aPicture, nColumns) EndIf If Len(aAlign) != nColumns ASize(aAlign, nColumns) EndIf If Len(aName) != nColumns ASize(aName, nColumns) EndIf For nI := 1 To nColumns cType := ValType( ::aArray[ 1, nI ] ) aDefType[ nI ] := cType If cType $ "CM" ::aDefValue[ nI ] := Space( Len( ::aArray[ 1, nI ] ) ) aDefMaxVal [ nI ] := ::aArray[ 1, nI ] aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_LEFT ElseIf cType == "N" ::aDefValue[ nI ] := 0 aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_RIGHT ElseIf cType == "D" ::aDefValue[ nI ] := CToD( "" ) aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_CENTER ElseIf cType == "T" #ifdef __XHARBOUR__ ::aDefValue[ nI ] := CToT( "" ) #else ::aDefValue[ nI ] := HB_CTOT("") #endif aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_LEFT ElseIf cType == "L" ::aDefValue[ nI ] := .F. aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_CENTER Else // arrays, objects and codeblocks not allowed ::aDefValue[ nI ] := "???" // not user editable data type aDefMaxVal [ nI ] := "???" aDefMaxLen [ nI ] := 0 aDefAlign [ nI ] := DT_LEFT EndIf Next ::nAt := 1 ::bKeyNo := { |n| If( n == Nil, ::nAt, ::nAt := n ) } //V90 ::cAlias := "ARRAY" // don't change name, used in method Default() ::lIsArr := .T. ::lIsDbf := .F. //JP V90 ::nLen := Eval( ::bLogicLen := { || Len( ::aArray ) + If( ::lAppendMode, 1, 0 ) } ) ::lIsArr := .T. ::bGoTop := { || ::nAt := 1 } ::bGoBottom := { || ::nAt := Eval( ::bLogicLen ) } ::bSkip := { |nSkip, nOld| nOld := ::nAt, ::nAt += nSkip, ::nAt := Min( Max( ::nAt, 1 ), ::nLen ), ::nAt - nOld } //V90 ::bGoToPos := { |n| Eval( ::bKeyNo, n ) } //V90 ::bBof := { || ::nAt < 1 } //V90 ::bEof := { || ::nAt > Len( ::aArray ) } //V90 ::lHitTop := .F. ::lHitBottom := .F. ::nRowPos := 1 ::nColPos := 1 ::nCell := 1 ::HiliteCell( 1 ) aDefFooter := Array(nColumns) aFill(aDefFooter, "") If ValType(uFooter) == "L" lFooter := uFooter ElseIf ValType(uFooter) == "A" lFooter := .T. For nI := 1 To Min( nColumns, Len(uFooter) ) aDefFooter[ nI ] := cValToChar(uFooter[ nI ]) Next EndIf If Empty( aHead ) aHead := AutoHeaders( Len( ::aArray[ 1 ] ) ) EndIf If aSizes != Nil .and. ValType( aSizes ) != "A" aSizes := AFill( Array( Len( ::aArray[ 1 ] ) ), nValToNum( aSizes ) ) ElseIf ValType( aSizes ) == "A" .and. ! Empty( aSizes ) If Len( aSizes ) < nColumns nI := Len( aSizes ) + 1 ASize( aSizes, nColumns ) AFill( aSizes, aSizes[ 1 ], nI ) EndIf Else aSizes := Nil EndIf For nI := 1 To Len(::aArray) For nN := 1 To nColumns cData := cValToChar( ::aArray[ nI, nN ] ) If len(cData) > len(aDefMaxVal[ nN ]) aDefMaxVal[ nN ] := cData aDefMaxLen[ nN ] := Max( aDefMaxLen[ nN ], Len(cData) ) EndIf Next Next ::aHeaders := Array(nColumns) ::aColSizes := Array(nColumns) ::aFormatPic := Array(nColumns) ::aJustify := Array(nColumns) For nI := 1 To nColumns bData := ArrayWBlock( Self, nI ) cHead := cValToChar( aHead[ nI ] ) nAlign := aDefAlign[ nI ] cPict := Nil lSelected := .F. If aDefType[ nI ] == "C" lSelected := .T. If ValType(aPicture[ nI ]) == "C" cPict := aPicture[ nI ] cTemp := If( left(cPict, 2) == "@K", subs(cPict, 4), cPict) Else cPict := repl("X", aDefMaxLen[ nI ]) cTemp := cPict EndIf If Len(cTemp) > Len(::aDefValue[ nI ]) ::aDefValue[ nI ] := Space( Len( cTemp ) ) EndIf ElseIf aDefType[ nI ] == "N" lSelected := .T. If ValType(aPicture[ nI ]) == "C" cPict := aPicture[ nI ] Else cPict := repl("9", aDefMaxLen[ nI ]) If ( nN := At(".", aDefMaxVal[ nI ]) ) > 0 cTemp := subs(aDefMaxVal[ nI ], nN) cPict := left(cPict, Len(cPict) - Len(cTemp))+"."+repl("9", Len(cTemp)-1) EndIf EndIf ElseIf aDefType[ nI ] == "D" lSelected := .T. EndIf If ValType(aAlign[ nI ]) == "N" .and. ( aAlign[ nI ] == DT_LEFT .or. ; aAlign[ nI ] == DT_CENTER .or. ; aAlign[ nI ] == DT_RIGHT ) nAlign := aAlign[ nI ] EndIf If lFooter aAligns := { nAlign, DT_CENTER, nAlign } cFooter := aDefFooter[ nI ] If CRLF $ cFooter cTemp := "" AEval(hb_aTokens(cFooter, CRLF), {|x| cTemp := If( Len(x) > Len(cTemp), x, cTemp )}) Else cTemp := cFooter EndIf nFooter := GetTextWidth( 0, cTemp, hFontFoot ) Else aAligns := { nAlign, DT_CENTER } cFooter := Nil nFooter := 0 EndIf If CRLF $ cHead cTemp := "" AEval(hb_aTokens(cHead, CRLF), {|x| cTemp := If( Len(x) > Len(cTemp), x, cTemp )}) Else cTemp := cHead EndIf nMax := Max( GetTextWidth( 0, aDefMaxVal[ nI ]+'B', hFont ), GetTextWidth( 0, cTemp, hFontHead ) ) nMax := Max( nMax, 60 ) nMax := Max( nMax, nFooter ) If ! Empty( aSizes ) If valtype(aSizes[ nI ]) == 'N' .and. aSizes[ nI ] > 0 nMax := aSizes[ nI ] ElseIf valtype(aSizes[ nI ]) == 'C' nMax := GetTextWidth( 0, aSizes[ nI ], hFont ) EndIf EndIf ::aHeaders [ nI ] := cHead ::aColSizes [ nI ] := nMax ::aFormatPic[ nI ] := cPict ::aJustify [ nI ] := aAligns oCol := TSColumn():New( cHead, bData, cPict,, aAligns, nMax,, ::lEditable,,,,cFooter,,,,,,, ; Self, "ArrayWBlock(::oBrw," + LTrim( Str( nI ) ) + ")" ) If lFont oCol:hFontHead := hFontHead If lFooter oCol:hFontFoot := hFontFoot EndIf EndIf If ! empty(aName[ nI ]) .and. ValType(aName[ nI ]) == "C" oCol:cName := aName[ nI ] EndIf oCol:lOnGotFocusSelect := lSelected ::AddColumn( oCol ) Next ::lNoPaint := .F. ::ResetVScroll( .T. ) //V90 //V90 If ::lPainted ::GoTop() ::Refresh() EndIf //end Return Self
| Пример. Demo.prg Скрытый текст
Demo.prg ~~~~~~~~ #include "minigui.ch" #include "common.ch" #include "TSBrowse.ch" //REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_LANG_RUWIN //REQUEST HB_LANG_RUWIN //REQUEST HB_LANG_RU866 //SET CODEPAGE TO RUSSIAN //HB_LANGSELECT( "RU" ) Proc MAIN Local oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF Local hFontHead, hFontFoot Local cFontName := _HMG_DefaultFontName Local nFontSize := 10 Public aFont := {} SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AADD( aFont, GetFontHandle( "Font_1" ) ) AADD( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW MAGAZIN AT 0, 0 ; TITLE "TEST" ; MAIN NOMAXIMIZE NOSIZE DEFINE STATUSBAR OF MAGAZIN STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR DEFINE TBROWSE oBrw AT 0, 0 ; WIDTH MAGAZIN.WIDTH - 2 * GetBorderWidth() ; HEIGHT MAGAZIN.HEIGHT - GetTitleHeight() - GetTitleHeight() - ; GetProperty( "MAGAZIN", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[1] aHead := aDatos[2] aSize := aDatos[3] aFoot := aDatos[4] aPict := aDatos[5] aAlign := aDatos[6] aName := aDatos[7] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArray2("oBrw", "MAGAZIN", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName) // oBrw := SetArray2("oBrw", "MAGAZIN") // Demo array oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 2 oBrw:nHeightHead += 4 If ! empty(aFoot) oBrw:nHeightFoot += 4 EndIf If oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell EndIf END TBROWSE END WINDOW DoMethod("MAGAZIN","Activate") return ************************ STATIC FUNCTION CreateDatos() Local i, k := 1000, aDatos := {}, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array(k) for i := 1 to k aDatos[ i ] := {" ", ; // 1 i, ; // 2 ntoc(i) + "_123", ; // 3 date()+i, ; // 4 PadR("Test line - " + ntoc(i), 20), ; // 5 round((10000-i) * i/3, 2), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 round(100.00 * i * 0.12, 2), ; // 9 Round(1234567.00 / i, 3), ; // 10 PadR("Line "+StrZero(i, 5), 20), ; // 11 date(), ; // 12 time(), ; // 13 i % 2 == 0 } // 14 next aHead := aClone(aDatos[1]) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) + ; iif(n % 2 == 0, CRLF + "My_"+hb_ntos(n), "") }) aFoot := array(len(aDatos[1])) AEval(aFoot, {|x,n| aFoot[ n ] := n }) // aFoot := .T. // подножие есть с пустыми значениями aPict := array(len(aDatos[1])) // можно не задавать, формируются aPict[10] := "99999999999.999" // автоматом для C,N по мах значению aSize := array(len(aDatos[1])) // можно не задавать, формируются aSize[10] := aPict[10] // автоматом по мах значению в колонке aAlign := array(len(aDatos[1])) // тип поля C - DT_LEFT aAlign[2] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := array(len(aDatos[1])) AEval(aName, {|x,n| aName[ n ] := "MyName_"+hb_ntos(n) }) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName }
|
| |
|
gfilatov2002
|
| moderator
|
Пост N: 807
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.08.15 16:35. Заголовок: SergKis пишет: Еще ..
SergKis пишет: цитата: | Еще предложение для TSBrowse |
| В эту сборку уже не попадет Уверен, что предложенные изменения - полезные, по два подобных метода в одном классе - это не перебор
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 788
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.08.15 18:34. Заголовок: gfilatov пишет:два п..
gfilatov пишет: цитата: | два подобных метода в одном классе - это не перебор |
| Можно было наследовать TSBrowse и менять, но тогда DEFINE разваливаются, SetArray внутри в методах встречается, его оставлять надо. Я сначала попытался удержаться в рамках SetArray, но не получилось (и он задействован в программах). У меня складывается впечатление, возможностей у TSBrowse много (но на низком уровне) и надо все строить, в каждом проекте, практически сначала или таскать код из проекта в проект - нет практически готовых решений- metodов (мне показалось для массива). Для работы с полями базы есть LoadField(...)+aColSel в DEFINE (еще не щупал), вот я и попытался для отчетов (по запросу) в массив, кирпичек побольше соорудить (в первую очередь ориентировался на себя, но улучшить желающие могут найтись, я надеюсь). Мое мнение, чем больше готовых, укрупненых решений - тем проще делать алгоритмы задачи, а то, что много методов (и даже похожих) - это такая мелочь (в сравнение с кодом VO тем более) - этим можно пренебречь.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 808
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.08.15 20:45. Заголовок: SergKis пишет: Можн..
SergKis пишет: цитата: | Можно было наследовать TSBrowse и менять, но тогда DEFINE разваливаются |
| Да, я тоже сначала подумал о субклассинге, но Вы убедили, что это создает другие проблемы... SergKis пишет: цитата: | я и попытался для отчетов (по запросу) в массив |
| Тогда, может, стоит хотя бы переименовать метод в SetArrayForRep[ort]
| |
|
SergKis
|
| постоянный участник
|
Пост N: 789
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.08.15 23:12. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | переименовать метод в SetArrayForRep[ort] |
| Да, вполне передает сущность
| |
|
SergKis
|
| постоянный участник
|
Пост N: 790
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.08.15 12:19. Заголовок: gfilatov2002 Подпра..
gfilatov2002 Подправленный вариант Method SetArray2(...) Скрытый текст
METHOD SetArray2( aArray, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName ) CLASS TSBrowse Local nColumns, nI, cType, nMax, bData, cHead Local nN, cData, aDefMaxVal, aDefMaxLen, aDefType, aDefAlign, aDefFooter, oCol, ; nAlign, aAligns, lFooter := .F., cFooter, nFooter, cTemp, cPict, ; hFont := If( ::hFont != Nil, ::hFont, 0 ), ; lFont := hFont != 0, hFontHead := hFont, hFontFoot := hFont If empty(aArray) .or. ValType(aArray) != "A" nN := 1000 aArray := Array(nN) For nI := 1 To nN aArray[ nI ] := { nI, PadR("Line - "+StrZero(nI, 5), 20), ; Date()+(nI-1), Round(nN / nI, 3), nI % 2 == 0 } Next EndIf Default aHead := AClone(::aHeaders), ; aSizes := AClone(::aColSizes), ; aPicture := AClone(::aFormatPic), ; aAlign := If( ISARRAY(::aJustify), AClone(::aJustify), {} ), ; aName := {} If ValType(uFontHF) == 'N' .and. uFontHF != 0 hFontHead := uFontHF hFontFoot := uFontHF ElseIf ValType(uFontHF) == 'A' .and. Len(uFontHF) >= 2 If ValType(uFontHF[1]) == 'N' .and. uFontHF[1] != 0 hFontHead := uFontHF[1] EndIf If ValType(uFontHF[2]) == 'N' .and. uFontHF[2] != 0 hFontFoot := uFontHF[2] EndIf EndIf ::aArray := aArray ::lPickerMode := .F. nColumns := If( ! Empty( aHead ), Len( aHead ), If( ! Empty( ::aArray ), Len( ::aArray[ 1 ] ), 0 ) ) //V90 ::aDefValue := Array( Len( aArray[ 1 ] ) ) //V90 aDefMaxVal := Array(nColumns) aDefType := Array(nColumns) aDefAlign := Array(nColumns) aDefMaxLen := Array(nColumns) aFill(aDefMaxLen, 0) If Len(aPicture) != nColumns ASize(aPicture, nColumns) EndIf If Len(aAlign) != nColumns ASize(aAlign, nColumns) EndIf If Len(aName) != nColumns ASize(aName, nColumns) EndIf For nI := 1 To nColumns cType := ValType( ::aArray[ 1, nI ] ) aDefType[ nI ] := cType If cType $ "CM" ::aDefValue[ nI ] := Space( Len( ::aArray[ 1, nI ] ) ) aDefMaxVal [ nI ] := Trim( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_LEFT ElseIf cType == "N" ::aDefValue[ nI ] := 0 aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_RIGHT ElseIf cType == "D" ::aDefValue[ nI ] := CToD( "" ) aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_CENTER ElseIf cType == "T" #ifdef __XHARBOUR__ ::aDefValue[ nI ] := CToT( "" ) #else ::aDefValue[ nI ] := HB_CTOT("") #endif aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_LEFT ElseIf cType == "L" ::aDefValue[ nI ] := .F. aDefMaxVal [ nI ] := cValToChar( ::aArray[ 1, nI ] ) aDefMaxLen [ nI ] := Len( aDefMaxVal [ nI ] ) aDefAlign [ nI ] := DT_CENTER Else // arrays, objects and codeblocks not allowed ::aDefValue[ nI ] := "???" // not user editable data type aDefMaxVal [ nI ] := "???" aDefMaxLen [ nI ] := 0 aDefAlign [ nI ] := DT_LEFT EndIf Next ::nAt := 1 ::bKeyNo := { |n| If( n == Nil, ::nAt, ::nAt := n ) } //V90 ::cAlias := "ARRAY" // don't change name, used in method Default() ::lIsArr := .T. ::lIsDbf := .F. //JP V90 ::nLen := Eval( ::bLogicLen := { || Len( ::aArray ) + If( ::lAppendMode, 1, 0 ) } ) ::lIsArr := .T. ::bGoTop := { || ::nAt := 1 } ::bGoBottom := { || ::nAt := Eval( ::bLogicLen ) } ::bSkip := { |nSkip, nOld| nOld := ::nAt, ::nAt += nSkip, ::nAt := Min( Max( ::nAt, 1 ), ::nLen ), ::nAt - nOld } //V90 ::bGoToPos := { |n| Eval( ::bKeyNo, n ) } //V90 ::bBof := { || ::nAt < 1 } //V90 ::bEof := { || ::nAt > Len( ::aArray ) } //V90 ::lHitTop := .F. ::lHitBottom := .F. ::nRowPos := 1 ::nColPos := 1 ::nCell := 1 ::HiliteCell( 1 ) aDefFooter := Array(nColumns) aFill(aDefFooter, "") If ValType(uFooter) == "L" lFooter := uFooter ElseIf ValType(uFooter) == "A" lFooter := .T. For nI := 1 To Min( nColumns, Len(uFooter) ) aDefFooter[ nI ] := cValToChar(uFooter[ nI ]) Next EndIf If Empty( aHead ) aHead := AutoHeaders( Len( ::aArray[ 1 ] ) ) EndIf If aSizes != Nil .and. ValType( aSizes ) != "A" aSizes := AFill( Array( Len( ::aArray[ 1 ] ) ), nValToNum( aSizes ) ) ElseIf ValType( aSizes ) == "A" .and. ! Empty( aSizes ) If Len( aSizes ) < nColumns nI := Len( aSizes ) + 1 ASize( aSizes, nColumns ) AFill( aSizes, aSizes[ 1 ], nI ) EndIf Else aSizes := Nil EndIf For nI := 1 To Len(::aArray) For nN := 1 To nColumns cData := cValToChar( ::aArray[ nI, nN ] ) If len(cData) > len(aDefMaxVal[ nN ]) If aDefType[ nN ] == "C" aDefMaxVal[ nN ] := Trim(cData) aDefMaxLen[ nN ] := Max( aDefMaxLen[ nN ], Len(aDefMaxVal[ nN ]) ) Else aDefMaxVal[ nN ] := cData aDefMaxLen[ nN ] := Max( aDefMaxLen[ nN ], Len(cData) ) EndIf EndIf Next Next ::aHeaders := Array(nColumns) ::aColSizes := Array(nColumns) ::aFormatPic := Array(nColumns) ::aJustify := Array(nColumns) For nI := 1 To nColumns bData := ArrayWBlock( Self, nI ) cHead := cValToChar( aHead[ nI ] ) nAlign := aDefAlign[ nI ] cPict := Nil If aDefType[ nI ] == "C" If ValType(aPicture[ nI ]) == "C" .and. Len(aPicture[ nI ]) > 0 cTemp := If( left(aPicture[ nI ], 2) == "@K", subs(aPicture[ nI ], 4), aPicture[ nI ]) Else cTemp := repl("X", aDefMaxLen[ nI ]) EndIf If Len(cTemp) > Len(::aDefValue[ nI ]) ::aDefValue[ nI ] := Space( Len( cTemp ) ) EndIf cPict := repl("X", Len(::aDefValue[ nI ])) ElseIf aDefType[ nI ] == "N" If ValType(aPicture[ nI ]) == "C" cPict := aPicture[ nI ] Else cPict := repl("9", aDefMaxLen[ nI ]) If ( nN := At(".", aDefMaxVal[ nI ]) ) > 0 cTemp := subs(aDefMaxVal[ nI ], nN) cPict := left(cPict, Len(cPict) - Len(cTemp))+"."+repl("9", Len(cTemp)-1) EndIf EndIf EndIf If ValType(aAlign[ nI ]) == "N" .and. ( aAlign[ nI ] == DT_LEFT .or. ; aAlign[ nI ] == DT_CENTER .or. ; aAlign[ nI ] == DT_RIGHT ) nAlign := aAlign[ nI ] EndIf If lFooter aAligns := { nAlign, DT_CENTER, nAlign } cFooter := aDefFooter[ nI ] If CRLF $ cFooter cTemp := "" AEval(hb_aTokens(cFooter, CRLF), {|x| cTemp := If( Len(x) > Len(cTemp), x, cTemp )}) Else cTemp := cFooter EndIf nFooter := GetTextWidth( 0, cTemp, hFontFoot ) Else aAligns := { nAlign, DT_CENTER } cFooter := Nil nFooter := 0 EndIf If CRLF $ cHead cTemp := "" AEval(hb_aTokens(cHead, CRLF), {|x| cTemp := If( Len(x) > Len(cTemp), x, cTemp )}) Else cTemp := cHead EndIf nMax := Max( GetTextWidth( 0, aDefMaxVal[ nI ]+'W', hFont ), GetTextWidth( 0, cTemp, hFontHead ) ) nMax := Max( nMax, 32 ) nMax := Max( nMax, nFooter ) If ! Empty( aSizes ) If valtype(aSizes[ nI ]) == 'N' .and. aSizes[ nI ] > 0 nMax := aSizes[ nI ] ElseIf valtype(aSizes[ nI ]) == 'C' nMax := GetTextWidth( 0, aSizes[ nI ], hFont ) EndIf EndIf ::aHeaders [ nI ] := cHead ::aColSizes [ nI ] := nMax ::aFormatPic[ nI ] := cPict ::aJustify [ nI ] := aAligns oCol := TSColumn():New( cHead, bData, cPict,, aAligns, nMax,, ::lEditable,,,,cFooter,,,,,,, ; Self, "ArrayWBlock(::oBrw," + LTrim( Str( nI ) ) + ")" ) If lFont oCol:hFontHead := hFontHead If lFooter oCol:hFontFoot := hFontFoot EndIf EndIf If aDefType[ nI ] == "L" oCol:lCheckBox := .T. EndIf If ! empty(aName[ nI ]) .and. ValType(aName[ nI ]) == "C" oCol:cName := aName[ nI ] EndIf ::AddColumn( oCol ) Next ::lNoPaint := .F. ::ResetVScroll( .T. ) //V90 //V90 If ::lPainted ::GoTop() ::Refresh() EndIf //end Return Self
| И назвать его можно SetArrayTo(...), на нем и корректировку делать можно, не только отчет
| |
|
gfilatov2002
|
| moderator
|
Пост N: 809
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.08.15 12:45. Заголовок: SergKis пишет: Подп..
SergKis пишет: цитата: | Подправленный вариант Method SetArray2(...) |
| Благодарю
| |
|
gfilatov2002
|
| moderator
|
Пост N: 810
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.08.15 10:30. Заголовок: Выпустил очередной р..
| |
|
Andrey
|
| постоянный участник
|
Пост N: 4442
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.08.15 12:33. Заголовок: Собрал под новой вер..
Собрал под новой версией свои проги. Полёт нормальный !
| |
|
Softlog86
|
| |
Пост N: 268
Зарегистрирован: 03.12.08
|
|
Отправлено: 14.08.15 00:03. Заголовок: Подскажите - это так..
Подскажите - это так и должно быть или лечится ?: 1) Есть форма с контролом TAB . и организовано несколько страниц PAGE . На первой странице - несколько строчек : LABEL и кнопок BUTTONEX . При первоначальном выводе формы - некоторые контролы и LABELы не отображаются пока мышкой не проведешь там где они должны быть нарисованы ....
| |
|
gfilatov2002
|
| moderator
|
Пост N: 811
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.08.15 22:49. Заголовок: Softlog86 пишет: эт..
Softlog86 пишет: цитата: | это так и должно быть или лечится ? |
| Нет, это не нормально Лечится с помощью включения следующей строки в процедуру ON INIT: цитата: | InvalidateRect( Application.Handle, 0 ) |
|
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|