ERASE WINDOW command does not delete the graph titles

Creative ideas/suggestions for HMG

Moderator: Rathinagiri

User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

ERASE WINDOW command does not delete the graph titles

Post by andyglezl »

Hola
El comando ERASE WINDOW no borra los titulos de la grafica, creo que ya se habia dado una solucion
pero en esta version (3.4) sigue sin aplicarse. Quizas ya este implementada en la 3.41 ?
---------------------------------------------------------------------------------------------------
Hello
The ERASE WINDOW command does not delete the graph titles, I think they had already given a solution
but in this version (3.4) remains unimplemented. It may already be implemented in the 3.41?
EraseWin01.png
EraseWin01.png (72.63 KiB) Viewed 4951 times
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
esgici
Posts: 4543
Joined: Wed Jul 30, 2008 9:17 pm
DBs Used: DBF
Location: iskenderun / Turkiye
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by esgici »

Viva INTERNATIONAL HMG :D
EduardoLuis
Posts: 682
Joined: Tue Jun 04, 2013 6:33 pm
Location: Argentina

Re: ERASE WINDOW command does not delete the graph titles

Post by EduardoLuis »

Esgici you are "HMG-ENCICLOPEDIA".-
Thanks for share with all of us your knowledge.-
With regards.
Eduardo
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by andyglezl »

Thanks Esgici that was the solution.
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
serge_girard
Posts: 3161
Joined: Sun Nov 25, 2012 2:44 pm
DBs Used: 1 MySQL - MariaDB
2 DBF
Location: Belgium
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by serge_girard »

He sure is a "HMG-ENCICLOPEDIA" !

Serge
There's nothing you can do that can't be done...
User avatar
mol
Posts: 3718
Joined: Thu Sep 11, 2008 5:31 am
Location: Myszków, Poland
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by mol »

serge_girard wrote:He sure is a "HMG-ENCICLOPEDIA" !

Serge
+1
User avatar
Rathinagiri
Posts: 5471
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by Rathinagiri »

IMHO, drawing graph on the window itself is an outdated HMG graphics functionality.

The permanent solution for drawing graph is using the ultimate and versatile Bos Taurus library.

I have tried to convert the existing draw graph function ( only BAR type and not 3D) using BT library and saved the graph in a bitmap file. That bitmap can be used to show or print.

May be we can extend this to all other types and we have a NEW graph functionality to save the graph easily to a bitmap in HMG.

Code: Select all

#include <hmg.ch>

Function Main


   define window graph at 0, 0 width 1000 height 700 main 
      define button ok
         row 10
         col 10
         width 80
         caption 'Draw'
         action drawgraph()
      end button   
      define image grapharea
         row 50
         col 50
         width 800
         height 600
      end image
   end window
   graph.center
   graph.activate
Return


function drawgraph
   local cImage := 'graph.bmp'
   local nImageWidth := 800
   local nImageHeight := 600
   local cTitle := 'Sample Graph'
   local aYValues := {"Jan","Feb","Mar","Apr","May"}
   local aData := { {14280,20420,12870,25347, 7640},;
           { 8350,10315,15870, 5347,12340},;
           {12345, -8945,10560,15600,17610} }
   local nBarDepth := 15
   local nBarWidth := 15   
   local nHValues := 5
   local l3D := .f.
   local lGrid := .t.
   local lXGrid := .t.
   local lYGrid := .t.
   local lXVal := .t.
   local lYVal := .t.
   local nGraphType := BARS
   local lViewVal := .t.
   local lLegends := .t.
   local cPicture := '99,999.99'
   local aSeries := {"Serie 1","Serie 2","Serie 3"}
   local aColors := { {128,128,255}, {255,102, 10}, {55,201, 48} }
   local lNoBorder := .f.
   local nLegendWidth := 50

   graphsave( cImage, nImageWidth, nImageHeight, aData,  cTitle, aYValues, nBarDepth, nBarWidth, nil, nHValues, l3d, lGrid, lXGrid, lYGrid, ;
            lXVal, lYVal, lLegends, aSeries, aColors, nGraphType, lViewVal, cPicture, nLegendWidth ,lNoBorder ) 
   
   graph.grapharea.picture := 'graph.bmp'
   return nil
   
