For simplicity, create a report, Report1, with a Detail band only.
Each report object will require identification, so right click on the object and sequentially enter the equivalent default FORM name in the comment field, ie textboxes become "Text1", "Text2", labels becomes "Label1", "Label2", images become "Image1", "Image2", lines becomes "Line1" etc.
Create a form and add the equivalent controls that exist in the report, using the default names, thus the REPORT textbox object with comment field "Text1" has the equivalent FORM textbox "Text1", etc. Select all controls and change the .Left property to 800, thus apparently giving you a blank form.
By scaling the form's properties, the central part of the form will become a WYSIWYG "view" of the whole report. In the .Init event of the form, the report Report1 is opened as a table ALIAS TEMPREPO, and the .Refresh event "reads" (SCAN..ENDSCAN) the table TEMPREPO, to determine the form's control's properties. Typical scaling factors are INT(TEMPREPO.Hpos / 300) and INT(TEMPREPO.FontSize / 2.65).
Scaling also enables the developer to add additional controls, such as grids, combos, lists etc to the left and right of the "view" which allows data to be drag and dropped onto the "view". You will need a Checkbox to turn the Textbox borders on and off to ensure the "view" is a genuine representation of the report.
You can compare the form's presentation to a graphics application, where the central portion is the pasteboard and the surrounding controls become the "palettes".
You will need a toolbar class with a considerable number of controls, which are .visible = .T./.F. according to which "view" control class has focus.
A typical minimum list showing for a textbox follows.
cboFonts - List of available fonts spnFontSizes - Font sizes spnLeft - Moves left position spnTop - Moves top position spnWidth - Changes texbox width (Set Textbox.IntegralHeight = .T. for automatic height adjustment) cmdForeColor - GETCOLOR() cmdBackColor - GETCOLOR() cmdDelete/Recall - Hides/Unhides the textbox
The following Checkboxes should be set to .Style = 1 chkTransparent - Set the backcolor to be transparent chkBold - Bold chkItalic - Italic chkUnderscore - Underscore chkStrikeThru - StrikeThru chkLeft - Left text alignment in textbox chkCentre - Centre text alignment in textbox chkRight - Right text alignment in textbox chkHorizontal - Centres textbox in report
In use, the user clicks on a WYSIWYG "view" control, the toolbar is refreshed with the control's relevant to the selected WYSIWYG "view" control,and then changes it's properties with the toolbar. The toolbar event's REPLACE TEMPREPO.field WITH data and the form's .Refresh event shows the scaled updated WYSIWYG "view".
Assuming drag and drop to be in use on the form between the various controls, moving a WYSIWYG "view" control by the spinners alone can be tedious. Dragging and dropping controls as well as data is confusing. An alternative is to create a "move mode" where the user clicks on a control, the cursor changes to a cross, the toolbar's spinners monitor the coordinates and the next click moves the control to the new coordinates.
You will certainly need a cmdButton, caption "Revert", to restore the original report properties.
The report can be saved as a record in a table called REPORTS with fields (title C(50),frx M,frt M) by APPE MEMO frx from Report1.frx, etc.
There is no facilty to add report objects or to change a report object's .ControlSource.
By saving the reports in a table, a user can create a library of reusable report styles.
The report can be run exactly as the client and the developer originally conceived it. Alternatively a completly new and exciting dimension in user defined report presentation can be experienced.
The interface is intuitive as the toolbar will be familiar to anyone using Office or graphics applications. Providing the developer error traps illegal values, the user will have a hard job crashing or trashing the report, and you can safely let your user "loose" on it!
Being WYSIWYG, the user gets an immediate impression of the report without the necessity to preview.