Word wrap in EditBox

EDITBOX control doesn’t have a WORD-WRAP property but has this feature via HSCROLLBAR property.

Look at the sample :

*  HMG – Harbour Win32 GUI library Demo
*  Copyright 2010 Roberto Lopez
HMG official EDITBOX demo slightly modified to demonstrate effect of HSCROLLBAR property.


#include "hmg.ch"
Function Main
   LOCAL cTestText := STRTRAN( TestText(), CRLF, '' ) 

      AT 0,0 ;
      WIDTH 640 HEIGHT 480 ;
      TITLE 'HMG EditBox!! Demo' ;

      ON KEY ESCAPE ACTION Form_1.Release
         STATUSITEM 'HMG Power Ready!' 
      @ 30,10 EDITBOX Edit_1 ;
        WIDTH 600 ;
        HEIGHT 170 ;
        VALUE cTestText ;
      @ 230,10 EDITBOX Edit_2 ;
        WIDTH 600 ;
        HEIGHT 170 ;
        VALUE cTestText ;
        TOOLTIP 'EDITBOX with HSCROLLBAR is .F.' ;

Return Nil
    RETURN "HMG 2.0 ALPHA BUILD 004 Changelog: "+;
           "- New: Cell ( nRow , nCol ) property for GRID control (read(write). "+;
           "- New: Edit routines for GRID control. Editing is now 'in-cell'. "+;
           "- New: 'DynamicForeColor' / 'DynamicBackColor' properties for GRID "+;
           "control. Codeblock array (one element per column) evaluated "+;
           "for each cell at any grid change. "+;
           "This.CellRowIndex, This.CellColIndex and This.CellValue variables are "+;
           "available at codeblock evaluation. "+;
           "Sample: "+;
           "bColor := { || if ( This.CellRowIndex/2 == int(This.CellRowIndex/2) , ; "+;
           "RGB (128,128,128) , RGB (192,192,192) ) } "+;
           "DYNAMICBACKCOLOR { bColor , bColor, bColor, bColor, bColor, bColor } "+;
           "See \hmg\samples\grid\grid_10 "+;
           "\hmg\samples\grid\grid_11 "+;
           "\hmg\samples\grid\grid_12 "

PICTURE function / template

What is PICTURE function – template ?

@…SAY comand display data at a specified screen or printer row and column with syntax :

@ <nRow>, <nCol> SAY <exp> [PICTURE <cSayPicture>] [COLOR <cColorString>]

@…SAY command output can be formatted using the PICTURE clause with a <cSayPicture>. This performs the same action as the TRANSFORM() function. A <cSayPicture> may consist of a function and/or a template. A PICTURE function imposes a rule on the entire @…SAY output. A PICTURE template defines the length of the @…SAY output and the formatting rule for each position within the output.

Function string:

A PICTURE function string specifies formatting rules which apply to the SAY’s entire display value, rather than to particular character positions within it.

The function string consists of the @ character, followed by one or more additional characters, each of which has a particular meaning (see table below).

The function string must not contain spaces.

A function string may be specified alone or with a template string. If both are present, the function string must precede the template string, and the two must be separated by a single space.

SAY and TRANSFORM() PICTURE Format Functions
Function Action
B Displays numbers left-justified
C Displays CR after positive numbers
D Displays dates in SET DATE format
E Displays dates and numbers in British format
R Nontemplate characters are inserted
X Displays DB after negative numbers
Z Displays zeros as blanks
( Encloses negative numbers in parentheses
! Converts alphabetic characters to uppercase

 Template string:

A PICTURE template string specifies formatting rules on a character-by-character basis. The template string consists of a series of characters, some of which have special meanings (see table below). Each position in the template string corresponds to a position in the displayed SAY value. Characters in the template string that do not have assigned meanings are copied verbatim into the displayed SAY value. If you use the @R picture function, characters without special PICTURE template string meaning are inserted between characters of the display value; otherwise, they overwrite the corresponding characters of the display value. You may specify a template string alone or with a function string. If both are present, the function string must precede the template string, and the two must be separated by a single space.

SAY and TRANSFORM() Template Symbols
Template Action
A,N,X,9,# Displays digits for any data type
L Displays logicals as "T" or "F"
Y Displays logicals as "Y" or "N"
! Converts alphabetic characters to uppercase
$ Displays a dollar sign in place of a leading space in a number
* Displays an asterisk in place of a leading space in a number
. Specifies a decimal point position
, Specifies a comma position

Examples :

This example uses an @…SAY with a PICTURE clause to display formatted output:

nNetIncome = 7125.50
nNetLoss = -125.50
cPhone = "2134567890"
cName = "Kate Mystic"
@ 1, 1 SAY nNetIncome PICTURE "@E 9,999.99" // Result: 7.125,50
@ 2, 1 SAY nNetLoss PICTURE "@)" // Result: (125.50)
@ 3, 1 SAY cPhone PICTURE "@R (999)999-9999" // Result: (213)456-7890
@ 4, 1 SAY cName PICTURE "@!" // Result: KATE MYSTIC

This example is a small label printing program that uses SET DEVICE to direct output to the printer and SETPRC() to suppress automatic EJECTs:

USE Salesman INDEX Salesman NEW
DO WHILE !EOF() // Print all records
   @ 2, 5 SAY RTRIM(FirstName) + ", " + LastName
   @ 3, 5 SAY Street
   @ 4, 5 SAY RTRIM(City) + ", " + State + " " + PostalCode
   @ 6, 0 SAY SPACE(1) // Move to label bottom
   SETPRC(0, 0) // Suppress page eject
   SKIP // Next record
CLOSE Salesman

Identifier length limit

What is variable and field name length limit in Harbour ?

Harbour support long field names without any problem.

TBrowse in Harbour also does not have any 10 character limit.

Variable and field names in Harbour can have up to 63 characters. This limit is defined in hbvmpub.h:


and can be changed to any bigger value if necessary.

All problems are result of DBASE III DBF format which has 10 character field name limit.

It’s not Harbour problem but DBF structure created many years ago which cannot be changed due to compatibility with other systems using such files.

If you want to use longer field names then you have to chose RDD which uses different low level storage format then DBASE III DBF and supports longer field names.