function graphsave( cImageFileName, nWidth, nHeight, aData, cTitle, aYVals, nBarD, nWideB, nSep, nXRanges, ;
	              l3D, lGrid, lxGrid, lyGrid, lxVal, lyVal, lLegends, aSeries, aColors, nType, lViewVal, cPicture , nLegendWindth , lNoborder )
                 
   LOCAL nI, nJ, nPos, nMax, nMin, nMaxBar, nDeep
   LOCAL nRange, nResH, nResV,  nWide, aPoint, cName
   LOCAL nXMax, nXMin, nHigh, nRel, nZero, nRPos, nRNeg
   local hBitMap, hDC, BTStruct
   local nTop := 0
   local nLeft := 0
   local nBottom := nHeight
   local nRight := nWidth

	DEFAULT cTitle   := ""
	DEFAULT nSep     := 0
	DEFAULT cPicture := "999,999.99"
	DEFAULT nLegendWindth := 50
   private nPenWidth := 0.25

	If ( HMG_LEN (aSeries) != HMG_LEN ( aData ) ) .or. ;
		( HMG_LEN ( aSeries ) != HMG_LEN ( aColors ) ) 
		MsgHMGError("DRAW GRAPH: 'Series' / 'SerieNames' / 'Colors' arrays size mismatch. Program terminated", "HMG Error" )
	EndIf

   hBitMap := BT_BitmapCreateNew ( nWidth, nHeight, { 255, 255, 255 } )
   hDC := BT_CreateDC( hBitMap, BT_HDC_BITMAP, @BTStruct )

   IF lGrid
      lxGrid := lyGrid := .T.
   ENDIF
   
   IF nBottom <> NIL .AND. nRight <> NIL
      nHeight := nBottom - nTop / 2
      nWidth  := nRight - nLeft / 2
      nBottom -= IF( lyVal, 42, 32)
      nRight  -= IF( lLegends, 32 + nLegendWindth , 32 )
   ENDIF
   nTop    += 1 + IF( Empty( cTitle ), 30, 44 )             // Top gap
   nLeft   += 1 + IF( lxVal, 80 + nBarD, 30 + nBarD )     // LEFT
   DEFAULT nBottom := nHeight - 2 - IF( lyVal, 40, 30 )    // Bottom
   DEFAULT nRight  := nWidth - 2 - IF( lLegends, 30 + nLegendWindth , 30 ) // RIGHT

   l3D     := IF( nType == POINTS, .F., l3D )
   nDeep   := IF( l3D, nBarD, 1 )
   nMaxBar := nBottom - nTop - nDeep - 5
   nResH   := nResV := 1
   nWide   := ( nRight - nLeft )* nResH / ( nMax( aData ) + 1 ) * nResH

   // Graph area
   //
   IF ! lNoborder
	   DrawWindowBoxInBitMap( hDC, Max( 1, nTop - 44 ), Max( 1, nLeft - 80 - nBarD ), nHeight - 1, nWidth - 1 )
   ENDIF	

   // Back area
   //
   IF l3D
      drawrectinbitmap( hDC, nTop+1, nLeft, nBottom - nDeep, nRight, { 255, 255, 255 } )
   ELSE
      drawrectinbitmap( hDC, nTop-5, nLeft, nBottom, nRight, { 255, 255, 255 } )
   ENDIF

   IF l3D
         // Bottom area
         FOR nI := 1 TO nDeep+1
             DrawLineinbitmap( hDC, nBottom-nI, nLeft-nDeep+nI, nBottom-nI, nRight-nDeep+nI, { 255, 255, 255 } )
         NEXT nI

         // Lateral
         FOR nI := 1 TO nDeep
             DrawLineinbitmap( hDC, nTop+nI, nLeft-nI, nBottom-nDeep+nI, nLeft-nI, {192, 192, 192} )
         NEXT nI

         // Graph borders
         FOR nI := 1 TO nDeep+1
             DrawLineinbitmap( hDC, nBottom-nI     ,nLeft-nDeep+nI-1 ,nBottom-nI     ,nLeft-nDeep+nI  ,GRAY )
             DrawLineinbitmap( hDC, nBottom-nI     ,nRight-nDeep+nI-1,nBottom-nI     ,nRight-nDeep+nI ,BLACK )
             DrawLineinbitmap( hDC, nTop+nDeep-nI+1,nLeft-nDeep+nI-1 ,nTop+nDeep-nI+1,nLeft-nDeep+nI  ,BLACK )
             DrawLineinbitmap( hDC, nTop+nDeep-nI+1,nLeft-nDeep+nI-3 ,nTop+nDeep-nI+1,nLeft-nDeep+nI-2,BLACK )
         NEXT nI

         FOR nI=1 TO nDeep+2
             DrawLineinbitmap( hDC, nTop+nDeep-nI+1,nLeft-nDeep+nI-3,nTop+nDeep-nI+1,nLeft-nDeep+nI-2 ,BLACK )
             DrawLineinbitmap( hDC, nBottom+ 2-nI+1,nRight-nDeep+nI ,nBottom+ 2-nI+1,nRight-nDeep+nI-2,BLACK )
         NEXT nI

         DrawLineinbitmap( hDC, nTop         ,nLeft        ,nTop           ,nRight       ,BLACK )
         DrawLineinbitmap( hDC, nTop- 2      ,nLeft        ,nTop- 2        ,nRight+ 2    ,BLACK )
         DrawLineinbitmap( hDC, nTop         ,nLeft        ,nBottom-nDeep  ,nLeft        ,GRAY  )
         DrawLineinbitmap( hDC, nTop+nDeep   ,nLeft-nDeep  ,nBottom        ,nLeft-nDeep  ,BLACK )
         DrawLineinbitmap( hDC, nTop+nDeep   ,nLeft-nDeep-2,nBottom+ 2     ,nLeft-nDeep-2,BLACK )
         DrawLineinbitmap( hDC, nTop         ,nRight       ,nBottom-nDeep  ,nRight       ,BLACK )
         DrawLineinbitmap( hDC, nTop- 2      ,nRight+ 2    ,nBottom-nDeep+2,nRight+ 2    ,BLACK )
         DrawLineinbitmap( hDC, nBottom-nDeep,nLeft        ,nBottom-nDeep  ,nRight       ,GRAY  )
         DrawLineinbitmap( hDC, nBottom      ,nLeft-nDeep  ,nBottom        ,nRight-nDeep ,BLACK )
         DrawLineinbitmap( hDC, nBottom+ 2   ,nLeft-nDeep-2,nBottom+ 2     ,nRight-nDeep ,BLACK )
   ENDIF


   // Graph info
   //

   IF !Empty(cTitle)
      DrawTextInBitmap( hDC, nTop - 30 * nResV, nLeft, cTitle, 'Arial', 12, RED, 2 )
   ENDIF


   // Legends
   //
   IF lLegends
      nPos := nTop
      FOR nI := 1 TO HMG_LEN( aSeries )
         DrawBarinbitmap( hDC, nRight+(8*nResH), nPos+(9*nResV), 8*nResH, 7*nResV, l3D, 1, aColors[nI] )
         DrawTextInBitmap( hDC, nPos, nRight+(20*nResH), aSeries[nI], 'Arial', 8, BLACK, 0 )
         nPos += 18*nResV
      NEXT nI
   ENDIF

   // Max, Min values
   nMax := 0
   FOR nJ := 1 TO HMG_LEN(aSeries)
      FOR nI :=1 TO HMG_LEN(aData[nJ])
         nMax := Max( aData[nJ][nI], nMax )
      NEXT nI
   NEXT nJ
   nMin := 0
   FOR nJ := 1 TO HMG_LEN(aSeries)
      FOR nI :=1 TO HMG_LEN(aData[nJ])
         nMin := Min( aData[nJ][nI], nMin )
      NEXT nI
   NEXT nJ

   nXMax := IF( nMax > 0, DetMaxVal( nMax ), 0 )
   nXMin := IF( nMin < 0, DetMaxVal( nMin ), 0 )
   nHigh := nXMax + nXMin
   nMax  := Max( nXMax, nXMin )
   
   nRel  := ( nMaxBar / nHigh )
   nMaxBar := nMax * nRel



   nZero := nTop + (nMax*nRel) + nDeep + 5    // Zero pos
   IF l3D
      FOR nI := 1 TO nDeep+1
          DrawLineinbitmap( hDC, nZero-nI+1, nLeft-nDeep+nI   , nZero-nI+1, nRight-nDeep+nI, {192, 192, 192} )
      NEXT nI
      FOR nI := 1 TO nDeep+1
          DrawLineinbitmap( hDC, nZero-nI+1, nLeft-nDeep+nI-1 , nZero-nI+1, nLeft -nDeep+nI, GRAY )
          DrawLineinbitmap( hDC, nZero-nI+1, nRight-nDeep+nI-1, nZero-nI+1, nRight-nDeep+nI, BLACK )
      NEXT nI
      DrawLineinbitmap( hDC, nZero-nDeep, nLeft, nZero-nDeep, nRight, GRAY )
   ENDIF

   aPoint := Array( HMG_LEN( aSeries ), HMG_LEN( aData[1] ), 2 )
   nRange := nMax / nXRanges

   // xLabels
   nRPos := nRNeg := nZero - nDeep
   FOR nI := 0 TO nXRanges
      IF lxVal
         IF nRange*nI <= nXMax
            DrawTextInBitmap( hDC, nRPos, nLeft-nDeep-70, Transform(nRange*nI, cPicture), 'Arial', 8, BLUE )
         ENDIF
         IF nRange*(-nI) >= nXMin*(-1)
            DrawTextInBitmap( hDC, nRNeg, nLeft-nDeep-70, Transform(nRange*-nI, cPicture), 'Arial', 8, BLUE )
         ENDIF
      ENDIF

      IF lxGrid
         IF nRange*nI <= nXMax
            IF l3D
               FOR nJ := 0 TO nDeep + 1
                  DrawLineinbitmap( hDC, nRPos + nJ, nLeft - nJ - 1, nRPos + nJ, nLeft - nJ, BLACK )
               NEXT nJ
            ENDIF
            DrawLineinbitmap( hDC, nRPos, nLeft, nRPos, nRight, BLACK )
         ENDIF
         IF nRange*-nI >= nXMin*-1
            IF l3D
               FOR nJ := 0 TO nDeep + 1
                  DrawLineinbitmap( hDC, nRNeg + nJ, nLeft - nJ - 1, nRNeg + nJ, nLeft - nJ, BLACK )
               NEXT nJ
            ENDIF
            DrawLineinbitmap( hDC, nRNeg, nLeft, nRNeg, nRight, BLACK )
         ENDIF
      ENDIF
      nRPos -= ( nMaxBar / nXRanges )
      nRNeg += ( nMaxBar / nXRanges )
   NEXT nI

   IF lYGrid
      nPos:=IF(l3D, nTop, nTop-5 )
      nI  := nLeft + nWide
      FOR nJ := 1 TO nMax(aData)
         DrawlineinBitmap( hDC, nBottom-nDeep, nI, nPos, nI, {100,100,100} )
         DrawlineinBitmap( hDC, nBottom, nI-nDeep, nBottom-nDeep, nI, {100,100,100} )
         nI += nWide
      NEXT
   ENDIF

   DO WHILE .T.    // Bar adjust
      nPos = nLeft + ( nWide / 2 )
      nPos += ( nWide + nSep ) * ( HMG_LEN(aSeries) + 1 ) * HMG_LEN(aData[1])
      IF nPos > nRight
         nWide--
      ELSE
         EXIT
      ENDIF
   ENDDO

   nMin := nMax / nMaxBar

   nPos := nLeft + ( ( nWide + nSep ) / 2 )            // first point graph
   nRange := ( ( nWide + nSep ) * HMG_LEN(aSeries) ) / 2

   IF lyVal .AND. HMG_LEN( aYVals ) > 0                // Show yLabels
      nWideB  := ( nRight - nLeft ) / ( nMax(aData) + 1 )
      nI := nLeft + nWideB
      FOR nJ := 1 TO nMax(aData)
         cName := "yVal_Name_"+LTRIM(STR(nJ))
         DrawTextInBitmap( hDC, nBottom + 8, nI - nDeep - IF(l3D, 0, 8), aYVals[nJ], 'Arial', 8, BLUE )
         nI += nWideB
      NEXT
   ENDIF



   // Bars
   //
	
	IF nType == BARS
		if nMin <> 0
			nPos := nLeft + ( ( nWide + nSep ) / 2 )
			FOR nI=1 TO HMG_LEN(aData[1])
				FOR nJ=1 TO HMG_LEN(aSeries)
					DrawBarinbitmap( hDC, nPos, nZero, aData[nJ,nI] / nMin + nDeep, nWide, l3D, nDeep, aColors[nJ] )
					nPos += nWide+nSep
				NEXT nJ
				nPos += nWide+nSep
			NEXT nI
		endif
	ENDIF
   BT_BitmapSaveFile(hBitmap, cImageFileName )
   BT_DeleteDC( BTstruct )
   BT_BitmapRelease( hBitmap )
   

   && // Lines
   && //
   && IF nType == LINES
	&& if nMin <> 0
      && nWideB  := ( nRight - nLeft ) / ( nMax(aData) + 1 )
      && nPos := nLeft + nWideB
      && FOR nI := 1 TO HMG_LEN(aData[1])
         && FOR nJ=1 TO HMG_LEN(aSeries)
            && IF !l3D
               && DrawPoint( parent, nType, nPos, nZero, aData[nJ,nI] / nMin + nDeep, aColors[nJ] )
            && ENDIF
            && aPoint[nJ,nI,2] := nPos
            && aPoint[nJ,nI,1] := nZero - ( aData[nJ,nI] / nMin + nDeep )
         && NEXT nJ
         && nPos += nWideB
      && NEXT nI

      && FOR nI := 1 TO HMG_LEN(aData[1])-1
         && FOR nJ := 1 TO HMG_LEN(aSeries)
            && IF l3D
               && drawpolygon(parent,{{aPoint[nJ,nI,1],aPoint[nJ,nI,2]},{aPoint[nJ,nI+1,1],aPoint[nJ,nI+1,2]}, ;
                           && {aPoint[nJ,nI+1,1]-nDeep,aPoint[nJ,nI+1,2]+nDeep},{aPoint[nJ,nI,1]-nDeep,aPoint[nJ,nI,2]+nDeep}, ;
                           && {aPoint[nJ,nI,1],aPoint[nJ,nI,2]}},,,aColors[nJ])
            && ELSE
               && DrawLine(parent,aPoint[nJ,nI,1],aPoint[nJ,nI,2],aPoint[nJ,nI+1,1],aPoint[nJ,nI+1,2],aColors[nJ])
            && ENDIF
         && NEXT nI
      && NEXT nI

	&& endif
   && ENDIF

   && // Points
   && //
   && IF nType == POINTS
		&& if nMin <> 0
      && nWideB := ( nRight - nLeft ) / ( nMax(aData) + 1 )
      && nPos := nLeft + nWideB
      && FOR nI := 1 TO HMG_LEN(aData[1])
         && FOR nJ=1 TO HMG_LEN(aSeries)
            && DrawPoint( parent, nType, nPos, nZero, aData[nJ,nI] / nMin + nDeep, aColors[nJ] )
            && aPoint[nJ,nI,2] := nPos
            && aPoint[nJ,nI,1] := nZero - aData[nJ,nI] / nMin
         && NEXT nJ
         && nPos += nWideB
      && NEXT nI
   && ENDIF

   && IF lViewVal
      && IF nType == BARS
         && nPos := nLeft + nWide + ( (nWide+nSep) * ( HMG_LEN(aSeries) / 2 ) )
      && ELSE
         && nWideB := ( nRight - nLeft ) / ( nMax(aData) + 1 )
         && nPos := nLeft + nWideB
      && ENDIF
      && FOR nI := 1 TO HMG_LEN(aData[1])
         && FOR nJ := 1 TO HMG_LEN(aSeries)
            && cName := "Data_Name_"+LTRIM(STR(nI))+LTRIM(STR(nJ))
            && @ nZero - ( aData[nJ,nI] / nMin + nDeep ), IF(nType == BARS, nPos - IF(l3D, 8, 10), nPos + 10) ;
			&& LABEL &cName OF &parent ;
			&& VALUE Transform(aData[nJ,nI], cPicture) AUTOSIZE ;
			&& FONT "Arial" SIZE 8 BOLD TRANSPARENT
            && nPos+=IF( nType == BARS, nWide + nSep, 0)
         && NEXT nJ
         && IF nType == BARS
            && nPos += nWide + nSep
         && ELSE
            && nPos += nWideB
         && ENDIF
      && NEXT nI
   && ENDIF

   && IF l3D
      && DrawLine( parent, nZero, nLeft-nDeep, nZero, nRight-nDeep, BLACK )
   && ELSE
      && IF nXMax<>0 .AND. nXMin<>0
         && DrawLine( parent, nZero-1, nLeft-2, nZero-1, nRight, RED )
      && ENDIF

	&& endif
   && ENDIF


