Hallo, Manfred.
#command und #translate erlauben es (zum Beispiel), befehlsorientiert (alte Clipper-Syntax) zu arbeiten. Der Unterschied zwischen beiden Befehlen besteht darin, daß #command komplette Befehlszeilen übersetzt, wohingegen #translate auch innerhalb von Anweisungen arbeitet. Ein gutes Beispiel für die Mächtigkeit dieser Funktionalität ist das Tool eXPress++, über das wir gerade im 3rd-Party-Bereich reden. Es macht aus solchen Zeilen:
Code: Alles auswählen
@ x,y DCSAY 'Name' GET mydb->name PICTURE "XXXXXXXX" usw.
relativ komplexen, funktionsorientierten Code, der aber kaum so zu erstellen bzw. zu warten wäre:
Code: Alles auswählen
#command @ <nSayRow> [,<nSayCol>] DCSAY [<cText>] ;
GET <uVar> ;
[GETPOS <nGetRow> [,<nGetCol>] ] ;
[DATALINK <bLink>] ;
[SAYVAR <uSayVar>] ;
[<color:COLOR,SAYCOLOR> <ncSayFgC> [,<ncSayBgC>] ] ;
[GETCOLOR <ncGetFgC> [,<ncGetBgC>] ] ;
[OPTION <option>] ;
[<lGraString:GRASTRING>] [_GRASTRING <_grastring>] ;
[SAYSIZE <nSayWidth> [,<nSayHeight>]] ;
[GETSIZE <nGetWidth> [,<nGetHeight>]] ;
[PARENT <oParent>] ;
[PARENTID <cPID>] ;
[MESSAGE <cMsg> [INTO <oMsg>]] ;
[VALID <bValid>] ;
( ... )
=> ;
AADD( DCGUI_GETLIST, DC_GetTemplate(GETLIST_SAY, XBPSTATIC_TYPE_TEXT) ) ;
;DC_GetListSet(DCGUI_GETLIST,cGETLIST_CAPTION,<cText>) ;
[;DC_GetListSet(DCGUI_GETLIST,bGETLIST_VAR, ;
DC_GetAnchorCB(@<uSayVar>,'C'))] ;
[;DC_GetListSet(DCGUI_GETLIST,nGETLIST_STARTROW,<nSayRow>)] ;
[;DC_GetListSet(DCGUI_GETLIST,nGETLIST_STARTCOL,<nSayCol>)] ;
[;DC_GetListSet(DCGUI_GETLIST,nGETLIST_WIDTH,<nSayWidth>)] ;
[;DC_GetListSet(DCGUI_GETLIST,nGETLIST_HEIGHT,<nSayHeight>)] ;
[;DC_GetListSet(DCGUI_GETLIST,cGETLIST_FONT,<cSayFont>)] ;
[;DC_GetListSet(DCGUI_GETLIST,cGETLIST_TOOLTIP,<cSayToolTip>)] ;
[;DC_GetListSet(DCGUI_GETLIST,cGETLIST_MESSAGE,{<cMsg>,nil})] ;
[;DC_GetListSet(DCGUI_GETLIST,cGETLIST_MESSAGE, ;
DC_GetAnchorCB(@<oMsg>,'O'),2)] ;
[;DC_GetListSet(DCGUI_GETLIST,xGETLIST_CARGO,<xSayCargo>)] ;
[;DC_GetListSet(DCGUI_GETLIST,aGETLIST_PRESENTATION,<aSayPres>)] ;
[;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS,{<nSayOpt>})] ;
[;DC_GetListSet(DCGUI_GETLIST,aGETLIST_COLOR,{<ncSayFgC>,<ncSayBgC>})] ;
[;DC_GetListSet(DCGUI_GETLIST,bGETLIST_GROUP, ;
DC_GetAnchorCB(@<oSayObject>,'O'))] ;
[;DC_GetListSet(DCGUI_GETLIST,bGETLIST_PARENT, ;
DC_GetAnchorCB(@<oParent>,'O'))] ;
[;DC_GetListSet(DCGUI_GETLIST,bGETLIST_PARENT,<cPID>)] ;
[;DC_GetListSet(DCGUI_GETLIST,lGETLIST_PIXEL,<.p.>)] ;
[;DC_GetListSet(DCGUI_GETLIST,nGETLIST_CURSOR,<nSayCursor>)] ;
[;DC_GetListSet(DCGUI_GETLIST,bGETLIST_EVAL,<bSayEval>)] ;
( ... )
Aus der bequemen Befehlszeile wird - je nach Menge der genutzten Optionen - via Präprozessor eine Folge von Funktionsaufrufen, die etwas völlig anderes zu tun scheinen, als wir von der Zeile zunächst erwarten würden - und das ist uns völlig egal.
Verkürzt gesagt: Diese Präprozessor-Direktiven erlauben es, eine eigene Syntax einzuführen. Der Unterschied z.B. zu Funktionsaufrufen für eigene UDFs besteht darin, daß auch strukturelle Eigenarten möglich sind.