2? names of headings of columns in DCBROWSECOL

This forum is for eXpress++ general support.
Post Reply
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

2? names of headings of columns in DCBROWSECOL

#1 Post by Eugene Lutsenko »

Dear visitors of a forum!

I had two questions of names of headings of columns in DCBROWSECOL:
1 whether. It is possible to do headings of columns with transfers as was in CLIPPER (";")?
2 whether. It is possible to have the text in headings vertically?

And still:), whether it is possible to replace the image of zero values, for example, blank or in general to represent nothing, that is zero values of fields not to represent?

User avatar
rdonnay
Site Admin
Posts: 4813
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: 2? names of headings of columns in DCBROWSECOL

#2 Post by rdonnay »

The answer to all of your questions is YES.
It is possible to do headings of columns with transfers as was in CLIPPER (";")?
Use the HEADLINES clause of @ .. DCBROWSE to determine the number of heading lines.
Then use semicolons in your header text to divide the text.
whether. It is possible to have the text in headings vertically?
This is a strange request but it is possible. For example if you have headings that are 7 characters then you would want to use HEADLINES 7 in your @ .. DCBROWSE command and add a semicolon after each character in the heading.
whether it is possible to replace the image of zero values, for example, blank or in general to represent nothing, that is zero values of fields not to represent?
Use a custom code block for DCBROWSECOL. Example:

Code: Select all

DCBROWSECOL DATA {|x|x:=MYFILE->numfield,IIF(Empty(x),'',Str(x,6))}
The eXpress train is coming - and it has more cars.

User avatar
Auge_Ohr
Posts: 1428
Joined: Wed Feb 24, 2010 3:44 pm

Re: 2? names of headings of columns in DCBROWSECOL

#3 Post by Auge_Ohr »

Eugene Lutsenko wrote:2 whether. It is possible to have the text in headings vertically?
"just" vertical like Roger say or rotate it 45° ?

you can do almost everything with Ownerdraw (CustomDrawCell)

Code: Select all

**************************************
CLASS XbpBrowseVHeading FROM XbpBrowse
**************************************
PROTECTED:
   VAR nTextYSize

EXPORTED:
   VAR aSAttrs
   VAR nHeadingHeight
   VAR nHeadingAlign

   INLINE METHOD destroy
   *********************
      ::XbpBrowse:destroy()
      ::nTextYSize:= ::aSAttrs:= ::nHeadingHeight:= ::nHeadingAlign:= nil
   RETURN self

   INLINE METHOD init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   *****************************************************************
      ::XbpBrowse:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
      ::aSAttrs                := Array( GRA_AS_COUNT )
*     ::aSAttrs[ GRA_AS_ANGLE ]:= { 0, 1 }
      ::aSAttrs[ GRA_AS_ANGLE ]:= NIL
      ::aSAttrs[ GRA_AS_COLOR ]:= XBPSYSCLR_WINDOWSTATICTEXT
      ::nHeadingHeight         := 110
      ::nHeadingAlign          := XBPALIGN_LEFT
   RETURN self

   INLINE METHOD AddColumn( obCol, nWidth, xHeading, xFooting, nType )
   *******************************************************************
   LOCAL aPP, oColumn

      IF ValType( obCol ) = 'O'
         oColumn:= obCol
      ELSE
         aPP:= {}
         IF nWidth   <> nil ; Aadd( aPP, { XBP_PP_COL_DA_CHARWIDTH, nWidth } ) ; ENDIF
         IF xHeading <> nil ; Aadd( aPP, { XBP_PP_COL_HA_CAPTION, xHeading } ) ; ENDIF
         IF xFooting <> nil ; Aadd( aPP, { XBP_PP_COL_FA_CAPTION, xFooting } ) ; ENDIF

         Aadd( aPP, { XBP_PP_COL_HA_HEIGHT, ::nHeadingHeight } )

         oColumn:= XbpColumn():new( self,,,, aPP )

         IF nType <> nil
            oColumn:type:= nType
         ENDIF
         oColumn:datalink := obCol
      ENDIF
      oColumn:drawMode:= XBP_DRAW_OWNER

   RETURN ::XbpBrowse:AddColumn( oColumn )

   INLINE METHOD CustomDrawCell( oPS, aInfo )
   ******************************************
   LOCAL xData, aRect

      IF aInfo[ XBP_DRAWINFO_AREA ] = aInfo[ XBP_DRAWINFO_COLUMN ]:heading
         xData:= aInfo[ XBP_DRAWINFO_AREA ]:getCell( 1 )

         IF valType( xData ) = 'C'

            IF ::aSAttrs[ GRA_AS_ANGLE ] = NIL
               ::aSAttrs[ GRA_AS_ANGLE ]:= { aInfo[ XBP_DRAWINFO_RECT, 3 ] ,;
                                             aInfo[ XBP_DRAWINFO_RECT, 4 ] }
            ENDIF

            oPS:setAttrString( ::aSAttrs )

            IF ::nHeadingAlign = XBPALIGN_HCENTER
               IF ::nTextYSize = nil
                  aRect:= GraQueryTextBox( oPS, xData )
                  ::nTextYSize:= aRect[ 3, 2 ] - aRect[ 2, 1 ]
               ENDIF
               GraCaptionStr( oPS, { Int( ( aInfo[ XBP_DRAWINFO_RECT, 1 ] + aInfo[ XBP_DRAWINFO_RECT, 3 ] - ::nTextYSize ) / 2 ), ;
                                     aInfo[ XBP_DRAWINFO_RECT, 2 ] }, { aInfo[ XBP_DRAWINFO_RECT, 4 ], aInfo[ XBP_DRAWINFO_RECT, 4 ] }, ;
                                     xData, XBPALIGN_LEFT + XBPALIGN_BOTTOM )
            ELSE // IF XBPALIGN_LEFT
               GraCaptionStr( oPS, { aInfo[ XBP_DRAWINFO_RECT, 1 ], aInfo[ XBP_DRAWINFO_RECT, 2 ] }, { aInfo[ XBP_DRAWINFO_RECT, 4 ], ;
                                     aInfo[ XBP_DRAWINFO_RECT, 4 ] }, xData, XBPALIGN_LEFT + XBPALIGN_BOTTOM )
           ENDIF

            RETURN .F.
         ENDIF
      ENDIF
   RETURN .T.