RETURN



function DrawWindowBoxInBitMap( hDC, row, col, rowr, colr )
   BT_DrawRectangle ( hDC, Row, Col, Colr - col, rowr - row, { 0, 0, 0 }, nPenWidth )
return nil
		

   

function drawrectinbitmap( hDC, row, col, row1, col1, aColor )

   BT_DrawFillRectangle (hDC, Row, Col, col1 - col, row1 - row, aColor, aColor, nPenWidth )
return nil   

function DrawLineinbitmap( hDC, Row1, Col1, Row2, Col2, aColor )
   BT_DrawLine ( hDC, Row1, Col1, Row2, Col2, aColor, nPenWidth )
return nil   

function DrawTextInBitmap( hDC, Row, Col, cText, cFontName, nFontSize, aColor, nAlign )
   default nAlign := 0
   do case
   case nAlign == 0
      BT_DrawText ( hDC, Row, Col, cText, cFontName, nFontSize, aColor, )
   case nAlign == 1
      BT_DrawText ( hDC, Row, Col, cText, cFontName, nFontSize, aColor, , BT_TEXT_RIGHT )
   case nAlign == 2
      BT_DrawText ( hDC, Row, Col, cText, cFontName, nFontSize, aColor, , BT_TEXT_CENTER )
   endcase   
