The following describes the layout of the paint tableau found on the table FORMPIC.UFORM.DICT.
The first point to consider is accessing the value of the FORMPIC field. Under normal circumstances the field value (when painted directly onto a component) is unavailable. The easiest way to get around this is to enter some simple code into the Decrypt trigger, for example $C_TEMP1$ = is sufficient for the FORMPIC field to be decoded.
Each basic widget type (field, entity, label, area frame etc.) will have details such as type, width, height and description encoded within the FORMPIC field. However, they will not have the co-ordinate position, and in the case of fields it will not show its parent entity. These details must be determined from the line and character position of the text. Positional data can be obtained by combining the width values of fields and labels, and the space in-between (including entities and area frames) are determined by the relevant number of character spaces (or text in the case of text fields).
Each object type follows the same basic pattern and consists of a list of values, each indicated by a # separator and a numeric or ASCII character identifier. Entities and area frames can have two width and depth measurements. One value will measure the size of a single occurrence and the other will measure the total size of multiple occurrences (although see further notes on area frames).
Several parameters will not appear if the default values are selected, for example if the default border definition is selected (No) then no value will appear but if Yes is selected then the value :1 will appear. These items will appear highlighted with an asterisk below.
#1E#3x#4y#5y#8x#932768#>z#2name.model
1E = entity indicator
3x = total width of painted entity (sum of all horizontally repeated occurrences)
4y = total depth of painted entity (sum of all vertically repeated occurrences)
5y = occurrence depth
8x = occurrence width
2name.model = entity name and model
* >z = entity scrollbar setting, z can be set to N, Y, T, B, L, R or its just missing for Automatic.
* ;z = printing definition where z can be set to F, S, O or missing for the default value.
* :z = border definition where z can be set to 1 (Yes), 2 (Occurrence) or is missing for No.
#1F#3x#4y#916384#:z#2name
1F = field indicator
3x = width
4y = depth
2name = field name (no entity reference)
* :z = border definition where z can be set to 1 (Yes), 2 (Occurrence) or is missing for No.
#1L#3x#4y#2name#Lvalue
1L = label indicator
3x = width
4y = depth
2name = field name (with entity reference)
Lvalue = label value ($text(F_PARTY_D) etc.)
* An = horizontal alignment where n can be C (center), R (right) or missing (left).
* Vn = vertical alignment where n can be C (center), R (right) or missing (left).
* Rn = repeat characteristics where n can be Y (repeat), C (repeat if not empty) or missing (do not repeat).
* Gfont = label font.
#1A#3x#4y#5d#8w
1L = label indicator
3x = total width
4y = total depth
* 5d = occurrence depth
* 8w = occurrence width
* :n = border setting where n can be 1 (yes), 2 (occurrence) or missing (no border).
* ;n = printing setting where n can be F (print frame on same page), O (print occurrence on same page) or missing (no page break restrictions).
* <Y = suppress print if empty.
With area frames the occurrence depth and width values will also show the relevant screen size (for say an unbordered occurrence) since a bordered area frame occupies slightly different screen space to other items. This value can typically result in a one or two character positional difference.
#1H#3x#4y#2name
1H = header indicator
3x = width
4y = depth
2name = header name
* :n = border setting where n can be 1 (yes) or missing (no border).
* <Y = suppress print if empty.
Normal text the basic text message.
Bold text preceding {f before every bold character e.g. {fT{fe{fs{ft would show Test.
Italic text preceding | before every italic character e.g. |T|e|s|t would show Test.
Underlined text preceding {N before every underlined character e.g. {NT{Ne{Ns{Nt would show Test.
Code 9xxxxx or 9xxxxx#:15yyy e.g. 932768 or 936352#:15872 = These are the colours of the objects, the first number controls the colour (32768 seems to be default colour for entities and 16384 the default for fields with increments of 512 to the number for every Uniface colour number increment). The second number is more obscure and only appears to have two values 15872 and 15936. These seem to correspond to whether the Uniface colour number is 0-31 (15872) or 32-63 (15936). The second value will not appear if the default colour is used (thus it will show #932768, for example, as the colour value).
{; = Start/end of a definition
{. = New line
<SPACE> = screen position (i.e. gaps between fields etc.)
Component: XXXX
{;#1E#366#411#511#866#932768#2FIELD.ENTI{;{. {;#1A#332#46#54#830#91#:1{; {;#1L#328#41#2LABEL_4#LOverride password{;{. {;#1L#328#41#2LABEL_2#L$text(F_NEW_PASS){;{. {;#1F#328#41#916384#2ED_NEW_PASS{; {;#1F#32#41#916384#2PWD_CAN_CHG_I{; {;#1L#329#41#2FIELD2.MODEL#L$text( F_USER_CHG_PWD ){;{. {;#1L#328#41#2LABEL_3#L$text(PASS){;{. {;#1F#328#41#916384#
CONFIRM_PASS{; {;#1F#32#41#916384#2CHG_1ST_PWD_I{; {;#1L#329#42#FIEL3.ENTIY#L$text( F_CHG_INIT_PSSWD ){;{.{. {;#1F#311#41#916384#2NM{;{. {;#1F#32#41#916384#2
XP{; {;#1L#329#41#2FIELD3.ENTITY#L$text(EXP ){;{. {;#1F#32#41#916384#2PWD_CAN_EXP_I{; {;#1L#328#41#2FIELD2.ENTI#L$text( F_PWD_CAN_EXP ){;
In this example you can see which labels havent been associated with a field (LABEL_2, LABEL_3 and LABEL_4) and those that have (CHG_1ST_PWD_I, etc.). From the sequence of the entities you can determine which objects are painted inside which entities, and from the differing width and depth values, you can determine which entities are painted as repeat entities (none in this case).