ENDCLASS
greetings by OHR
Jimmy

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: 2? names of headings of columns in DCBROWSECOL

#4 Post by Eugene Lutsenko »

Roger!
Thank you very much! Everything very well turned out:

Code: Select all

DCSETPARENT TO

@ 5, 0 DCBROWSE oBrowGrSc ALIAS 'Rsp_it' SIZE 132,22 ;
       PRESENTATION DC_BrowPres() ;           // Только просмотр БД
       NOSOFTTRACK ;
       HEADLINES 3 ;                          // Кол-во строк в заголовке (перенос строки - ";")
       SCOPE ;
       ITEMMARKED bItems

// Сделать MAX - красным, MIN - синим

DCSETPARENT oBrowGrSc
DCBROWSECOL DATA {|x|x:=Rsp_it->Kod_Obj,  IIF(Empty(x),'',Str(x,5))} HEADER "Код"                       PARENT oBrowse WIDTH 5
DCBROWSECOL FIELD Rsp_it->Name_Obj                                   HEADER "Наим.объекта расп.выборки" PARENT oBrowse WIDTH 25
DCBROWSECOL DATA {|x|x:=Rsp_it->Max_Value,IIF(Empty(x),'',Str(x,5))} HEADER "MAX;уров.;сходства"        PARENT oBrowse WIDTH 7 COLOR GRA_CLR_RED
DCBROWSECOL DATA {|x|x:=Rsp_it->KodC_MaxV,IIF(Empty(x),'',Str(x,5))} HEADER "Класс"                     PARENT oBrowse WIDTH 5 COLOR GRA_CLR_RED
DCBROWSECOL DATA {|x|x:=Rsp_it->Min_Value,IIF(Empty(x),'',Str(x,5))} HEADER "MIN;уров.;сходства"        PARENT oBrowse WIDTH 7 COLOR GRA_CLR_BLUE
DCBROWSECOL DATA {|x|x:=Rsp_it->KodC_MinV,IIF(Empty(x),'',Str(x,5))} HEADER "Класс"                     PARENT oBrowse WIDTH 5 COLOR GRA_CLR_BLUE
DCBROWSECOL DATA {|x|x:=Rsp_it->Dost,     IIF(Empty(x),'',Str(x,5))} HEADER "Досто-;верность"           PARENT oBrowse WIDTH 7 
Last edited by Eugene Lutsenko on Sun Aug 19, 2012 11:49 am, edited 1 time in total.

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: 2? names of headings of columns in DCBROWSECOL

#5 Post by Eugene Lutsenko »

Auge_Ohr wrote:
Eugene Lutsenko wrote:2 whether. It is possible to have the text in headings vertically?
"just" vertical like Roger say or rotate it 45° ?

