*<Load>
* También pueden crearse las propiedades en tiempo de diseño
* Definir Propiedad Pick_Data en el formulario
Addproperty(Thisform,"Pick_Data","") && columnas del grid que se capturan (csv)
* Definir Propiedad _Separator en el formulario
Addproperty(Thisform,"_Separator","") && para Excel CHR(9), para otros, el que sea [ chr(124), chr(44), chr(59) ]
*</Load>
*<Init del form>
* Los valores pueden depender de una condición pasada por parámetro
* También pueden depender de la tabla o cursor asociado al grid
* O pueden depender de una acción del usuario en el formulario.
This.Pick_Data = "1,2,3,5" && Puede alterarse el orden, pe "1,3,5,2"
This._Separator = CHR(9)
*</Init del form>
*<Introducir BindEvent()>
* Este código debe ejecutarse una vez finalizada la configuración del Control Grid
* Suponiendo que tenemos un control grid llamado "grilla"
* En este caso se lia el evento DblClick. Cambiar por "Click" o "RightClick"
FOR i = 1 TO this.grilla.ColumnCount
lcCurrentControl = this.grilla.Columns(i).CurrentControl
BINDEVENT(this.grilla.Columns(i).&lcCurrentControl,"DblClick",thisform,"dlg_response")
NEXT
*</Introducir BindEvent()>
*<Método delegado de BindEvent>
* Method Name: "dlg_Response"
* Este método es llamado solamente por BindEvent()
* Los métodos delegados deben contener exactamente los mismos parametros que el evento sustituido
* Para el caso, el evento DblClick no tiene parámetros, por lo que no debe incluirse ninguno.
TRY
LOCAL lnEvents,;
loControl as Object,;
loGrid as Object,;
loex as Exception,;
lcSTring,;
lcCursor,;
lnColumns,;
lcPickData,;
i,;
lnCol
LOCAL ARRAY laEvents(1)
lcString = ""
* Si Empty(this.pick_data), tomará el valor de la celda seleccionada
* this.pick_data = "1,2,3,4"
* this.pick_data = ""
* this._separator = CHR(9)
lnEvents = AEVENTS(laEvents,0)
IF m.lnEvents > 0
loControl = laEvents(1)
loGrid = loControl.parent.parent
lcCursor = loGrid.recordsource
lnColumns = loGrid.ColumnCount
IF EMPTY(this.pick_data)
IF AT(".",loControl.ControlSource)>0
lcString = EVALUATE(loControl.ControlSource)
ELSE
lcString = EVALUATE(m.lcCursor+"."+loControl.ControlSource)
ENDIF
ELSE
FOR i = 1 TO GETWORDCOUNT(this.pick_data,CHR(44))
lnCol = VAL(GETWORDNUM(this.pick_data,m.i,CHR(44)))
IF m.lnCol > 0
lcControlSource = loGrid.Columns(m.i).ControlSource
IF AT(".",m.lcControlsource)>0
lcCapture = EVALUATE(m.lcControlSource)
ELSE
lcCapture = EVALUATE(m.lcCursor+"."+m.lcControlSource)
ENDIF
lcString = m.lcString ;
+ IIF(EMPTY(m.lcString),"",this._separator);
+ m.lcCapture
ENDIF
NEXT
ENDIF
ENDIF
* En este punto se puede enviar el valor de m.lcString a un cuadro de texto
* También puede dispararse un método del form o de una clase mediante raiseevent()
* Por ejemplo, si incluimos en el formulario un método llamado "Disparador"
* En el Load o Init del form
* Addproperty(thisform,"oClass",Thisform) && referencia al objeto que contiene el método
* Addproperty(thisform,"cRaise_DblClick","Disparador") && nombre del método que debe lanzarse
*
* Si se asigna un objeto a la propiedad .oClass, no olvidar
* <Destroy>
* This.oClass = null
* </Destroy>
* De otra forma puede que no se libere el formulario.
*
IF VARTYPE(this.oclass)="O" ;
AND !EMPTY(this.cRaise_DblClick) ;
AND PEMSTATUS(this.oclass,this.cRaise_DblClick,5)
RAISEEVENT(this.oclass,this.cRaise_DblClick,m.lcString)
ENDIF
CATCH TO loex
loex.UserValue = PROGRAM()
*ShowError(loex) && Rutina que muestra el error
FINALLY
loControl = null
loGrid = null
* Enviar el resultado al clipboard de Windows
_cliptext = m.lcString
ENDTRY
*</Método>
*<Metodo para RaiseEvent() - Name="Disparador"
LPARAMETERS tcString
Messagebox(m.tcString)
*</Metodo>