Detecting changes in a field

It might on occasion be useful to detect when the content of  a field changes. In this lesson we will see how to detect changes in a field by intercepting and handling messages.

How can you change the text in a field?

First we need to think about the ways that the text in a field can be changed

  • typing
  • deleting
  • pasting
  • cutting
  • dragging text into the field
  • dragging text out of the field

So we need to handle the messages that are sent when any of these actions occur.

Example Stack

Example Stack

For this example we will create a simple stack with 2 fields on it. When the text in the "Source" field changes the current text of the "Source" field will be copied to the "Destination" field.

Create a new stack and add 2 scrolling fields. Using the Property Inspector name the fields "Source" and "Destination".

The rawKeyUp message

The rawKeyUp message

We will use the rawKeyUp message to intercept and handle key presses. In this case we are using rawKeyUp rather than keyUp as it is sent when backspace, delete, return, command-v etc are pressed.

The keyUp message is only sent when a character key is pressed, if we chose to use that we would need to handle return, tab, backspace, delete, enter and command and function keys separately.

When we receive a rawKeyUp message we want to copy the text of field "Source" to field "Destination". The key press has already been registered and the key entered in the field so we can simply copy the text and then pass the rawKeyUp message up the message path. Select the Source field, open the code editor for the field, and enter this script:

on rawkeyUp
	copySourceToDestination
	pass rawkeyUp
end rawkeyUp

Put this copySourceToDestination handler on the card script:

on copySourceToDestination
	put field "Source" into field "Destination"
end copySourceToDestination

Now switch to run mode and try typing in the "Source" field.

Dragging and dropping text

Text can also be dragged in and out of the "Source" field. LiveCode automatically handles the mechanics of dragging and dropping text between and within unlocked fields so all we need to do is detect when text is dropped into or dragged out of the "Source" field and update the "Destination" field.

Dropping text into the source field

When text is dropped into the "Source" field a dragDrop message is received. In this case we can't simply call copySourceToDestination though as the text has not yet been added to the field when the message is received. Instead we must allow the dragDrop message to continue up the message path to be handled by the engine and then copy the text.

We do this by sending the message copySourceToDestination to the card in 0 milliseconds. This allows the current handler to complete before the message is sent, in this case it means the dragDrop message is handled and the text entered into the field before we copy the text to the "Destination" field.

on dragDrop
	send "copySourceToDestination" to this card in 0 milliseconds
	pass dragDrop
end dragDrop

Dragging text from the source field

This is very similar to dropping text into the field, in this case we handle the dragEnd message which is sent to the object a drag and drop started from, when the data is dropped. Again we let the message be handled before we copy the text to the "Destination" field.

on dragEnd
	send "copySourceToDestination" to this card in 0 milliseconds
	pass dragEnd
end dragEnd

 

2 Comments

Paul Agerbeek

I need to have a handler in the field that detects that in my case a substack has put data in a field. On textchanged does not do this unfortunately..

Mark

For completeness, another way of detecting changes in a field is to handle the "closeField" message which is sent when the focus is being removed from a field and the field contents have changed.

Add your comment

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.