Estimado Vinicio,
El código ejemplo de José Oscar, es bueno pero está limitado, ya que sólo te indica la
obtención de nombres de un determinado contenedor.
El código proporcionado por Julio César Redríguez es más completo y con algunas adiciones te
puede servir, pero aún esta incompleto.
El siguiente código que te anexo, es similar al de julio césar, pero con diferentes modificaciones,
ya que él como yo nos basamos en los ejemplos que proporciona microsoft y que modificamos
para diferentes necesidades, ya que Julio Cesar lo utiliza para enfocar objetos, y yo lo utilizo
para para obtener nombres y propiedades para regresar configuraciones individuales de cada
usuario de cualquier formulario de un sistema.
Te sugiero que analices el código de Julio Cesar y el mio, pues obtendrás el resultado
que desees.
El siguiente código necesita lo siguiente para correr en forma eficiente:
En cualquier formulario crea el método
init_properties y pégale el codigo que te anexo,
tambien necesita una propiedad con nombre
save_properties que es la que contendrá
el resultado final.
El método init_properties lo puedes ejecutar desde el método Init de cualquier formulario,
no necesita de nada más.
*-Method Name is init_properties
LPARAMETER oContainer
*--
*-- Checks for General fields
*--
LOCAL i,oControlParent,nCtrlCount
IF PARAMETERS() = 0
m.oControlParent = THISFORM
ELSE
m.oControlParent = m.oContainer
ENDIF
DO CASE
CASE ATC("Pageframe",m.oControlParent.BaseClass)#0
nCtrlCount = oControlParent.PageCount
CASE ATC(m.oControlParent.BaseClass,"Optiongroup,Commandgroup")#0
nCtrlCount = oControlParent.ButtonCount
OTHERWISE
nCtrlCount = oControlParent.ControlCount
ENDCASE
FOR i = 1 TO m.nCtrlCount
DO CASE
CASE ATC("Pageframe",m.oControlParent.BaseClass)#0
THIS.Init_properties(m.oControlParent.Pages[m.i])
CASE ATC("Container",m.oControlParent.Controls[m.i].BaseClass) # 0 OR;
ATC("Page",m.oControlParent.Controls[m.i].BaseClass) # 0
THIS.Init_properties(m.oControlParent.Controls[m.i])
CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"Optiongroup,Commandgroup")#0
Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
m.oControlParent.Controls[m.i].Name+".Value = "+;
STR(m.oControlParent.Controls[m.i].Value)+CHR(13)
* review lisboxs and grids
* CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"ListBox,Grid") # 0
* Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
* m.oControlParent.Controls[m.i].Name+".Value"+CHR(13)
CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"ComboBox") # 0
lcNuloONumerico = IIF(TYPE("m.oControlParent.Controls[m.i].value")="N",;
STR(m.oControlParent.Controls[m.i].Value),'""')
Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
m.oControlParent.Controls[m.i].Name+".Value = "+;
lcNuloONumerico+CHR(13)
CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"Spinner") # 0
Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
m.oControlParent.Controls[m.i].Name+".Value = "+;
STR(m.oControlParent.Controls[m.i].Value)+CHR(13)
CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"Shape") # 0
Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
m.oControlParent.Controls[m.i].Name+".BackColor = "+;
STR(m.oControlParent.Controls[m.i].BackColor)+CHR(13) && Shape -backcolor-
* revisar a OleBoundControl
CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"OleBoundControl") # 0
Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
m.oControlParent.Controls[m.i].Name+".Value = "+;
m.oControlParent.Controls[m.i].Value+CHR(13)
CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"CheckBox") # 0
Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
m.oControlParent.Controls[m.i].Name+".Value = "+;
IIF(m.oControlParent.Controls[m.i].Value=.T.,".T.",".F.")+CHR(13)
CASE ATC(m.oControlParent.Controls[m.i].BaseClass,"TextBox,EditBox") # 0
lcNuloONumerico = IIF(TYPE("m.oControlParent.Controls[m.i].value")="N",;
ALLTRIM(STR(m.oControlParent.Controls[m.i].Value)),;
'"'+m.oControlParent.Controls[m.i].Value+'"')
If ATC("edtproperties",m.oControlParent.Controls[m.i].Name) = 0
Thisform.save_properties = Thisform.save_properties+SYS(1272, m.oControlParent)+"."+;
m.oControlParent.Controls[m.i].Name+".Value = "+;
lcNuloONumerico+CHR(13)
endif
ENDCASE
ENDFOR
*-----------
El resultado contenido en
save_properties lo coloco en un campo
Memo y leo el campo
memo con la siguiente sintaxis:
Nota: En mi caso tengo un archivo de nombre CN_CHART (Configuraciones de gráficos), que
contiene 2 campos, uno para una clave de usuario, y el otro para la config. un campo memo
con nombre
properties, así dispongo de la configuración por cada usuario y cuando ese usuario
ingresa, se le muestra su última configuración.
*-----------
* Extrae la configuración guardada en un campo memo con nombre properties
*
If SEEK(Thisform.Cnfg_key,"Cn_Chart")
select Cn_chart
SET MEMOWIDTH TO 100
STORE MEMLINES(properties) TO gnNumLines && Number of lines in memo field
STORE 0 TO _MLINE && Reset _MLINE to zero
FOR count = 1 TO gnNumLines && Loop for # of lines in memo field
lcMemo = MLINE(properties, 1, _MLINE) && Display each line
lcMemo = STRTRAN(lcMemo,"form1","Thisform") && Special case
if ATC(".Value",properties) > 0 OR;
ATC(".BackColor",properties) > 0
&lcMemo && contiene la linea leida del campo memo
endif
NEXT
ENDIF
*---------
Puedes reemplazar las siguientes lineas
if ATC(".Value",properties) > 0 OR;
ATC(".BackColor",properties) > 0
por
if ATC(".Name",properties) > 0
si sólo deseas obtener el nombre del objeto
Dedicale un rato al análisis del código y obtendrás buenos beneficios.
Atte
Daniel López desde México D.F.
From:
vinicio...@hotmail.comTo:
mundovis...@googlegroups.com