you can do almost everything with Ownerdraw (CustomDrawCell)

Code: Select all

**************************************
CLASS XbpBrowseVHeading FROM XbpBrowse
**************************************
PROTECTED:
   VAR nTextYSize

EXPORTED:
   VAR aSAttrs
   VAR nHeadingHeight
   VAR nHeadingAlign

   INLINE METHOD destroy
   *********************
      ::XbpBrowse:destroy()
      ::nTextYSize:= ::aSAttrs:= ::nHeadingHeight:= ::nHeadingAlign:= nil
   RETURN self

   INLINE METHOD init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   *****************************************************************
      ::XbpBrowse:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
      ::aSAttrs                := Array( GRA_AS_COUNT )
*     ::aSAttrs[ GRA_AS_ANGLE ]:= { 0, 1 }
      ::aSAttrs[ GRA_AS_ANGLE ]:= NIL
      ::aSAttrs[ GRA_AS_COLOR ]:= XBPSYSCLR_WINDOWSTATICTEXT
      ::nHeadingHeight         := 110
      ::nHeadingAlign          := XBPALIGN_LEFT
   RETURN self

   INLINE METHOD AddColumn( obCol, nWidth, xHeading, xFooting, nType )
   *******************************************************************
   LOCAL aPP, oColumn

      IF ValType( obCol ) = 'O'
         oColumn:= obCol
      ELSE
         aPP:= {}
         IF nWidth   <> nil ; Aadd( aPP, { XBP_PP_COL_DA_CHARWIDTH, nWidth } ) ; ENDIF
         IF xHeading <> nil ; Aadd( aPP, { XBP_PP_COL_HA_CAPTION, xHeading } ) ; ENDIF
         IF xFooting <> nil ; Aadd( aPP, { XBP_PP_COL_FA_CAPTION, xFooting } ) ; ENDIF

         Aadd( aPP, { XBP_PP_COL_HA_HEIGHT, ::nHeadingHeight } )

         oColumn:= XbpColumn():new( self,,,, aPP )

         IF nType <> nil
            oColumn:type:= nType
         ENDIF
         oColumn:datalink := obCol
      ENDIF
      oColumn:drawMode:= XBP_DRAW_OWNER

   RETURN ::XbpBrowse:AddColumn( oColumn )

   INLINE METHOD CustomDrawCell( oPS, aInfo )
   ******************************************
   LOCAL xData, aRect

      IF aInfo[ XBP_DRAWINFO_AREA ] = aInfo[ XBP_DRAWINFO_COLUMN ]:heading
         xData:= aInfo[ XBP_DRAWINFO_AREA ]:getCell( 1 )

         IF valType( xData ) = 'C'

            IF ::aSAttrs[ GRA_AS_ANGLE ] = NIL
               ::aSAttrs[ GRA_AS_ANGLE ]:= { aInfo[ XBP_DRAWINFO_RECT, 3 ] ,;
                                             aInfo[ XBP_DRAWINFO_RECT, 4 ] }
            ENDIF

            oPS:setAttrString( ::aSAttrs )

            IF ::nHeadingAlign = XBPALIGN_HCENTER
               IF ::nTextYSize = nil
                  aRect:= GraQueryTextBox( oPS, xData )
                  ::nTextYSize:= aRect[ 3, 2 ] - aRect[ 2, 1 ]
               ENDIF
               GraCaptionStr( oPS, { Int( ( aInfo[ XBP_DRAWINFO_RECT, 1 ] + aInfo[ XBP_DRAWINFO_RECT, 3 ] - ::nTextYSize ) / 2 ), ;
                                     aInfo[ XBP_DRAWINFO_RECT, 2 ] }, { aInfo[ XBP_DRAWINFO_RECT, 4 ], aInfo[ XBP_DRAWINFO_RECT, 4 ] }, ;
                                     xData, XBPALIGN_LEFT + XBPALIGN_BOTTOM )
            ELSE // IF XBPALIGN_LEFT
               GraCaptionStr( oPS, { aInfo[ XBP_DRAWINFO_RECT, 1 ], aInfo[ XBP_DRAWINFO_RECT, 2 ] }, { aInfo[ XBP_DRAWINFO_RECT, 4 ], ;
                                     aInfo[ XBP_DRAWINFO_RECT, 4 ] }, xData, XBPALIGN_LEFT + XBPALIGN_BOTTOM )
           ENDIF

            RETURN .F.
         ENDIF
      ENDIF
   RETURN .T.
