Форум » 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 пишет если у Вас есть другое предложение, как это исправить, то я его с удовольствием использую... Пока не разобрался. В массивах не исп. oCol:bPrevEdit и :bPostEdit до сих пор. Но добавил такое [pre2] CLASS TSColumn ... DATA lEditBox AS LOGICAL INIT .F. // Edit with editbox ... METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, nClrBack ) CLASS TSBrowse ... ElseIf ( cType == "C" .and. Chr( 13 ) $ uValue ) .or. cType == "M" .or. oCol:lEditBox IF oCol:lEditBox .and. ! Chr( 13 ) $ uValue uValue := trim( uValue ) ENDIF Default uValue := "" // ЭТО ЛИШНЕЕ т.к. делали Chr( 13 ) $ uValue If ::nMemoHE == Nil ... на dbf отработало нормально Ctlr+W и Esc, а с массивом только в таком варианте (тот же пример) ... IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF :lNoKeyChar := .T. FOR EACH oCol IN :aColumns oCol:lEdit := .T. oCol:bPrevEdit := {|xv,ob,nc,oc| ? "PrevEdit", nc, oc:cName, xv Return .T. } oCol:bPostEdit := {|xv,ob| Local nc := ob:nCell Local oc := ob:GetColumn(nc) ? "PostEdit", nc, oc:cName, xv Return Nil } NEXT oCol := :GetColumn(5) oCol:lEditBox := .T. ON KEY CONTROL+W ACTION {|| Local oBrw := This.oBrw.Object If oBrw:IsEdit // tsb field edit oBrw:aColumns[ oBrw:nCell ]:oEdit:Save() EndIf oBrw:SetFocus() Return Nil } ON KEY ESCAPE ACTION {|| Local oBrw := This.oBrw.Object If oBrw:IsEdit // tsb field edit oBrw:SetFocus() Else ThisWindow.Release EndIf Return Nil } ... [/pre2] Хотел в bPrevEdit и в bPostEdit добавить обработку строки для кол. 5, но блоки не вызвались и первое что увидел блокировка вызова bPrevEdit

gfilatov2002: SergKis пишет: блоки не вызвались и первое что увидел блокировка вызова bPrevEdit Проверил еще раз без этой правки ElseIf nKey != VK_RETURN // GF 15-10-2015 блок bPrevEdit вызывается ДВАЖДЫ

SergKis: gfilatov2002 пишет блок bPrevEdit вызывается ДВАЖДЫ Виноват, не поставил команду в самом начале #define _HMG_OUTLOG потому вывода из блока кода по ? ... и не было блоки кода сработали нормально


SergKis: gfilatov2002 Предлагаю такую работу с memo полями и полями "C" но длинными, не полностью входящие в показ колонки, т.е. поле длинной 200, а показ в 50 символов. Изменения [pre2] CLASS TSColumn ... DATA cEditBoxSep AS STRING INIT "" // editing EditBox line separator DATA nEditBoxWrap AS NUMERIC INIT 0 // editing EditBox line len wrap DATA lEditBoxROnly AS LOGICAL INIT .F. // no editing EditBox - ReadOnly DATA lEditBox AS LOGICAL INIT .F. // editing with editbox ... METHOD Save() CLASS TSMulti LOCAL cText IF ::bSetGet != NIL cText := ::GetText() IF Right( cText, 2 ) == CRLF cText := SubStr( cText, 1, Len( cText ) - 2 ) ENDIF IF ::oCol:lEditBox .and. ! Empty( cText ) .and. CRLF $ cText IF Len( ::oCol:cEditBoxSep ) > 0 cText := StrTran( cText, CRLF, ::oCol:cEditBoxSep ) ELSEIF ::oCol:nEditBoxWrap > 0 cText := StrTran( cText, CRLF, " " ) ENDIF ENDIF Eval( ::bSetGet, cText ) IF Empty( ::oCol:bEditEnd ) ::oBrw:PostEdit( cText, ::nCol ) ENDIF ENDIF RETURN NIL ... METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, nClrBack ) CLASS TSBrowse ... ElseIf ( cType == "C" .and. Chr( 13 ) $ uValue ) .or. cType == "M" .or. oCol:lEditBox IF oCol:lEditBox .and. ! Empty( uValue := trim( uValue ) ) IF Len( oCol:cEditBoxSep ) > 0 .and. oCol:cEditBoxSep != CRLF ; .and. oCol:cEditBoxSep $ uValue uValue := StrTran( uValue, oCol:cEditBoxSep, CRLF ) ENDIF IF oCol:nEditBoxWrap > 0 cTmp := uValue nK := MLCOUNT( cTmp, oCol:nEditBoxWrap, , .T. ) uValue := "" FOR nI := 1 TO nK uValue += Trim( MEMOLINE( cTmp, oCol:nEditBoxWrap, nI, , .T. ) ) IF nI != nK ; uValue += CRLF ENDIF NEXT ENDIF ENDIF If ::nMemoHE == Nil ... oCol:oEdit := TSMulti():New( nRow, nCol, bSETGET( uValue ), Self, nWidth, nHeight, ; hFont, nClrFore, nClrBack, ::cChildControl, cWnd ) oCol:oEdit:bGotFocus := { || oCol:oEdit:HideSel(), oCol:oEdit:SetPos( 0 ) } lMulti := .T. IF oCol:lEditBoxROnly oCol:oEdit:SendMsg( EM_SETREADONLY, 1, 0 ) ENDIF oCol:oEdit:Hide() ... [/pre2] Пример тут https://TransFiles.ru/vw1pc Открываем файл userlog.dbf в режимах Edit - Yes или No, Смотрим последнюю запись в файле и две последних колонки при нажатии Enter

