En estos casos estaría bien que pasaras un código ejecutable, así lo modificariamos sin necesidad de tener que escribir tanto, pero como es navidad estas de suerte.
Espero que te sirva.., un abrazo y vamos con una cervecita bien fresquita para empezar el año.
Code: Select all
// ------------------------------------------------------------------------
// --> Salinetas24 - CONTROL DE LA BOTONERIA
// ------------------------------------------------------------------------
// En el año de nuestro Señor del 2021, y siendo el primer dia de Enero
// a la espera de poder tomarnos una cervecta con amigo y poder alternar
// sin mascarilla, aqui estamos, sin apenas libertad de movimiento.., pasando
// el tiempo programando....
// Espero que te sirva
// ------------------------------------------------------------------------
#include <hmg.ch>
PRIVATE aEstructura:={}
PRIVATE aCampos:={}
AgendaOpen()
aEstructura:=Agenda->(DbStruct())
//--> Nombre del Campo
FOR nFor=1 TO LEN(aEstructura)
AADD(aCampos,aEstructura [nFor][1])
NEXT
DEFINE WINDOW Form_1 ;
AT 0, 0 ;
WIDTH 475 HEIGHT 375 ;
TITLE "" ;
ICON "" ;
BACKCOLOR {128,128,255} ;
MAIN ;
NOMAXIMIZE NOSIZE ;
FONT "Arial" SIZE 9
ON KEY ESCAPE ACTION Form_1.Release
DEFINE MAIN MENU
POPUP "MENU"
MENUITEM "Crea Botones " ACTION CreaBotones(aCampos)
END POPUP
END MENU
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN
// ----------------------------------------------------
// Creo cinco botones
PROC CreaBotones()
LOCAL nFor, cBut, cMascara
LOCAL aField[4]
PUBLIC xVar, xFie
// Busca el resgistro Dbseek
Agenda->(DbGoto(1))
// Carga datos
aField[1]:=Agenda->CODIGO
aField[2]:=Agenda->NOMBRE
aField[3]:=Agenda->DIRECCION
aField[4]:=Agenda->MEMO
// LA PRESENTACION
FOR nFor=1 TO 4
cLbl:="SAY_"+STR(nFor,1)
@ 30*nFor,10 LABEL &cLbl PARENT Form_1 VALUE aCampos[nFor] AUTOSIZE TRANSPARENT
NEXT
// LA PETICION
FOR nFor=1 TO 4
cGet:="Get_"+STR(nFor,1)
DO CASE
CASE aEstructura[nFor,2] == "M" // Es un "MEMO"
xVar:=cGet
xFie:=aField[nFor]
nVar:= IF(aEstructura[nFor,3]*10<50, 50, IF(aEstructura[nFor,3] * 10 > 250, 250,aEstructura[nFor,3] * 10) )
* @ 30*nFor,120 LABEL &cGet PARENT Form_1 VALUE aField[nFor] WIDTH nVar-50
@ 30*nFor,250 BUTTON Btn_1 PARENT Form_1 CAPTION "MEMO" WIDTH 60 HEIGHT 27 ;
ACTION EditaMemo(xVar,xFie)
CASE aEstructura[nFor,2] == "N" // Campo tipo numerico
cMascara := REPLICATE( "9", aEstructura[nFor,3] )
IF aEstructura[nFor,4]!=0 // Tiene decimales
cMascara := REPLICATE( "9", aEstructura[nFor,3]-(aEstructura[nFor,4]+1) )
cMascara += "."
cMascara += REPLICATE( "9", (aEstructura[nFor,4] ) )
ENDIF
@ 30*nFor,120 TEXTBOX &cGet PARENT Form_1 VALUE aField[nFor] ;
WIDTH IF(aEstructura[nFor,3]*10<50, 50, IF(aEstructura[nFor,3] * 10 > 250, 250,aEstructura[nFor,3] * 10) ) ;
NUMERIC INPUTMASK cMascara
OTHERWISE // EL RESTO..., ya me he cansado.
@ 30*nFor,120 TEXTBOX &cGet PARENT Form_1 VALUE aField[nFor] ;
WIDTH IF(aEstructura[nFor,3]*10<50, 50, IF(aEstructura[nFor,3] * 10 > 250, 250,aEstructura[nFor,3] * 10) ) ;
MAXLENGTH aEstructura[nFor,3]
ENDCASE
NEXT
@ 20,320 BUTTON Actua_1 PARENT Form_1 CAPTION "Actualizar" WIDTH 120 HEIGHT 30 ;
ACTION VerValores(aField)
/*
cBut:="But_"+str(nFor,1)
@ 30*nFor,30 BUTTON &cBut PARENT Form_1 CAPTION 'Botonico '+str(nFor) WIDTH 150 HEIGHT 30 ;
FONT "Arial" SIZE 09 ACTION Muestra(cBton:=GetProperty( ThisWindow.Name, 'FocusedControl'))
*/
RETURN
// ---------------------------------------------------
// Comprueba nuevos valores
PROC VerValores(aField)
FOR nFor=1 TO LEN(aField)
cGet:="Get_"+Str(nFor,1)
aField[nFor]:= GetProperty("Form_1",cGet,"Value")
NEXT
// Y ahora los replace
Agenda->(DBAppend())
REPLACE Agenda-> CODIGO WITH aField[1]
REPLACE Agenda-> NOMBRE WITH aField[2]
REPLACE Agenda-> DIRECCION WITH aField[3]
REPLACE Agenda-> MEMO WITH aField[4]
msgdebug(aField)
RETURN
// ---------------------------------------------------
// Edita MEMO
PROC EditaMemo(xVar,xFie)
@ 150,10 editbox &xVar PARENT Form_1 VALUE xFie WIDTH 250 HEIGHT 90 NOHSCROLL
RETURN
// ----------------------------------------------------
// Ahora ya sabes el boton que ha pulsado
PROC Muestra(cVar)
cTrozo:=SUBSTR(cVar,5)
msgbox("HAS PULSADO EL BOTON "+cTrozo, "¡ATENCION!")
RETURN
Function AgendaOpen()
Local aarq := {}
Local aDados := {}
If ! FILE( "AGENDA.DBF" )
Aadd( aArq , { 'CODIGO' , 'N' , 04 , 0 } )
Aadd( aArq , { 'NOMBRE ' , 'C' , 40 , 0 } )
Aadd( aArq , { 'DIRECCION' , 'C' , 40 , 0 } )
Aadd( aArq , { 'MEMO' , 'M' , 25 , 0 } )
DBCreate( "AGENDA.DBF" , aArq )
EndIf
Use AGENDA Alias Agenda new shared
Return Nil