ENDCLASS
Roger very much helped me, having prompted me practically everything that it is necessary to me. But generally I meant text rotation in headings, as in Word and Excel. The matter is that I have databases in which there are a lot of columns with long headings and I had a thought: "And suddenly and it is possible!". And as in practice to use the class given by you. You couldn't give an example?

User avatar
Auge_Ohr
Posts: 1428
Joined: Wed Feb 24, 2010 3:44 pm

Re: 2? names of headings of columns in DCBROWSECOL

#6 Post by Auge_Ohr »

Eugene Lutsenko wrote:You couldn't give an example?
while

Code: Select all

CLASS XbpBrowseVHeading FROM XbpBrowse
it is just a XbpBrowse()
use Help file Sample and replace

Code: Select all

FUNCTION GuiBrowseDB( oParent, aPos, aSize ) 
LOCAL oBrowse 

      oBrowse := XbpBrowse():new( oParent,, aPos, aSize ):create() 

will be

      oBrowse := XbpBrowseVHeading():new( oParent,, aPos, aSize ):create()
thats all
greetings by OHR
Jimmy


User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: 2? names of headings of columns in DCBROWSECOL

#8 Post by Eugene Lutsenko »

I tried three options of preparation of the columns given for headings which I give below. I most of all liked the third option and I use it.

Code: Select all

//Options of preparation of headings of columns with transfers between lines
SELECT Classes  //A database with names of headings of columns without transfers
M_NumVar = 3    //Option of formation of heading
DO CASE
   CASE M_NumVar = 1    //1. To "cut" the name of classes on slices on the DL symbols and to write down in aHeadName through ";"

        DL = 8                     //Width of heading in number of symbols
        Max_HeadLines = -999999999
        FOR j=1 TO N_Cls
            DBGOTO(j)
            M_NameCls = ALLTRIM(Name_cls)
            aHeadName[2+j] = ALLTRIM(STR(j,15))+".;"
            DO WHILE LEN(M_NameCls) > 0
               aHeadName[2+j] = aHeadName[2+j] + SUBSTR(M_NameCls,1,DL) + ";"
               M_NameCls = SUBSTR(M_NameCls,DL+1)
            ENDDO
            Max_HeadLines = 1+MAX(Max_HeadLines, NUMAT(";", aHeadName[2+j]))   //Definition of the maximum quantity of lines in heading
        NEXT

   CASE M_NumVar = 2    //2. "Transfers instead of gaps"

        Max_HeadLines = -999999999
        FOR j=1 TO N_Cls
            DBGOTO(j)
            aHeadName[2+j] = ALLTRIM(STR(j,15))+". "+STRTRAN(ALLTRIM((Name_cls))," ",";")
            Max_HeadLines = 1+MAX(Max_HeadLines, NUMAT(";", aHeadName[2+j]))   //Definition of the maximum quantity of lines in heading
        NEXT

   CASE M_NumVar = 3    //3. To fill lines of headings with the whole words until the maximum width of heading is exceeded

        DL = 8                     //Width of heading in number of symbols
        Max_HeadLines = -999999999
        FOR j=1 TO N_Cls

            DBGOTO(j)
            M_NameCls = ALLTRIM(Name_cls)

            aHeadString := {}   //Massif of lines of the heading j-y of a column

            AADD(aHeadString, ALLTRIM(STR(j,15))+". ")   //Class code
            
            *** Начало цикла по словам
            FOR w=1 TO NUMTOKEN(M_NameCls," ")           //A divider between words - a gap
                M_Word = UPPER(TOKEN(M_NameCls," ",w))
                IF LEN(aHeadString[LEN(aHeadString)]+" "+M_Word) <= DL     
                   //If after word addition to a line of heading its width less set, 
                   //that to add a word by same line of heading
                   aHeadString[LEN(aHeadString)] = aHeadString[LEN(aHeadString)]+" "+M_Word
                ELSE
                   //If after word addition to a line of heading its width more set, 
                   //that to do a new line (";") and to it to add a word
                   AADD(aHeadString, ";"+M_Word)
                ENDIF
            NEXT
            //To copy lines of heading in an array of names of columns
            aHeadName[2+j] = ""
            FOR s=1 TO LEN(aHeadString)
                aHeadName[2+j] = aHeadName[2+j] + aHeadString[s]
            NEXT
            Max_HeadLines = LEN(aHeadString)   //Definition of the maximum quantity of lines in heading
        NEXT

ENDCASE

Post Reply