SergKis: PS В h_tbrowse.prg добавить #define EM_SETREADONLY 207

SergKis: PS2 в примере это строки [pre2] STATIC FUNCTION MdiChildOpen() ... DEFINE TBROWSE oBrw AT y,x WIDTH w HEIGHT h CELL ; ... :Cargo:nMaxMemoCnt := 0 // Max count field memo :Cargo:nMaxCharCol := 50 // Max len char column :Cargo:nMaxLineMem := 10 // Max line for memo edit :Cargo:lEdit := oMain:Cargo:lEdit ... ELSEIF o:cFieldTyp $ "CM" IF o:cFieldTyp == "M" .or. o:nFieldLen > :Cargo:nMaxCharCol o:lEditBox := .T. IF o:cFieldTyp == "M" :nMemoHE := :Cargo:nMaxLineMem :Cargo:nMaxMemoCnt += 1 ELSE o:nEditBoxWrap := :Cargo:nMaxCharCol ENDIF o:nWidth := o:ToWidth( :Cargo:nMaxCharCol ) :Cargo:lToolTipCol := .T. IF ! :Cargo:lEdit o:lEditBoxROnly := .T. o:lEdit := .T. ENDIF ELSE o:nWidth += GetFontWidth("Normal", 1) ENDIF ENDIF ... [/pre2]

gfilatov2002: SergKis пишет: Предлагаю такую работу с memo полями Все изменения приняты. SergKis пишет: Открываем файл userlog.dbf в режимах Edit - Yes или No, Смотрим последнюю запись в файле и две последних колонки при нажатии Enter Пример проверил, работает. Благодарю за помощь

Andrey: SergKis пишет: Открываем файл userlog.dbf в режимах Edit - Yes или No, Смотрим последнюю запись в файле и две последних колонки при нажатии Enter А в карточке редактировать тоже нужно !

SergKis: Andrey пишет А в карточке редактировать тоже нужно ! К тсб, редактирование в карточке полей memo и "длинных" полей "C", не имеет отношения. Надо сделать отдельное MdiChild окно для редактирования с контролом EDITBOX. Изменения выше относятся именно к работе на тсб таблице

