microsoft - rincon dynamics
AX2009 Pasa por todos los controles en forma de init (2)
¿Cómo es posible recorrer todos los controles en un formulario cuando se inicializa un formulario?
He intentado lo siguiente en los métodos init y run, pero no funciona:
for( i = 1 ; i <= element.form().design().controlCount() ; i++ )
{
control = element.form().design().controlNum(i);
switch ( control.handle() )
{
case classnum(FormBuildButtonControl):
element.initButton(control);
break;
case classnum(FormBuildStaticTextControl):
element.initStaticText(control);
break;
}
}
¿Hay alguna forma de hacer esto?
Cada control puede tener controles secundarios y controles principales. Solo pasas al primer nivel. Aquí hay un trabajo de muestra que muestra cómo usar la recursividad sobre los controles de formulario.
static void recurseOverAllFormControls(Args _args)
{
Form form = new Form(formstr(SalesTable));
void recurse(Object _parent, int _depth = 1)
{
int i;
str name;
str caption;
str dashes;
;
// Used for making it pretty
//-->
i = _depth;
while (i)
{
dashes += ''-'';
i--;
}
//<--
// Used for example of how to use data
//-->
if (SysTest::hasMethod(_parent, identifierStr(caption)))
caption = _parent.caption();
if (SysTest::hasMethod(_parent, identifierStr(name)))
name = _parent.name();
info(strfmt("%1%2[%3](%4)", _depth, dashes, name, caption));
//<--
// Escape condition!
if (_parent.controlCount() == 0)
return;
// Recursive statement
for (i=1; i<=_parent.controlCount(); i++)
recurse(_parent.controlNum(i), _depth+1);
}
;
recurse(form.design());
}
Editar : Ah alguien me golpeó a la respuesta. Con suerte, alguien apreciará mi trabajo de demostración.
El código que tiene funciona, pero solo se repite en el nivel superior del diseño. Necesita construir una función recursiva para iterar a través de todo el conjunto de controles, y colocarlo en el método init antes del super ():
void init()
{
int i;
void processControls(FormBuildControl fbc)
{
int j;
;
if (fbc.isContainer())
{
for (j = 1; j < fbc.controlCount(); j++)
{
//Process container, if you need to
processControls(fbc.controlNum(j));
}
}
else
{
//Control is not a container, process it here.
}
}
;
for (i = 1; i <= element.form().design().controlCount(); i++)
{
processControls(element.form().design().controlNum(i);
}
super();
}
La llamada super () inicializará automáticamente todos los controles en el formulario. Una vez que se hayan inicializado, no podrá usar los objetos de tipo FormBuildControl
para configurar los campos, ya que ya se consumirán en el formulario. Si necesita modificar el campo después de la inicialización, debe consultar el campo directamente (aunque no estoy seguro de cómo podría obtener el nombre del campo y hacer referencia a él a través de X ++).
En lugar de inicializar condicionalmente los controles, llame a super () y simplemente oculte el campo condicionalmente, o use la seguridad para ocultar información a la que no quiere que tengan acceso ciertas personas.
EDITAR: Dado que se trata de FormBuildControl
s, que son diseños preinicializados, debe tener la llamada super () después de la llamada a ProcessControls. Cambié mi ejemplo para reflejar esto.