return nil   

function DrawBarinbitmap( hDC, nY, nX, nHigh, nWidth, l3D, nDeep, aColor )
   LOCAL nI, nColTop, nShadow, nH := nHigh

   && nColTop := ClrShadow( RGB(aColor[1],aColor[2],aColor[3]), 15 )
   && nShadow := ClrShadow( nColTop, 15 )
   && nColTop := {GetRed(nColTop),GetGreen(nColTop),GetBlue(nColTop)}
   && nShadow := {GetRed(nShadow),GetGreen(nShadow),GetBlue(nShadow)}

   FOR nI=1 TO nWidth
      DrawLineinbitmap( hDC, nX, nY+nI, nX+nDeep-nHigh, nY+nI, aColor )  // front
   NEXT nI

   && IF l3D
      && // Lateral
      && drawpolygoninBitmap( parent,{{nX-1,nY+nWidth+1},{nX+nDeep-nHigh,nY+nWidth+1},;
                   && {nX-nHigh+1,nY+nWidth+nDeep},{nX-nDeep,nY+nWidth+nDeep},;
                   && {nX-1,nY+nWidth+1}},nShadow,,nShadow )
      && // Superior
      && nHigh   := Max( nHigh, nDeep )
      && drawpolygon( parent,{{nX-nHigh+nDeep,nY+1},{nX-nHigh+nDeep,nY+nWidth+1},;
                   && {nX-nHigh+1,nY+nWidth+nDeep},{nX-nHigh+1,nY+nDeep},;
                   && {nX-nHigh+nDeep,nY+1}},nColTop,,nColTop )
      && // Border
      && DrawBox( parent, nY, nX, nH, nWidth, l3D, nDeep )
   && ENDIF