gfilatov2002: Выпустил 3-е обновление сборки 20.08 Что нового (на языке оригинала): [pre2] * Fixed: The initial display of the window with a TAB control is not correct if you place a WINDOW PANEL on the second page of the TAB control. That's exists in the official version too. Bug was reported by Hans Marc. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Basic\CONTAINERS\Panel) * New: Added the useful function HMG_DbfStruct(). Syntax: HMG_DbfStruct( cDbfName ) --> aStruct where aStruct is a multidimensional array with database fields structure, which is similar to the output from dbStruct(), but without the need to use the USE command. (see demo in folder \samples\Advanced\Tsb_MoreFields) * Updated: Minor modifications in the MiniGUI core for compatibility with the new Pelles C 10.0 (64-bit) and Harbour 3.2.0dev. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - added the new variables :cEditBoxSep, :nEditBoxWrap, :lEditBoxROnly and :lEditBox in the TSColumn class. Contributed by Sergej Kiselev (see demo in folder \samples\Advanced\Tsb_DemoMDI) * New: 'Charts SQLITE3' sample is based on using of the SQLite ODBC Driver from http://www.ch-werner.de/sqliteodbc/. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\Charts_4) * New: 'Test Directory List with System Icons' sample. Based upon a contribution of HMG user Jimmy. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\FILEICON) * New: 'TBrowse speed test with multiple fields' samples. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\Tsb_MoreFields) * Updated: 'DBF to HTML Wizard' sample: - added using of Bootstrap and jQuery frameworks. Contributed by Marcos Jarrin Pita (see in folder \samples\Applications\Dbf2Html) [/pre2] Благодарю всех, кто поддерживал и поддерживает этот проект "на плаву"

Andrey: gfilatov2002 пишет: Выпустил 3-е обновление сборки 20.08 Что то пример SAMPLES\Advanced\FILEICON не собирается... [pre2]Harbour 3.2.0dev (r2008190002) Copyright (c) 1999-2020, https://harbour.github.io/ C:\Users\Andrey\AppData\Local\Temp\hbmk_vzy17f.dir\FILEICON.c: C:\Users\Andrey\AppData\Local\Temp\hbmk_vzy17f.dir\HB_FUNC.c: Error E2209 HB_FUNC.PRG 4: Unable to open include file 'ShObjIdl.h' Error E2451 HB_FUNC.PRG 11: Undefined symbol 'SHFILEINFO' in function HB_FUN_GETICOINDEX Error E2379 HB_FUNC.PRG 11: Statement missing ; in function HB_FUN_GETICOINDEX Error E2451 HB_FUNC.PRG 13: Undefined symbol 'sfi' in function HB_FUN_GETICOINDEX Error E2109 HB_FUNC.PRG 13: Not an allowed type in function HB_FUN_GETICOINDEX Error E2451 HB_FUNC.PRG 13: Undefined symbol 'SHGFI_ICON' in function HB_FUN_GETICOINDEX Warning W8065 HB_FUNC.PRG 13: Call to function 'SHGetFileInfo' with no prototype in function HB_FUN_GETICOINDEX Warning W8004 HB_FUNC.PRG 16: 'nSize' is assigned a value that is never used in function HB_FUN_GETICOINDEX Error E2147 HB_FUNC.PRG 56: 'HIMAGELIST' cannot start a parameter declaration Error E2303 HB_FUNC.PRG 56: Type name expected *** 8 errors in Compile *** C:\Users\Andrey\AppData\Local\Temp\hbmk_ir7be9.c: hbmk2[FILEICON]: Error: Running C/C++ compiler. 1[/pre2] Может из за того что сижу на BCC 5.5.1 ?

gfilatov2002: Выпустил 4-е обновление сборки 20.08 Что нового (на языке оригинала): [pre2] * Fixed: The default backcolor of Label, CheckBox and RadioGroup controls is not correct if you place a WINDOW PANEL into the TAB control. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Basic\CONTAINERS\Panel) * Fixed: Wrong GETBOX update behavior when user entered an invalid date value (there is no way to correct it via program action). Bug was reported by Pierpaolo Martinello. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: The DATEPICKER supports the colors definition for a dropdown MonthCalendar in the THEMED Operating Systems. It was a postponed user's request. Based upon a contribution of HMG user Jimmy. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\DatePicker) * Enhanced: The MONTHCAL control allows the display of days in BOLD. There are three auxiliary functions for above feature handling: - AddMonthCalBoldDay( ControlName, ParentName, dDate ); - DelMonthCalBoldDay( ControlName, ParentName, dDate ); - IsMonthCalBoldDay( ControlName, ParentName, dDate ). Based upon a code borrowed from OOHG. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see month.prg in folder \samples\Basic\MONTHCAL) * New: 'Testing columns in Tsbrowse for DBF file' sample. Contributed by Sergej Kiselev and Verchenko Andrey (see in folder \samples\Advanced\Tsb_2tables) * New: 'Virtual columns in Tsbrowse for DBF file' sample. Contributed by Sergej Kiselev and Verchenko Andrey (see in folder \samples\Advanced\Tsb_VirtualColumn) * Updated: 'Month calendar control test' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\MONTHCAL) There is a "last-minute" improvement also: * Enhanced: The MONTHCAL control will be adjusted correctly by width and height after assigning a FontName and/or FontSize at runtime. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see month.prg in folder \samples\Basic\MONTHCAL) [/pre2]

