Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
On 14/08/2013 at 05:14, xxxxxxxx wrote:
User Information: Cinema 4D Version: 12-14 Platform: Windows ; Mac ; Mac OSX ; Language(s) : C++ ;
--------- Hi,
does anybody know how (and if it is possible) to retrieve the currently selected text in a multistring field? I am in a GeDialog btw.
I remember that there were messages sent when the user edits the field...maybe something like a message? I just don't remember where it was (way too long ago).
Thanks in advance Sam
On 14/08/2013 at 05:33, xxxxxxxx wrote:
have you tried bfm_action ?
On 14/08/2013 at 06:31, xxxxxxxx wrote:
Thanks first of all. BFM_ACTION was what I meant! However, none of the actual action states give me the current text selection afai can see.
On 14/08/2013 at 07:16, xxxxxxxx wrote:
hm, there are also these ids in bfm_message :
_<_t_>_ BFM_EDITFIELD_GETCURSORPOS | Returns the cursor position in an edit field ([LONG](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20C++/help/pages/ge_sys_math/typedef_ge_sys_math_584.html#LONG2)).
BFM_EDITFIELD_GETCURSORPOS
---|---
BFM_EDITFIELD_GETBLOCKSTART | Returns the block start position in an edit field ([LONG](file:///E:/Misc/SDK%20Help/C4d%20SDK%20Documentation%20C++/help/pages/ge_sys_math/typedef_ge_sys_math_584.html#LONG2)). <_<_t_>_
BFM_EDITFIELD_GETBLOCKSTART
sounds that the range between those could be the selected range, but i have never used them, so i might be wrong.
On 14/08/2013 at 07:54, xxxxxxxx wrote:
Yeah I had found these but they only seem to be for LONG edit fields (at least that was my assumption with the LONG statement), but I will try them. Thanks!
This is a snippet from my free AutoComplete plugin that finds the last word in a text box:
/////////////// This section gets the last word of text the user types into the texbox ///////////////// String allWords; //This will hold the entire text in the textbox String lastWord; //This will hold the last word that is typed into a text box if (msg.GetId()==BFM_GETCURSORINFO) { if(GetString(MY_MULTIBOX, allWords)) { LONG length = allWords.GetLength(); LONG pos = NULL; //The variable that will hold the position of the string Bool lastSpace = allWords.FindLast(" ",&pos, -1); //Find the last blank space and store it's position in the string if(pos>0) //If there is at least one empty space found { lastWord = allWords.SubStr(pos+1, length - pos); //Grab the last word (sub string) } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////
Hope that helps, -ScottA
On 14/08/2013 at 07:55, xxxxxxxx wrote:
thanks Scott. Browsing strings is not the issue but I really need the selected text.
On 14/08/2013 at 08:05, xxxxxxxx wrote:
I understood LONG in that way, that those container ids are of type LONG, providing the caret and block position as an integer value.
On 14/08/2013 at 08:12, xxxxxxxx wrote:
And I think you are absolutely right. Now that I also see SETCURSORPOS it seems pretty obvious. Thanks, I check if these work!
On 14/08/2013 at 15:47, xxxxxxxx wrote:
This is the solution I came up with for getting the selected text in a GeDialog() text box:
LONG myDialog::Message(const BaseContainer &msg, BaseContainer &result) { String text; this->GetString (1001, text); //Get the text in the text box (1001 is the id for the edit text gizmo) if(GetString(1001, text)) //If the edit text gizmo is not empty { //The cStart value is the position in the text where you started dragging(highligthing the text) //The cPos value is the current position the cursor is in //The range of selected text characters = cPos-cStart BaseContainer blockStart(BFM_EDITFIELD_GETBLOCKSTART); GeData bs = SendMessage(1001, blockStart); LONG cStart = bs.GetLong(); BaseContainer cursorPos(BFM_EDITFIELD_GETCURSORPOS); GeData cp = SendMessage(1001, cursorPos); LONG cPos = cp.GetLong(); LONG numSelected = cPos-cStart; //The number of selected text characters String selected = ""; if(numSelected >= 1) //If the user selected the text from left to right { GePrint("Start: " + LongToString(cStart) + " " + "Pos: " + LongToString(cPos) + " " + "NumSel: " + LongToString(numSelected)); for (LONG i=0; i<numSelected; i++) { String s = text.SubStr(cStart+i, 1); String combine = selected.operator+=(s); //Adds the current char to the "selected" string variable } } GePrint(selected); } return GeDialog::Message(msg,result); }
Seems to work pretty well. But I'm always interested in seeing how other people solve things. I learn new things that way. So if you figured out another way to so it. I'd love to see what you came up with.
-ScottA
On 28/08/2013 at 01:29, xxxxxxxx wrote:
Hi Scott,
thanks for your example. Anyway, this only seems to work for a normal text field not a multistring field. In a multistring field the values are always 0.
So there is no way to retrieve this in a multistring (multiline) field (question pointed at support)?