RETURN

STATIC FUNCTION nMax(aData)
   LOCAL nI, nMax := 0

   FOR nI :=1 TO HMG_LEN( aData )
      nMax := Max( HMG_LEN(aData[nI]), nMax )
   NEXT nI

RETURN( nMax )


STATIC FUNCTION DetMaxVal(nNum)
   LOCAL nE, nMax, nMan, nVal, nOffset

   nE:=9
   nVal:=0
   nNum:=Abs(nNum)

   DO WHILE .T.

      nMax := 10**nE

      IF Int(nNum/nMax)>0

         nMan:=(nNum/nMax)-Int(nNum/nMax)
         nOffset:=1
         nOffset:=IF(nMan<=.75,.75,nOffset)
         nOffset:=IF(nMan<=.50,.50,nOffset)
         nOffset:=IF(nMan<=.25,.25,nOffset)
         nOffset:=IF(nMan<=.00,.00,nOffset)
         nVal := (Int(nNum/nMax)+nOffset)*nMax
         EXIT

      ENDIF

      nE--

   ENDDO

RETURN (nVal)
East or West HMG is the Best.
South or North HMG is worth.
...the possibilities are endless.
User avatar
esgici
Posts: 4543
Joined: Wed Jul 30, 2008 9:17 pm
DBs Used: DBF
Location: iskenderun / Turkiye
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by esgici »

