AUGE_OHR wrote: ↑Fri Jan 01, 2021 9:02 pm
hi,
i have made a Sample
DEMOMEMO.ZIP
i have try every Answer but still none was right.
i do understand "Problem of loop".
under Xbase++ i can use a Function to get a "detached Local"
but it does not work with harbour HMG
please have a look and tell me what i´m doing wrong, thx
As I wrote in my previous post:
http://hmgforum.com/viewtopic.php?p=64676#p64676 , this is a working solution:
edk wrote: ↑Fri Jan 01, 2021 11:41 am
IMHO it should be
Code: Select all
cProc := "ShowMemo( '" + cFIELD + "' ) "
ACTION &cProc
Working sample:
Code: Select all
#include "HMG.CH"
#include "Dbstruct.ch"
REQUEST DBFCDX
REQUEST DBFNTX
MEMVAR _HMG_SYSDATA
PROCEDURE Main
DEFINE WINDOW Win_1 ;
AT 0, 0 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'Demo Memo' ;
MAIN
DEFINE BUTTON Button_F1
PARENT Win_1
ROW 10
COL 10
WIDTH 610
HEIGHT 410
ACTION GetStartFile()
CAPTION "start Demo"
FONTNAME "ARIAL"
FONTSIZE "20"
TABSTOP .T.
VISIBLE .T.
TRANSPARENT .F.
MULTILINE .F.
END BUTTON
END WINDOW
CENTER WINDOW Win_1
ACTIVATE WINDOW Win_1
RETURN
PROCEDURE GetStartFile()
LOCAL ii, iMax, aStruct := {}
LOCAL nIndex := 1
LOCAL cTitle := "load DBF Structure"
LOCAL cFile := GetFile( { { "DBF File", "*.DBF" } }, cTitle )
IF !EMPTY( cFile )
USE ( cFile ) VIA "DBFCDX"
EditDetail(nIndex, .T. )
CLOSE
ENDIF
RETURN
PROCEDURE EditDetail(nIndex ,lEdit )
LOCAL i, iMax, cObj, cLabel, nHeight
LOCAL cText, cType, nSize, nDec, nRow, cFIELD
LOCAL nMaxheight := GetDeskTopRealHeight()
LOCAL nMaxwide := GetDesktopRealWidth()
LOCAL nEditHeight := 600
LOCAL nTitlebar := GETTITLEHEIGHT()
LOCAL nItemheight := 33
LOCAL cTitle := IF( lEdit, "Edit Record ", "View only " )
LOCAL oBroEdit := "BroEdit_" + STRZERO( nIndex, 2 )
LOCAL aStruc, nMaxLen := 0
LOCAL nRecno, xValue, cRepl, cProc
aStruc := DBSTRUCT()
iMax := LEN( aStruc )
nHeight := iMax * nItemheight
IF nHeight + nItemheight + nTitlebar < nEditHeight
nEditHeight := nHeight + nItemheight + nTitlebar
ENDIF
IF nHeight > nMaxheight
nEditHeight := nMaxheight
ENDIF
IF !EMPTY( ALIAS() )
cTitle += ALIAS()
ENDIF
DEFINE WINDOW &oBroEdit ;
AT 0, 0 ;
WIDTH 300 ;
HEIGHT nEditHeight ;
VIRTUAL WIDTH 9999 ;
VIRTUAL HEIGHT( iMax * nItemheight ) + nItemheight + nTitlebar + 1 ;
TITLE cTitle ;
ICON "A1MAIN" ;
TOPMOST ;
BACKCOLOR WHITE
FOR i := 1 TO iMax
cType := SUBSTR( aStruc[ i ] [ DBS_TYPE ], 1, 1 )
cLabel := "LABEL_" + STRZERO( i, 3 )
cObj := "TEXT_" + STRZERO( i, 3 )
nRow := 32 * ( i - 1 )
nSize := aStruc[ i ] [ DBS_LEN ]
nDec := aStruc[ i ] [ DBS_DEC ]
nMaxLen := MAX( nMaxLen, nSize * 14 )
cFIELD := aStruc[ i ] [ DBS_NAME ]
DEFINE LABEL &cLabel
ROW nRow
COL 10
VALUE cFIELD
WIDTH 80
HEIGHT 30
BACKCOLOR WHITE
FONTCOLOR BLACK
END LABEL
// need ALIAS()
cFIELD := "FIELD->" + aStruc[ i ] [ DBS_NAME ]
DO CASE
CASE aStruc[ i ] [ DBS_TYPE ] = "C"
cRepl := REPLICATE( "!", nSize )
DEFINE TEXTBOX &cObj
ROW nRow
COL 100
HEIGHT 30
FIELD &( cFIELD )
VALUE &( cFIELD )
READONLY !lEdit
WIDTH nSize * 14
FONTNAME "ARIAL"
FONTSIZE 12
TOOLTIP ""
BACKCOLOR WHITE
FONTCOLOR BLACK
DISABLEDBACKCOLOR IF( lEdit = .T., WHITE, GRAY )
DISABLEDFONTCOLOR IF( lEdit = .T., BLACK, GRAY )
DATATYPE CHARACTER
CASECONVERT NONE
RIGHTALIGN .F.
VISIBLE .T.
TABSTOP .T.
INPUTMASK cRepl
END TEXTBOX
CASE aStruc[ i ] [ DBS_TYPE ] = "N" .OR. aStruc[ i ] [ DBS_TYPE ] = "I"
IF nDec = 0
cRepl := REPLICATE( "9", nSize )
ELSE
cRepl := REPLICATE( "9", nSize - nDec - 1 )
cRepl += "."
cRepl += REPLICATE( "9", nDec )
ENDIF
DEFINE TEXTBOX &cObj
ROW nRow
COL 100
HEIGHT 30
FIELD &( cFIELD )
VALUE &( cFIELD )
READONLY !lEdit
WIDTH nSize * 14
FONTNAME "ARIAL"
FONTSIZE 12
BACKCOLOR WHITE
FONTCOLOR BLACK
DISABLEDBACKCOLOR IF( lEdit = .T., WHITE, GRAY )
DISABLEDFONTCOLOR IF( lEdit = .T., BLACK, GRAY )
DATATYPE NUMERIC
VISIBLE .T.
TABSTOP .T.
INPUTMASK cRepl
END TEXTBOX
CASE aStruc[ i ] [ DBS_TYPE ] = "D"
DEFINE TEXTBOX &cObj
ROW nRow
COL 100
HEIGHT 30
FIELD &( cFIELD )
VALUE &( cFIELD )
READONLY !lEdit
WIDTH nSize * 14
FONTNAME "ARIAL"
FONTSIZE 12
BACKCOLOR WHITE
FONTCOLOR BLACK
DISABLEDBACKCOLOR IF( lEdit = .T., WHITE, GRAY )
DISABLEDFONTCOLOR IF( lEdit = .T., BLACK, GRAY )
DATATYPE DATE
VISIBLE .T.
TABSTOP .T.
END TEXTBOX
CASE aStruc[ i ] [ DBS_TYPE ] = "L"
DEFINE CHECKBOX &cObj
ROW nRow
COL 100
CAPTION ""
HEIGHT 30
FIELD &( cFIELD )
VALUE &( cFIELD )
WIDTH 50
BACKCOLOR WHITE
FONTCOLOR BLACK
DISABLEDBACKCOLOR IF( lEdit = .T., WHITE, GRAY )
DISABLEDFONTCOLOR IF( lEdit = .T., BLACK, GRAY )
VISIBLE .T.
TABSTOP .T.
END CHECKBOX
CASE aStruc[ i ] [ DBS_TYPE ] = "T" .OR. aStruc[ i ] [ DBS_TYPE ] = "@"
// cRepl := REPLICATE( "!", nSize )
DEFINE TEXTBOX &cObj
ROW nRow
COL 100
HEIGHT 30
FIELD &( cFIELD )
VALUE hb_TSToStr( &cFIELD, .T. )
READONLY !lEdit
WIDTH( nSize + 6 ) * 14
FONTNAME "ARIAL"
FONTSIZE 12
TOOLTIP ""
BACKCOLOR WHITE
FONTCOLOR BLACK
DISABLEDBACKCOLOR IF( lEdit = .T., WHITE, GRAY )
DISABLEDFONTCOLOR IF( lEdit = .T., BLACK, GRAY )
CASECONVERT NONE
RIGHTALIGN .F.
VISIBLE .T.
TABSTOP .T.
INPUTMASK nil // cRepl
END TEXTBOX
CASE aStruc[ i ] [ DBS_TYPE ] = "M"
cFIELD := aStruc[ i ] [ DBS_NAME ]
cProc := "ShowMemo( '" + cFIELD + "' )"
DEFINE BUTTON &cObj
ROW nRow
COL 100
WIDTH 100
HEIGHT 30
ACTION &cProc
CAPTION "Memo"
FONTNAME "ARIAL"
FONTSIZE 12
TABSTOP .F.
VISIBLE .T.
END BUTTON
ENDCASE
NEXT
END WINDOW
nMaxLen += 140
nMaxLen := MIN( nMaxLen, nMaxwide )
SetProperty( oBroEdit, "Width", nMaxLen )
ON KEY ESCAPE OF &oBroEdit ACTION Domethod( oBroEdit, "Release" )
CENTER WINDOW &oBroEdit
ACTIVATE WINDOW &oBroEdit
RETURN
PROCEDURE ShowMemo( cFIELD )
*LOCAL cText := &( cFIELD )
LOCAL cText := ( cFIELD )
Msginfo( cText, "Memo " + cFIELD )
RETURN
*
* EOF
*
Also works:
Code: Select all
cFIELD := aStruc[ i ] [ DBS_NAME ]
cProc := "EVAL( { || ShowMemo( '" + cFIELD + "' ) } )"
DEFINE BUTTON &cObj
ROW nRow
COL 100
WIDTH 100
HEIGHT 30
ACTION &cProc
CAPTION "Memo"
FONTNAME "ARIAL"
FONTSIZE 12
TABSTOP .F.
VISIBLE .T.
END BUTTON
In this case, note how the actions for each control are stored in HMG.
If a variable is used in the definition of an action, then when the action is called, the current, in this case, the last value of the variable will always be taken. Therefore, you must use its current value instead of a variable and toughly pass this value as a parameter.
Here are the errors:
Code: Select all
ACTION & ("{|| ShowMemo (" + cFIELD + ")}")
The result of this entry for the first memo field would be:
&{|| ShowMemo (DIVERSES)}, where DIVERSES will be interpreted as a variable (quotes are missing). Additionally, no block call via EVAL.
However, with this notation:
the cBlock variable code block will always be executed (after exiting the loop, the cBlock variable has the last value)