Friday, March 13, 2009

Mapping Clipper Command to HMG Commands

To assist CA-Clipper users to understand the Harbour MiniGUI (HMG) equivalent, I have listed the following examples :-

1. @... SAY

Clipper :

@row, col SAY [PICTURE ] [COLOR ]

Example :
@ 15, 20 SAY "Phone" PICTURE "@R (999)999-9999" COLOR "BG+/B+, BG+/N"

HMG :
@ , LABEL
[ ID ]
[ OF | PARENT | DIALOG ]
VALUE
[ ACTION | ONCLICK | ON CLICK | ]
[ WIDTH ]
[ HEIGHT ]
[ AUTOSIZE ]
[ FONT SIZE ]
[ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ]
[ TOOLTIP ]
[ BACKCOLOR ]
[ FONTCOLOR ]
[ BORDER ]
[ CLIENTEDGE ]
[ HSCROLL ]
[ VSCROLL ]
[ TRANSPARENT ]
[ RIGHTALIGN | CENTERALIGN ]
[ HELPID ]
[ INVISIBLE ]

Example
@ 15 ,20 LABEL Lbl_1;
VALUE "Phone" ;
WIDTH 350 HEIGHT 35 ;
FONT "Arial" SIZE 18 BOLD ;
FONTCOLOR BLUE ;
CENTERALIGN

CCH: Basically, SAY in Clipper becomes LABEL control. While COLOR string becomes BACKCOLOR & FONTCOLOR

2. @... GET
Clipper :

    @ , 
[SAY 
[PICTURE ]
[COLOR ]]
GET 
[PICTURE ]
[COLOR ]
[CAPTION]
[MESSAGE ]
[WHEN ]
[RANGE* , ] |
[VALID ]

HMG :
@ , GETBOX
[ ID ]
[ OF | PARENT | DIALOG ]
[ HEIGHT ]
[ WIDTH ]
[ FIELD ]
[ VALUE ]
[ PICTURE ] //** format function and template string
[ VALID | RANGE ,] // VALID - postvalidation function or codeblock which must return logical value
// RANGE - allowed range of values
[ VALIDMESSAGE ]
[ MESSAGE ] // text to display on STATUSBAR Item(1) when getbox have focus
[ WHEN ] // prevalidation function or codeblock (if return .f. GetBox is readonly
[ READONLY ]
[ FONT SIZE ]
[ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ]
[ PASSWORD ]
[ TOOLTIP ]
[ BACKCOLOR ] // * or
[ FONTCOLOR ] // * or
[ ON CHANGE ] ;
[ ON GOTFOCUS | ]
[ ON LOSTFOCUS | ]
[ RIGHTALIGN ]
[ INVISIBLE ]
[ NOTABSTOP ]
[ HELPID ]

Example :
@ 160,460 GETBOX GBox_1 ;
HEIGHT 24 WIDTH 120;
VALUE " " ;
FONT "Arial" SIZE 9 ;
ON CHANGE FindChg();
PICTURE '@XXXXXXXXXXXXXXXXXXXXXXX'

CCH: Basically, GET in Clipper becomes GETBOX control.

More GETBOX Examples

