1. Tracy Lamb
  2. PowerBuilder
  3. Friday, 23 September 2022 13:23 PM UTC

Hi all,

My customer noticed something very strange... when he's got my application running, then clicks on the desktop (or runs another app from his task bar), then comes back to my application, the Drag/Drop event is firing.  I sprinkled the code with a few messages... 

long ll_form
string ls_title
long ll_ThisRow, ll_LastRow, ll_DropRow, ll_DragRow

MessageBox("DragDrop","Event fired")
ll_DragRow = this.GetSelectedRow(0)
MessageBox("DragDrop","Drag Row "+ string(ll_DragRow))
if (source.TypeOf() = DataWindow!) then
	drag_dw = source
//	 Make sure it's the same datawindow...
	if drag_dw.DataObject <> "d_salesorder_workorders" then 
		return
	end if
else
	return
end if

MessageBox("DragDrop", "DragObject = d_salesorder_workorders")
ll_DropRow = row
this.SetRedraw( FALSE )

MessageBox("DragDrop","DropRow: " + string(ll_DropRow))
CHOOSE CASE drag_dw
	CASE this
//		 If dropped on same row, don't do anything...
		if ll_DropRow = ll_DragRow then

			this.SetRedraw( TRUE )
			return
		end if

//		 Otherwise, change the line_nbr#'s and re-sort
		if ll_DropRow > ll_DragRow then
			ll_LastRow = ll_DropRow
			for ll_ThisRow = ll_DragRow + 1 to ll_DropRow
				this.SetItem(ll_ThisRow,"line_nbr",ll_ThisRow - 1)
			next
//				this.SetItem(ll_DragRow,"line_nbr",ll_ThisRow)
		else
			ll_LastRow = this.RowCount()
			for ll_ThisRow = ll_DropRow to ll_LastRow
				this.SetItem(ll_ThisRow,"line_nbr", ll_ThisRow + 1)
			next
//				this.SetItem(ll_DragRow,"line_nbr",ll_ThisRow)
		end if
		this.SetItem(ll_DragRow,"line_nbr",ll_DropRow)
		this.Sort()
		this.SetRow( ll_DropRow )
		this.SelectRow(0, FALSE)
		this.SelectRow(ll_DropRow, TRUE)

	CASE ELSE

For starters, this event shouldn't be firing at all, but it is.  The ll_DragRow is indeed the currently highlighted row.  The source is a DataWindow! with the DataObject = d_salesorder_workorders.  And ll_DropRow (row parameter from event) is the same as ll_DragRow.  There's a check to see if the ll_DragRow = ll_DropRow.  If so, don't do anything.  For some reason, the whole script is executing, and row 1 on the dw is being re-assigned to line_nbr 0 , row 2 is line_nbr 2, etc.  

What would cause the Drag/Drop event to fire when my app loses focus then regains focus? PB2021, PFC12.5, Windows 10 operating system.

~~~Tracy

Accepted Answer
Tracy Lamb Accepted Answer Pending Moderation
  1. Monday, 26 September 2022 15:57 PM UTC
  2. PowerBuilder
  3. # Permalink

So this solution seems to work for the customer...

I moved the DragDrop event code to the DragWithin event.  This still works as advertised for drag/drop within the same DW to rearrange rows, or drag/drop between 2 dw's (same DataObject) to move a row from one DW to another.

Comment
  1. John Fauss
  2. Monday, 26 September 2022 16:09 PM UTC
Great news, Tracy! Thank you for the update.
  1. Helpful
There are no comments made yet.
John Fauss Accepted Answer Pending Moderation
  1. Friday, 23 September 2022 19:06 PM UTC
  2. PowerBuilder
  3. # 1

Hi, Tracy -

Please clarify: Is the drag-and-drop support intended for data/objects WITHIN your app's single window, within different windows in your app, or between applications?

Is it possible your app's window has issued a control.Drag(Begin!) PowerScript function (i.e., the control has been put into drag mode) before the user switches to another application? From what you have described so far, it sounds like your app's window behaves as if a drag operation is in progress when the user returns to it.

[Edit:] Are you setting DragAuto property of any controls to True?

Are you able to replicate the reported behavior or is it unique to this customer/user?

Best regards, John

Comment
  1. Tracy Lamb
  2. Friday, 23 September 2022 21:13 PM UTC
PS: this is the solution you provided me on June 30 to my question "How do I use dragdrop to re-arrange rows on a datawindow?
  1. Helpful
  1. Tracy Lamb
  2. Friday, 23 September 2022 21:17 PM UTC
PPS: I moved the script from DragDrop event to the DragWithin event... seems to work too, but my customer hasn't been able to test it yet. Not sure this would address the problem he first reported, app loses focus, then regains focus.
  1. Helpful
  1. John Fauss
  2. Saturday, 24 September 2022 22:49 PM UTC
I don't know what might be causing this behavior. Drag-and-drop is handled by OLE. PB utilizes the OLE interface and provides the four DragXXXXX events, but I've no idea why OLE believes a drag-and-drop operation is in progress when your app regains control.

If the app is designed to support drag-and-drop only from within the one window (between DW's, for example), then you might experiment with coding a control-name.Drag(Cancel!) PowerScript function call in that window's Activate event to see if that prevents the problem behavior. Let us know what you find out
  1. Helpful
There are no comments made yet.
Chris Pollach @Appeon Accepted Answer Pending Moderation
  1. Friday, 23 September 2022 14:20 PM UTC
  2. PowerBuilder
  3. # 2

Hi Tracy;

  Can you create  a simple (no PFC) one window + DWO test app with the D&D event coded and see if the D&D event fires?

If not, I suspect that it's your App or the PFC code interfering somehow.

Regards ... Chris

Comment
  1. Tracy Lamb
  2. Friday, 23 September 2022 14:39 PM UTC
What's the difference between DragDrop and DragWithin?
  1. Helpful
  1. Chris Pollach @Appeon
  2. Friday, 23 September 2022 15:16 PM UTC
DD = A drop has occurred

DW = A drag is underway
  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.