Rathinagiri wrote:IMHO, drawing graph on the window itself is an outdated HMG graphics functionality.

The permanent solution for drawing graph is using the ultimate and versatile Bos Taurus library.

I have tried to convert the existing draw graph function ( only BAR type and not 3D) using BT library and saved the graph in a bitmap file. That bitmap can be used to show or print.

May be we can extend this to all other types and we have a NEW graph functionality to save the graph easily to a bitmap in HMG.
Thanks Mr. Rathinagiri :)

I couldn't understand lines commented by old style "&&" sign instead of "//" :?

Is there a special meaning / purpose of that coding style :?:

Regards :D
Viva INTERNATIONAL HMG :D
User avatar
esgici
Posts: 4543
Joined: Wed Jul 30, 2008 9:17 pm
DBs Used: DBF
Location: iskenderun / Turkiye
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by esgici »

EduardoLuis, Serge, Marek wrote:..."HMG-ENCICLOPEDIA"...
Hi friends, please don't exaggerate :oops:

I'm simply a HMG student :P

Viva HMG :D
Viva INTERNATIONAL HMG :D
User avatar
Rathinagiri
Posts: 5471
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Contact:

Re: ERASE WINDOW command does not delete the graph titles

Post by Rathinagiri »

I don't know the difference. But NotePad++ comments the lines we select and press Control+Q with &&.
East or West HMG is the Best.
South or North HMG is worth.
...the possibilities are endless.
Post Reply