. @ 40,10 GETBOX Text_2 ;
HEIGHT 20;
VALUE 57639 ;
ACTION MsgInfo( "Button Action");
TOOLTIP "Numeric input. RANGE -100,200000 PICTURE @Z 99,999.99";
PICTURE '@Z 99,999.99';
RANGE -100,200000;
BOLD;
MESSAGE "Numeric input";
VALIDMESSAGE "Value between -100 and 200000 " ;
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 78,10 GETBOX Text_3 ;
VALUE "Jacek";
ACTION MsgInfo( "Button Action");
ACTION2 MsgInfo( "Button2 Action");
IMAGE {"folder.bmp","info.bmp"};
BUTTONWIDTH 20 ;
PICTURE "@K !xxxxxxxxxxxxxx";
TOOLTIP "Character Input. VALID {|| ( len(alltrim(This.Value)) >= 2)} PICTURE @K !xxxxxxxxxxxxxx " ;
VALID {|| ( len(alltrim(This.Value)) >= 2)};
VALIDMESSAGE "Minimum 2 characters" ;
MESSAGE "Character Input";
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 120,10 GETBOX Text_4 WIDTH 30 HEIGHT 20;
VALUE .t.;
TOOLTIP "Logical Input VALID {|| (This.Value == .t.)}";
PICTURE "Y";
VALID {|| (This.Value == .t.)};
VALIDMESSAGE "Only True is allowed here !!!";
MESSAGE "Logical Input";
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 160,10 GETBOX Text_2a HEIGHT 20;
VALUE 234123.10 ;
TOOLTIP "Numeric input PICTURE @ECX) $**,***.**" ;
PICTURE '@ECX) $**,***.**' ;
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 200,10 GETBOX Text_2b HEIGHT 20;
VALUE "Kowalski";
PICTURE "@K !!!!!!!!!!";
ON CHANGE {|| TONE(300)};
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

DEFINE GETBOX Text_2c // Alternate Syntax
ROW 240
COL 10
HEIGHT 20
VALUE "MyPass"
PICTURE "@K !!!!!!!!!"
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}}
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}
VALID {|| ( len(alltrim(This.Value)) >= 4)}
TOOLTIP "Character input PASSWORD clause is set"
VALIDMESSAGE "Password must contains minimum 4 characters"
MESSAGE "Enter password (min 4 char.) "
PASSWORD .T.

Comments by Mel Smith from comp.lang.clipper/comp.lang.xharbour

David:

Here is a snippet of HMG Code that shows a prompt (P.O. Number:), then a
'GET' that inputs a P.O. number from the user, then verifies it and does a few more things.

These next two statements are 'inside' a Window Definition structure:

DEFINE WINDOW MNTPCH;
etc,
etc,

// This next is a 'SAY' emulation showing how wide/high the prompt
box should be,
// and where the label should be positioned (in 'pixels'), and that
// it should be right-aligned in its 'box'. Note that the 'LABEL'
has a name itself.
// Here, it is named LABPONUM, so that I can reference and change
the characteristics
// of the label itself at a later stsge -- if I wish to.

@ 010,010 LABEL LABPONUM OF MNTPCH WIDTH 090 HEIGHT 20 ;
VALUE "P.O. Number :" RIGHT

// This next is the 'GET' emulation showing the 'picture' clause,
the initial value to be displayed,
// the colors for foreground and background, and what to do when
gaining focus, and
// what to do when focus is lost, and then a Validation function to
perform on losing focus.

@ 010,120 GETBOX oPONUM OF MNTPCH WIDTH 060 HEIGHT 20 ;
PICTURE "@K! #####" ;
VALUE cPONUM ;
FONTCOLOR GFCOLORS ;
BACKCOLOR GBCOLORS ;
ON GOTFOCUS {|| IF(lGOTNEWPO,SETFOCUSTO("MNTPCH","oVENDCODE"), ;
SETPROPERTY("MNTPCH","LABF6SELPO","VISIBLE",.T.))}
;
ON LOSTFOCUS {||SETPROPERTY("MNTPCH","LABF6SELPO","VISIBLE",.F.)} ;
VALID {||GABORT := .NOT. CHKPONUM("MNTPCH","oPONUM",ALIAS(), ;
THIS.VALUE,@cPONUM),.T.} ;
TOOLTIP "Enter a different P.O. No., or use Movement Keys"

etc,
etc
// and many other fields, browses, etc, in here too
// It gets easier after you bang your head against the wall for five
months :))

END WINDOW

-Mel Smith, 14th March 2009

1 comment:

  1. I would like to see a full example with window @SAY and @get equivalent. I am using these examples but getting an error E0030.

    ReplyDelete