miércoles, febrero 24, 2016

VFP: Seleccionar palabras de un textbox con un solo click

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! :-)

2 comentarios:

  1. Fernando:
    Para 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.

    ResponderEliminar