Hm, difficult.
As far as I know there is no documentation on the format.
With a little bit of ugly reverse engineering i found out that
it does somehow reflect the structure that you see in the
Navigator/Inspector of Form-Builder.
The main nodes to the hierachy level are blocks that have the
"FRM50_IDFO" identifier.
There is one single block that has the IDFOS_OID = 1 (guess
OID means something like object ID) and that is the parent of
all in the hierachy level:
DEFINE FRM50_IDFO
BEGIN
IDFOS_POI = 0 <-- Parent ID
IDFOS_OID = 1
IDFOS_NAM = <<"MODULE_NAME">>
IDFOS_TYP = 22
IDFOS_OOI = 0
IDFOS_OPN = 111
IDFOS_CNT = 29 <-- Number of children, somehow ???
END
Next Level is defined by those IDFO blocks that have the
parent id 1: IDFOS_POI = 1
These are anomymous blocks and they correspond with the object
types Form-Level-Triggers, Alerts, Datablocks, Canvases, ...
Strange enough my .fmt has 13 of those blocks, but the IDFOS_CNT
in the parent block with ID=1 is 29.
DEFINE FRM50_IDFO
BEGIN
IDFOS_POI = 1
IDFOS_OID = 7
IDFOS_NAM = <<"">>
IDFOS_TYP = 69
IDFOS_OOI = 0
IDFOS_OPN = 0
IDFOS_CNT = 7
END
The children of these blocks are then the single form-level-triggers
or datablocks, canvases, windows ... whatever you have.
The following shows my first trigger in the "module_name" form:
DEFINE FRM50_IDFO
BEGIN
IDFOS_POI = 7
IDFOS_OID = 10
IDFOS_NAM = <<"WHEN-WINDOW-ACTIVATED">>
IDFOS_TYP = 68
IDFOS_OOI = 1
IDFOS_OPN = 314
IDFOS_CNT = 3
END
So basically it is somehow XML, but instead of xml tags they use
begin-end blocks. That has the "great" advantage that there are
no parsers that could handle this beasts of data. (One of my forms
reached the size of 4 MByte as .fmt!)
Now one more important thing:
You may ask, where is my PL/SQL source code of the triggers and
program units?
It's hex-encoded to make it 7bit clean, if you use a language with
strings that may inlcude special characters like german umlauts or
french accents.
You have probably recognized these blocks of raw data, when you had
a quick look at the file. The sick thing about it is, that it does not
only contain your source code but also a header that includes some
kind of timestamp. And as it is inside the hex blocks, there is no
clear separator between the header part and the body text.
Or you might do a diff on two version of .fmt files ...
Forget it. Well if you did not change to much a diff could still
be meaningful, but if you did a full compile between the two stages
(always happens if you closed and opend the form) any of the PL/SQL
blocks will be changed because of the changed timestamp.
Conclusion:
===========
You might try to save your form in the database. I think that these
BEGIN-END blocks are one line in some table. So chances are that the
stuff is more structured in the database, better to filter and better
to search -- but your code will still be hex-encoded.
If you really interested in this thing, drop me a mail and I will send
you a perl script that I wrote to decode the PL/SQL blocks back into
plain text format.
HTH, Rolf.