Haz: gfilatov2002 пишет: Выпустил 4-е обновление сборки 20.08 Что нового (на языке оригинала): На языке оригинала язык не поворачивается сказать Давно не обновлял, в начале недели обновил на одну из последних сборок и началось .... Проблема в слетевших ::cPicture по умолчанию , все строковые колонки во всех TSB были обрезаны и если пользователь их начал редактировать - резались данные. Для начала в спешке прописал ::cPicture по всему коду, где не указано явно. Затем выдохнул и принялся изучать причину, а она простая: у меня базы в ADT формате (ADS), этот формат проходит проверку IsDbf(), но типы символьных полей вариативны ( не тупо равно "C"). В новых сборках пикча назначается в ::LoadFields() как [pre2] ... aStru := ( cAlias )->( DbStruct() ) ... cType := aStru[ nE, 2 ] If cType == "C" cPicture := "@K " + Replicate( 'X', aStru[ nE, 3 ] ) ElseIf cType == "N" ... [/pre2] и поскольку в качестве типа символьного поля я использую "CICHARACTER" , а типа "C" в ADS просто нет, то поимел танцы. почему бы при формировании пикчи вместо cType := aStru[ nE, 2 ] не использовать значение из поля а не из структуры примерно так cType := ValType( (cAlias)->&(aStru[ nE, 1 ])) или cType := ValType( (cAlias)->(FieldGet(nE)) ?

SergKis: Haz пишет В новых сборках пикча назначается в ::LoadFields() как ... aStru := ( cAlias )->( DbStruct() ) ... cType := aStru[ nE, 2 ] If cType == "C" cPicture := "@K " + Replicate( 'X', aStru[ nE, 3 ] ) ElseIf cType == "N" ... смотрю версию 2.07 от 2012 года там в LoadFields aStru := ( cAlias )->( DbStruct() ) и cType := aStru[ nE, 2 ] If cType == "C" cPicture := "@K "+Replicate('X', aStru[ nE, 3 ] ) ElseIf cType == "N" ... т.е. это историческая данность, а valtype не везде даст то что надо с новыми типами полей, наверно, надо усложнять проверку, но инициатива от тебя, т.к. я не работаю с ADS

gfilatov2002: Haz пишет: почему бы при формировании пикчи вместо cType := aStru[ nE, 2 ] не использовать значение из поля а не из структуры примерно так cType := ValType( (cAlias)->&(aStru[ nE, 1 ])) или cType := ValType( (cAlias)->(FieldGet(nE)) ? Благодарю за предложение Поправил, конечно Обидно, что именно так сделано в методе :LoadRelated(), а в методе :LoadFields() тип берется из массива aStru у оригинального автора библиотеки

Haz: gfilatov2002 пишет: Поправил, конечно Там ниже на пару строк в исходнике тоже из структуры, может и там поправить ? Странно что до последних обновлений все работало корректно, если это от автора изменения .

Haz: gfilatov2002 пишет: Поправил, конечно Там ниже на пару строк в исходнике тоже из структуры, может и там поправить ? Странно что до последних обновлений все работало корректно, если это от автора изменения .

gfilatov2002: Haz пишет: может и там поправить ? Привожу полный текст исправленного метода для проверки: [pre]* ============================================================================ * METHOD TSBrowse:LoadFields() Version 9.0 Nov/30/2009 // modified by SergKis * ============================================================================ METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel, aHeadSel ) CLASS TSBrowse Local n, nE, cHeading, nAlign, nSize, cData, cType, nDec, hFont, cPicture, ; cBlock, nCols, aNames, cKey, ; aColSizes := ::aColSizes, ; cOrder, nEle, ; cAlias, cName, aStru, ; aAlign := { "LEFT", "CENTER", "RIGHT", "VERT" } Local cTmp, cHead, hFontH Default lEditable := ::lEditable, ; aColSizes := {} cAlias := iif( HB_ISCHAR( cAlsSel ), cAlsSel, ::cAlias ) aStru := ( cAlias )->( DbStruct() ) aNames := iif( HB_ISARRAY( aColSel ), aColSel, ::aColSel ) nCols := iif( aNames == Nil, ( cAlias )->( FCount() ), Len( aNames ) ) aColSizes := iif( Len( ::aColumns ) == Len( aColSizes ), Nil, aColSizes ) For n := 1 To nCols nE := iif( aNames == Nil, n, ( cAlias )->( FieldPos( aNames[ n ] ) ) ) If ValType( ::aHeaders ) == "A" .and. ! Empty( ::aHeaders ) .and. n <= Len( ::aHeaders ) cHeading := ::aHeaders[ n ] cHead := cHeading Else cHeading := ::Proper( ( cAlias )->( Field( nE ) ) ) EndIf If HB_ISARRAY( aHeadSel ) .and. Len( aHeadSel ) > 0 .and. n <= Len( aHeadSel ) .and. aHeadSel[ n ] != Nil cHeading := aHeadSel[ n ] cHead := cHeading EndIf If CRLF $ cHeading cData := "" FOR EACH cTmp IN hb_ATokens( cHeading, CRLF ) IF Len( cTmp ) > Len( cData ) cData := cTmp EndIf NEXT cHeading := cData cData := NIL EndIf If ( nEle := AScan( ::aTags, {|e| Upper( cHeading ) $ Upper( e[ 2 ] ) } ) ) > 0 cOrder := ::aTags[ nEle, 1 ] cKey := ( cAlias )->( OrdKey() ) If Upper( cHeading ) $ Upper( cKey ) ::nColOrder := iif( Empty( ::nColOrder ), Len( ::aColumns ) + 1, ::nColOrder ) EndIf Else cOrder := "" EndIf nAlign := iif( ::aJustify != Nil .and. Len( ::aJustify ) >= nE, ::aJustify[ nE ], ; iif( ( cAlias )->( ValType( FieldGet( nE ) ) ) == "N", 2, ; iif( ( cAlias )->( ValType( FieldGet( nE ) ) ) $ "DL", 1, 0 ) ) ) nAlign := iif( ValType( nAlign ) == "L", iif( nAlign, 2, 0 ), ; iif( ValType( nAlign ) == "C", AScan( aAlign, nAlign ) - 1, nAlign ) ) nSize := iif( ! aColSizes == Nil .and. Len( aColsizes ) >= nE, aColSizes[ nE ], Nil ) cData := ( cAlias )->( FieldGet( nE ) ) cType := ValType( cData ) If cType == "C" cPicture := "@K " + Replicate( 'X', aStru[ nE, 3 ] ) ElseIf cType == "N" cPicture := Replicate( '9', aStru[ nE, 3 ] ) If aStru[ nE, 4 ] > 0 cPicture := SubStr( cPicture, 1, aStru[ nE, 3 ]-aStru[ nE, 4 ] - 1 ) + '.' + Replicate( '9', aStru[ nE, 4 ] ) EndIf cPicture := "@K " + cPicture ElseIf cType $ "^+" cPicture := Replicate( '9', 10 ) EndIf If nSize == Nil nSize := aStru[ nE, 3 ] nDec := aStru[ nE, 4 ] hFont := iif( ::hFont != Nil, ::hFont, 0 ) hFontH := iif( ::hFontHead != Nil, ::hFontHead, ::hFont ) If cType == "C" cData := PadR( Trim( cData ), nSize, "B" ) nSize := GetTextWidth( 0, cData, hFont ) ElseIf cType == "N" cData := StrZero( cData, nSize, nDec ) nSize := GetTextWidth( 0, cData, hFont ) ElseIf cType == "D" cData := cValToChar( iif( Empty( cData ), Date(), cData ) ) nSize := Int( GetTextWidth( 0, cData + "BB", hFont ) ) + iif( lEditable, 30, 0 ) ElseIf cType == "M" nSize := iif( ::nMemoWV == Nil, 200, ::nMemoWV ) ElseIf cType $ "=@T" nSize := GetTextWidth( 0, Replicate( "9", 24 ), hFont ) ElseIf cType $ "^+" nSize := GetTextWidth( 0, Replicate( "9", 10 ), hFont ) Else cData := cValToChar( cData ) nSize := GetTextWidth( 0, cData, hFont ) EndIf nSize := Max( GetTextWidth( 0, Replicate( "B", Len( cHeading ) + 1 ), hFontH ), nSize ) nSize += iif( ! Empty( cOrder ), 14, 0 ) ElseIf ValType( ::aColSizes ) == "A" .and. ! Empty( ::aColSizes ) .and. n <= Len( ::aColSizes ) nSize := ::aColSizes[ n ] EndIf If ValType( ::aColSizes ) == "A" .and. n <= Len( ::aColSizes ) .and. Empty( ::aColSizes[ n ] ) ::aColSizes[ n ] := nSize EndIf If ValType( ::aFormatPic ) == "A" .and. ! Empty( ::aFormatPic ) .and. n <= Len( ::aFormatPic ) cPicture := ::aFormatPic[ n ] EndIf If HB_ISCHAR( cHead ) cHeading := cHead EndIf cBlock := 'FieldWBlock("' + aStru[ nE, 1 ] + '",Select("' + cAlias + '"))' ::AddColumn( TSColumn():New( cHeading, FieldWBlock( aStru[ nE, 1 ], Select( cAlias ) ),cPicture, ; { ::nClrText, ::nClrPane }, { nAlign, DT_CENTER }, nSize,, lEditable,,, cOrder,,,, ; 5,,,, Self, cBlock ) ) cName := ( cAlias )->( FieldName( nE ) ) ATail( ::aColumns ):cData := cAlias + "->" + FieldName( nE ) ATail( ::aColumns ):cArea := cAlias // 06.08.2019 ATail( ::aColumns ):cField := ( cAlias )->( FieldName( nE ) ) // 08.06.2018 ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ] // 18.07.2018 ATail( ::aColumns ):nFieldLen := aStru[ nE, 3 ] // 18.07.2018 ATail( ::aColumns ):nFieldDec := aStru[ nE, 4 ] // 18.07.2018 If HB_ISARRAY( aNameSel ) .and. Len( aNameSel ) > 0 .and. n <= Len( aNameSel ) If HB_ISCHAR( aNameSel[ n ] ) .and. ! Empty( aNameSel[ n ] ) cName := aNameSel[ n ] EndIf EndIf ATail( ::aColumns ):cName := cName If cType == "L" ATail( ::aColumns ):lCheckBox := .T. EndIf If ! Empty( cOrder ) ATail( ::aColumns ):lIndexCol := .T. EndIf Next If ::nLen == 0 cAlias := ::cAlias ::nLen := iif( ::bLogicLen == Nil, Eval( ::bLogicLen := {||( cAlias )->( LastRec() ) } ), Eval( ::bLogicLen ) ) EndIf Return Self [/pre]

Haz: gfilatov2002 пишет: Привожу полный текст исправленного метода для проверки: Все отлично единственное под сомнением это [ ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ]

SergKis: Haz пишет единственное под сомнением это [ ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ] Это не должно вызывать сомнения, т.к. это для customer использования, т.е. привязка к реальному типу поля Сомнения вызывают Valtype(от полей ^+) они дадут "N" ((возможно еще есть какие варианты, не помню) и это надо учитывать тут [pre2] If cType == "C" cPicture := "@K " + Replicate( 'X', aStru[ nE, 3 ] ) ElseIf cType == "N" .and. aStru[ nE, 2 ] $ "^+" cPicture := Replicate( '9', 10 ) ElseIf cType == "N" cPicture := Replicate( '9', aStru[ nE, 3 ] ) If aStru[ nE, 4 ] > 0 cPicture := SubStr( cPicture, 1, aStru[ nE, 3 ]-aStru[ nE, 4 ] - 1 ) + '.' + Replicate( '9', aStru[ nE, 4 ] ) EndIf cPicture := "@K " + cPicture EndIf [/pre2]



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