AdjustObjectSize Event

Occurs just before ReportListener begins rendering layout elements of type Shape or Picture.

PROCEDURE Object.AdjustObjectSize
LPARAMETERS nFRXRecno, oObjProperties

Parameters

Visual FoxPro passes the AdjustObjectSize event parameters in the following order:

  • nFRXRecno
    Integer data type, specifying the record number in the report or label definition file (frx or lbx) describing the layout element being rendered.
  • oObjProperties
    An object of Empty class, with members providing values relevant to adjusting the size of a Shape or Picture.

    oObjProperties member Type Usage

    reload

    Logical, defaults to .F.

    Flag to alert the ReportListener if you make changes.

    Set this value to True (.T.) to notify the ReportListener of changes to height or width.

    height

    Integer, valid values from 0 to 64000

    Height of layout element, in 960ths of an inch.

    If you change this value and set reload to .T., the ReportListener renders with the revised value.

    width

    Integer, valid values from 0 to 64000

    Width of layout element, in 960ths of an inch.

    If you change this value and set reload to .T., the ReportListener renders with the revised value.

    top,left

    Integer, readonly

    Coordinates of top- and left-most point of the Shape or Picture element. Provides information about the position of the layout element on the output page, for reference in calculations.

    reattempt

    Logical, readonly

    Indicates whether this element has been pushed to a second page because it did not fit on the previous page.

    maxheightavailable

    Integer, readonly

    Indicates the available room on this page for this element, allowing for the height of subsequent bands (such as the page footer) for which space must be reserved.

    Note

    Microsoft reserves the right to invoke AdjustObjectSize for additional report and label layout elements, as needed, and to add to the oObjProperties members appropriately for these additional layout element types. You can use nFRXRecno to test for layout element type, as shown in the sample code in Render Method.

Remarks

Applies To: ReportListener Object.

VisualFoxPro invokes AdjustObjectSize once for each layout element of type Shape or Picture, unless it finds no code in the derived ReportListener class at run time. It also does not call AdjustObjectSize if the element is in a band not marked Stretchable (fixed band height). For more information, see Report Band Properties Dialog Box.

Tip

To enhance performance, Visual FoxPro does not call either AdjustObjectSize or EvaluateContents if it determines that there is no code in the ReportListener for the event. If you usually include placeholder code or generalized code in every event, consider omitting such code for these two events, especially if the class level is abstract (never directly instantiated). Only include code at the class levels that actually use this functionality. The performance cost for AdjustObjectSize increases by approximately the same amount for each Shape or Picture element in a report; the performance cost for EvaluateContents varies. For more information, see EvaluateContents Event.

This feature is primarily for the use of ReportListeners interpreting certain Shapes as placeholders for custom objects, which they draw in the space reserved for the Shape in the layout.

AdjustObjectSize is not supported for Shapes or Pictures that stretch between any header and footer pair of bands, and does not support changes to shape curvature.

Although the oObjProperties parameter has several members, the only value that will affect the ReportListener’s rendering behavior is a change to oObjProperties.height. Change to oObjProperties.height is respected only if the new height is greater than the original height. This change will cause a change to the element’s height as rendered by the ReportListener and also cause other floating layout elements to be pushed down, and the band to stretch to accommodate the new height.

Because it is not supported for Shapes or Pictures that span bands, you cannot adjust the height of a Shape to continue through multiple pages. If the element does not fit on the page after the ReportListener has changed its height, the entire element will be pushed down to the next page. In some cases, because not all bands can span pages, this determination may result in the entire band being pushed to the next page. Refer to Report Bands for more information on which bands can span pages.

Use the oObjProperties.maxheightavailable member to determine the maximum size you can give the Shape or Picture without its being pushed entirely to the next page.

When you set a higher value than oObjProperties.maxheightavailable for oObjProperties.height and set oObjProperties.reload to True (.T.), the ReportListener's Render event is not called for this element on the current page. Instead, AdjustObjectPage is called again for the same element on the next page.

On the next page, oObjProperties.height is set back to its original value, oObjProperties.reattempt is set to True (.T.), and oObjProperties.maxheightavailable has a new value, based on the new value of oObjProperties.top on this page. At this point, you can re-evaluate the height you want for the element on the new page.

Warning

If you have set a height value too large for any page, the element will not display. No immediate error occurs, but continued assignments of such a value will cause the element to be re-pushed to subsequent pages repeatedly. Use oObjProperties.reattempt to avoid trying to reload the same value repeatedly, after your initial attempt.

Changes to the oObjProperties.width value do not affect the ReportListener’s base rendering behavior; however, they will be passed to your derived class for use in Render if oObjProperties.reload is True (.T.).

Both oObjProperties.height and oObjProperties.width have a valid range of 0 to 64000. If either value is set out of range, it snaps to 0 or 64000 and no error occurs.

oObjProperties.top and oObjProperties.left are read-only. They are passed for your derived class' reference, since there is no other way for the ReportListener to determine where in the page layout this instance of the element will be rendered.

Example

This example adjusts the height of a layout element in a report to display a differently-sized image for each record in a table. The filename for the image is stored in one column of the table and the desired image height (in inches) is stored in a second column of the table. The images referenced in each record may be a different height, and some records have no image file included. In the report layout, the image element is set to be only a few pixels high, an expression representing the table column holding the image filename is associated with this layout element. Elements in the same band below this region are set to float and stretch.

In the BeforeReport code, the ReportListener determines which record in the FRX layout definition describes the image, and saves this information for later use. When the AdjustObjectSize event occurs, the ReportListener checks its nFRXRecno argument to see if FRX element being evaluated matches its stored record number for the image element. If it does, the ReportListener adjusts the height of the image element to match whatever image is associated with this record.

Tip

Notice that the AdjustObjectSize code multiples the height value stored in the table by 960. The table stores its measurements in inches, and the ReportListener's rendering code handles measurements in 960 dots per inch (DPI).

DEFINE CLASS rl AS ReportListener
   FrxPic = 0
    
  PROCEDURE BeforeReport()
     SET DATASESSION TO (THIS.FRXDataSession)
     SELECT FRX
     LOCATE FOR ObjType = 17 && image
     IF EOF()
        THIS.FrxPic = 0
     ELSE
        THIS.FrxPic = RECNO()
     ENDIF
   ENDPROC

   PROCEDURE AdjustObjectSize(nFrxRecno,oProps)
       IF nFrxRecno = THIS.FrxPic 
          SET DATASESSION TO (THIS.CurrentDataSession)
          IF (NOT EMPTY(MyTable.picFile))
             * express in DPI units:
             oProps.Height = MyTable.picInches * 960
             oProps.Reload = .T.
          ENDIF
       ENDIF
   ENDPROC
   
ENDDEFINE

See Also

Tasks

How to: Add Shapes to Reports
How to: Add Pictures to Reports
How to: Set Stretching Report Controls

Reference

ReportListener Object
Round Rectangle Dialog Box
Rectangle/Line Dialog Box

Other Resources

Events (Visual FoxPro)
Language Reference (Visual FoxPro)