Más de uno habrá tenido la necesidad de poder seleccionar una palabra con un solo click dentro de un textbox:
Aprovechando que alguien hizo la pregunta en un foro de si se podía hacer esto en FoxPro con un solo click, me tomé un momento para aceptar el reto y dar la respuesta.
El siguiente código está en formato texto (guardarlo como "test_selword.sc2") y se puede regenerar el form original con FoxBin2Prg.
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!!
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.19" SourceFile="test_selword.scx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS dataenvironment AS dataenvironment
*< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" />
DataSource = .NULL.
Height = 0
Left = 0
Name = "Dataenvironment"
Top = 0
Width = 0
ENDDEFINE
DEFINE CLASS form1 AS form
*< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Text2" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Label1" UniqueID="" Timestamp="" />
Caption = "Form1"
DoCreate = .T.
Name = "Form1"
ADD OBJECT 'Label1' AS label WITH ;
Caption = "Selected word:", ;
Height = 17, ;
Left = 32, ;
Name = "Label1", ;
Top = 84, ;
Width = 84
*< END OBJECT: BaseClass="label" />
ADD OBJECT 'Text1' AS textbox WITH ;
Height = 23, ;
Left = 28, ;
Name = "Text1", ;
Top = 28, ;
Value = This is phrase for selecting words with a click, ;
Width = 276
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'Text2' AS textbox WITH ;
Height = 23, ;
Left = 28, ;
Name = "Text2", ;
Top = 104, ;
Width = 100
*< END OBJECT: BaseClass="textbox" />
PROCEDURE Text1.Click
LOCAL lnLeftLim, lnRightLim, lnWordLen, lnSelStart
lnSelStart = THIS.SelStart
*-- Search Left Limit
lnLeftLim = 1
FOR I = lnSelStart + 1 TO lnLeftLim STEP -1
IF SUBSTR(THIS.Text, I, 1) == ' ' THEN
lnLeftLim = I + 1
EXIT
ENDIF
ENDFOR
*-- Search Right Limit
lnRightLim = LEN(THIS.Text)
FOR I = lnSelStart + 1 TO lnRightLim
IF SUBSTR(THIS.Text, I, 1) == ' ' THEN
lnRightLim = I - 1
EXIT
ENDIF
ENDFOR
lnWordLen = lnRightLim-lnLeftLim+1
*-- If a space was selected, then do nothing
IF lnWordLen >= 1
THISFORM.text2.Value = SUBSTR(THIS.text,lnLeftLim,lnWordLen)
THIS.SelStart = lnLeftLim-1
THIS.SelLength = lnWordLen
ENDIF
ENDPROC
ENDDEFINE
Hasta la próxima! :-)
Excelente aporte mi estimado amigo.
ResponderEliminarFernando:
ResponderEliminarPara considerar las palabras que se siguen de un signo de puntuación, propongo la siguiente modificación:
*-- Search Right Limit
lnRightLim = LEN(THIS.Text)
FOR I = lnSelStart + 1 TO lnRightLim
*IF SUBSTR(THIS.Text, I, 1) == ' ' THEN
IF SUBSTR(this.Text,i,1) $ ",;.: "
lnRightLim = I - 1
EXIT
ENDIF
ENDFOR
Muchas gracias por tu esfuerzo!
Un abrazo
Fidel.