Автор | Сообщение |
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: 3364
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.09.20 13:56. Заголовок: gfilatov2002 пишет ..
gfilatov2002 пишет цитата: | если у Вас есть другое предложение, как это исправить, то я его с удовольствием использую... |
| Пока не разобрался. В массивах не исп. oCol:bPrevEdit и :bPostEdit до сих пор. Но добавил такое 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 } ... Хотел в bPrevEdit и в bPostEdit добавить обработку строки для кол. 5, но блоки не вызвались и первое что увидел блокировка вызова bPrevEdit
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1783
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.09.20 14:11. Заголовок: SergKis пишет: блок..
SergKis пишет: цитата: | блоки не вызвались и первое что увидел блокировка вызова bPrevEdit |
| Проверил еще раз без этой правки цитата: | ElseIf nKey != VK_RETURN // GF 15-10-2015 |
| блок bPrevEdit вызывается ДВАЖДЫ
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3365
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.09.20 15:05. Заголовок: gfilatov2002 пишет б..
gfilatov2002 пишет цитата: | блок bPrevEdit вызывается ДВАЖДЫ |
| Виноват, не поставил команду в самом начале #define _HMG_OUTLOG потому вывода из блока кода по ? ... и не было блоки кода сработали нормально
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3366
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.09.20 13:57. Заголовок: gfilatov2002 Предла..
gfilatov2002 Предлагаю такую работу с memo полями и полями "C" но длинными, не полностью входящие в показ колонки, т.е. поле длинной 200, а показ в 50 символов. Изменения 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() ... Пример тут https://TransFiles.ru/vw1pc Открываем файл userlog.dbf в режимах Edit - Yes или No, Смотрим последнюю запись в файле и две последних колонки при нажатии Enter
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3367
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.09.20 14:00. Заголовок: PS В h_tbrowse.prg д..
PS В h_tbrowse.prg добавить #define EM_SETREADONLY 207
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3368
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.09.20 14:08. Заголовок: PS2 в примере это ст..
PS2 в примере это строки Скрытый текст
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 ...
|
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1784
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.09.20 15:04. Заголовок: SergKis пишет: Пред..
SergKis пишет: цитата: | Предлагаю такую работу с memo полями |
| Все изменения приняты. SergKis пишет: цитата: | Открываем файл userlog.dbf в режимах Edit - Yes или No, Смотрим последнюю запись в файле и две последних колонки при нажатии Enter |
| Пример проверил, работает. Благодарю за помощь
| |
|
Andrey
|
| постоянный участник
|
Пост N: 6815
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.09.20 17:15. Заголовок: SergKis пишет: Откр..
SergKis пишет: цитата: | Открываем файл userlog.dbf в режимах Edit - Yes или No, Смотрим последнюю запись в файле и две последних колонки при нажатии Enter |
| А в карточке редактировать тоже нужно !
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3369
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.09.20 19:49. Заголовок: Andrey пишет А в кар..
Andrey пишет цитата: | А в карточке редактировать тоже нужно ! |
| К тсб, редактирование в карточке полей memo и "длинных" полей "C", не имеет отношения. Надо сделать отдельное MdiChild окно для редактирования с контролом EDITBOX. Изменения выше относятся именно к работе на тсб таблице
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1785
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.09.20 10:25. Заголовок: Всем кому это интересно
Выпустил 3-е обновление сборки 20.08 Что нового (на языке оригинала): Скрытый текст
* 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)
| Благодарю всех, кто поддерживал и поддерживает этот проект "на плаву"
| |
|
Andrey
|
| постоянный участник
|
Пост N: 6823
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.09.20 23:05. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Выпустил 3-е обновление сборки 20.08 |
| Что то пример SAMPLES\Advanced\FILEICON не собирается... 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 Может из за того что сижу на BCC 5.5.1 ?
| |
|
|
gfilatov2002
|
| moderator
|
Пост N: 1786
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.09.20 09:57. Заголовок: Выпустил 4-е обновле..
Выпустил 4-е обновление сборки 20.08 Что нового (на языке оригинала): Скрытый текст
* 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)
|
| |
|
Haz
|
| |
Пост N: 1600
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.09.20 14:25. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Выпустил 4-е обновление сборки 20.08 Что нового (на языке оригинала): |
| На языке оригинала язык не поворачивается сказать Давно не обновлял, в начале недели обновил на одну из последних сборок и началось .... Проблема в слетевших ::cPicture по умолчанию , все строковые колонки во всех TSB были обрезаны и если пользователь их начал редактировать - резались данные. Для начала в спешке прописал ::cPicture по всему коду, где не указано явно. Затем выдохнул и принялся изучать причину, а она простая: у меня базы в ADT формате (ADS), этот формат проходит проверку IsDbf(), но типы символьных полей вариативны ( не тупо равно "C"). В новых сборках пикча назначается в ::LoadFields() как ... aStru := ( cAlias )->( DbStruct() ) ... cType := aStru[ nE, 2 ] If cType == "C" cPicture := "@K " + Replicate( 'X', aStru[ nE, 3 ] ) ElseIf cType == "N" ... и поскольку в качестве типа символьного поля я использую "CICHARACTER" , а типа "C" в ADS просто нет, то поимел танцы. почему бы при формировании пикчи вместо cType := aStru[ nE, 2 ] не использовать значение из поля а не из структуры примерно так cType := ValType( (cAlias)->&(aStru[ nE, 1 ])) или cType := ValType( (cAlias)->(FieldGet(nE)) ?
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3382
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.09.20 14:49. Заголовок: Haz пишет В новых сб..
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
|
| moderator
|
Пост N: 1787
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.09.20 14:52. Заголовок: Haz пишет: почему б..
Haz пишет: цитата: | почему бы при формировании пикчи вместо cType := aStru[ nE, 2 ] не использовать значение из поля а не из структуры примерно так cType := ValType( (cAlias)->&(aStru[ nE, 1 ])) или cType := ValType( (cAlias)->(FieldGet(nE)) ? |
| Благодарю за предложение Поправил, конечно Обидно, что именно так сделано в методе :LoadRelated(), а в методе :LoadFields() тип берется из массива aStru у оригинального автора библиотеки
| |
|
Haz
|
| |
Пост N: 1601
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.09.20 15:27. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Там ниже на пару строк в исходнике тоже из структуры, может и там поправить ? Странно что до последних обновлений все работало корректно, если это от автора изменения .
| |
|
Haz
|
| |
Пост N: 1602
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.09.20 15:27. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Там ниже на пару строк в исходнике тоже из структуры, может и там поправить ? Странно что до последних обновлений все работало корректно, если это от автора изменения .
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1788
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.09.20 16:50. Заголовок: Haz пишет: может и ..
Haz пишет: Привожу полный текст исправленного метода для проверки: * ============================================================================ * 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
| |
|
Haz
|
| |
Пост N: 1603
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.09.20 17:58. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Привожу полный текст исправленного метода для проверки: |
| Все отлично единственное под сомнением это [ ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ]
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3386
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.09.20 21:33. Заголовок: Haz пишет единственн..
Haz пишет цитата: | единственное под сомнением это [ ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ] |
| Это не должно вызывать сомнения, т.к. это для customer использования, т.е. привязка к реальному типу поля Сомнения вызывают Valtype(от полей ^+) они дадут "N" ((возможно еще есть какие варианты, не помню) и это надо учитывать тут 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
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|