1. Libby Engelbret
  2. PowerBuilder
  3. Monday, 13 January 2020 15:51 PM UTC

I am attempting to update a legacy PB desktop application that was NOT built with the PFC so that it will resize when maximized.  I retrofitted the PFC resize functions into the ancestor windows and datawindows of my application.  It seems to work fine until I get to resizing the information on the datawindows.  It will resize the columns to fit the larger datawindow horizontally, but not vertically.  I tried calling it with "scale" and "scalerightbottom" but neither worked.  Any suggestions?

John Fauss Accepted Answer Pending Moderation
  1. Monday, 13 January 2020 16:46 PM UTC
  2. PowerBuilder
  3. # 1

Hi, Libby -

What version of the PFC did you use to pull the resize functionality from? What PB version is your application using?

Comment
There are no comments made yet.
John Fauss Accepted Answer Pending Moderation
  1. Monday, 13 January 2020 22:41 PM UTC
  2. PowerBuilder
  3. # 2

I've never used the DataWindow Resize service in the PFC before, but I tested it using the PFC libraries for PB 2017 and using PB 2017R2. The service works, but it works differently than how you probably are expecting, so I presume this is why you are asking about this issue.

The resizing logic resides in the of_resize function of the pfc_n_cst_dwsrv object in the pfcdwsrv.pbl. It dynamically creates and executes DW Modify expressions that adjust the X,Y position, Width and Height properties of the registered DWObjects based on the resizing method requested when each DWObject is registered with the service.

It does NOT adjust the height of any band or the font height used in any DWObject. You can verify/test this by enlarging the height of say, the detail band and using a "box" border for the DWObjects in the detail band and register these objects using the SCALERIGHTBOTTOM resize method.

If you were expecting/hoping to also accomplish band and font height resizing, you'll have to either develop the logic yourself or ask the community if anyone has coded this functionality before and if so, is allowed to share their code with you.

Regards,
John Fauss

Comment
  1. Olan Knight
  2. Wednesday, 15 January 2020 01:10 AM UTC
John is correct.



Also please be aware that the PFC Resize service is rather limited, and that complex objects will befuddle the service. In many cases, especially with complex objects, you will need to code the resize event on the object itself, either extending the "of_resize()" function or coding to or adding to the Resize event of the object.



Olan
  1. Helpful
There are no comments made yet.
Libby Engelbret Accepted Answer Pending Moderation
  1. Wednesday, 15 January 2020 15:40 PM UTC
  2. PowerBuilder
  3. # 3

John and Olan,

Thank you so much.  That was the problem.  Once I set the detail band to be autosize height, everything worked fine.  BUT, I have another problem.  I can get everything to resize if I put a resize button on the datawindow that resizes the window and then the datawindow, but if I rely on it to resize automatically when I maximize it, it doesn't work.  It does call the resize event on both the window and the datawindow but nothing happens until I then click the button which has the window and datawindow resize code duplicated in it.  It's almost like the height and width are not reset until the maximizing is done, but which time the resize has already been called.  Any thoughts?

Comment
  1. Olan Knight
  2. Wednesday, 15 January 2020 16:09 PM UTC
POST the call to resize the DW when it is being opened.



Olan
  1. Helpful
There are no comments made yet.
John Fauss Accepted Answer Pending Moderation
  1. Wednesday, 15 January 2020 16:35 PM UTC
  2. PowerBuilder
  3. # 4

I'm glad to help, Libby.

There needs to be different "resizing" logic in two places: 1) The window, and 2) the DataWindow Control (DWC). The PFC implements this functionality via two non-visual objects: pfc_n_cst_resize/n_cst_resize for the windows and pfc_n_cst_dwsrv_resize/n_cst_dwsrv_resize for the DWC's.

The Resize event in the window fires in response to the user dragging the window border or clicking the Min/Max buttons. There needs to be code/logic in this event to manage the position and size of the various controls within the window that are to be affected by resizing, such as a DWC.

When the DWC gets resized by the code in the window's resize event. then the DWC's Resize event fires, so this is where the code that manipulates the DWObjects within the DWC needs to reside or be called from.

Both pieces are needed to implement the functionality you are wanting.

HTH, John

Comment
There are no comments made yet.
Libby Engelbret Accepted Answer Pending Moderation
  1. Wednesday, 15 January 2020 17:02 PM UTC
  2. PowerBuilder
  3. # 5

My datawindows are based on u_dw.  I have retrofitted the pfc code into the application and in the resize event of u_dw I have this:  

IF IsValid(inv_dwresize) THEN
inv_dwresize.event pfc_resize(sizetype, newwidth, newheight)
END IF

This compiles, and fires when the window is resized, but doesn't resize anything.  If I call the exact same code manually with a button, it does resize everything.

I put the following in the retrieveend event of u_dw, because I didn't know where else to do this.  If you have any other ideas, please let me know.  It does register the objects just fine, because it resizes all of them when I call it manually with the button.

string szObjects, szObject, szType
this.of_set_dwresize(true)
inv_dwresize.of_setrequestor(this)
inv_dwresize.of_SetOrigSize(this.width, this.height)
inv_dwresize.of_SetMinSize(this.width, this.height)
szObjects = this.Describe("datawindow.objects")

szObject = f_get_token(szObjects,"~t")
DO WHILE szObject <> '' // Register each object for resizing
szType = UPPER(this.describe(szObject + ".type"))
CHOOSE CASE szType
CASE "TEXT","GROUPBOX","COMPUTE","COLUMN","BUTTON","RECTANGLE", "PICTURE", "BITMAP"
inv_dwresize.of_register(szObject, 'Scale')
END CHOOSE
szObject = f_get_token(szObjects,"~t")
LOOP

Comment
There are no comments made yet.
Libby Engelbret Accepted Answer Pending Moderation
  1. Wednesday, 15 January 2020 17:08 PM UTC
  2. PowerBuilder
  3. # 6

In addition to my response below, I forgot to mention that I have this in the resize event of the window ancestor.  

IF this.Resizable and IsValid(inv_resize) THEN
inv_resize.event pfc_resize(sizetype, newwidth, newheight)
END IF

It does fire every time the window resizes, but doesn't resize anything.  I followed all of this through the debugger and it runs all the code but does not resize correctly (seems to be sending in the wrong height and width) until I call it manually with a button.

Comment
  1. John Fauss
  2. Wednesday, 15 January 2020 19:09 PM UTC
What units are your DataObjects (dw_1.DataObject = 'd_customer_maint') using? PowerBuilder Units (PBU's)?
  1. Helpful
  1. John Fauss
  2. Wednesday, 15 January 2020 19:30 PM UTC
DataObject units do not appear to affect the operation of the PFC's resize service. If you are using SCALE-type resizing methods, debug the calculation that determines the value for lr_resize_deltawidth & lr_resize_deltaheight in your equivalent to the of_Resize function in pfc_n_cst_dwsrv_resize. That's all I have to offer you.
  1. Helpful
There are no comments made yet.
  • Page :
  • 1


There are no replies made for this question yet.
However, you are not allowed to reply to this question.