tutorial tag qué manager google fragmento contenedor delphi forms controls iterator vcl

delphi - qué - google tag manager tutorial



¿Hay alguna forma de obtener todos los controles en un control de contenedor? (5)

Está buscando la matriz TWinControl.Controls y la propiedad ControlCount la acompaña. Esos son para los hijos inmediatos de un control. Para obtener nietos, etc., use técnicas recursivas estándar.

Realmente no desea la matriz de Components (que es lo que itera el bucle for - in ) ya que no tiene nada que ver, en general, con la relación padre-hijo. Los componentes pueden ser propietarios de cosas que no tienen una relación infantil, y los controles pueden tener hijos que no son de su propiedad.

También tenga en cuenta que deshabilitar un control implícitamente deshabilita todos sus hijos, también. No puede interactuar con los hijos de un control deshabilitado; el sistema operativo no les envía mensajes de entrada. Sin embargo, para que parezcan deshabilitados, deberá deshabilitarlos por separado. Es decir, para que un botón tenga texto gris, no es suficiente desactivarlo, aunque el botón no responda a los clics del mouse. Debe desactivar el botón para que se "deshabilite".

Tengo un formulario con un montón de controles y quería iterar a través de todos los controles en un panel determinado y habilitarlos / deshabilitarlos.

Intenté esto:

var component: TComponent; begin for component in myPanel do (component as TControl).Enabled := Value; end;

Pero eso no hizo nada. Resulta que todos los componentes están en la colección de componentes del formulario, no en el objeto principal. Entonces, ¿alguien sabe si hay alguna forma de obtener todos los controles dentro de un control? (Además de una solución fea como esta, que es lo que terminé teniendo que hacer):

var component: TComponent; begin for component in myPanel do if (component is TControl) and (TControl(component).parent = myPanel) then TControl(component).Enabled := Value; end;

Alguien por favor dime que hay una mejor manera ...


Si deshabilita un panel, todos los controles están deshabilitados también.

Solución recursiva con métodos anónimos:

type TControlProc = reference to procedure (const AControl: TControl); procedure TForm6.ModifyControl(const AControl: TControl; const ARef: TControlProc); var i : Integer; begin if AControl=nil then Exit; if AControl is TWinControl then begin for i := 0 to TWinControl(AControl).ControlCount-1 do ModifyControl(TWinControl(AControl).Controls[i], ARef); end; ARef(AControl); end; procedure TForm6.Button1Click(Sender: TObject); begin ModifyControl(Panel1, procedure (const AControl: TControl) begin AControl.Enabled := not Panel1.Enabled; end ); end;


Aquí hay una forma Delphi 2007:

procedure TForm6.ModifyControl(const AControl: TControl; const value: Boolean); var i: Integer; begin if AControl=nil then Exit; if AControl is TWinControl then begin for i := 0 to TWinControl(AControl).ControlCount-1 do ModifyControl(TWinControl(AControl).Controls[i], value); end; Acontrol.Enabled := value; end; procedure TForm6.Button1Click(Sender: TObject); begin ModifyControl(Panel1, true); // true or false end;


Simplemente

Panel.Enabled := Value;


Sé que esta publicación es un poco antigua, pero vine aquí en base a una búsqueda de la misma información. Aquí hay un código C ++ que he elaborado para cualquier persona interesada.

// DEV-NOTE: GUIForm flattens the VCL controls // VCL controls are nested. I.E. Controls on a // Panel would have the Panel as a parent and if // that Panel is on a TForm, TForm''s control count // does not account for the nested controls on the // Panel. // // GUIControl is passed a Form pointer and an index // value, the index value will walk the controls on the // form and any child controls counting up to the idx // value passed in. In this way, every control has a // unique index value // // You can use this to iterate over every single control // on a form. Here is example code: // // int count = 0; // TForm *pTForm = some_form // TControl *pCtrl = 0; // do // { // pCtrl = GUIControl(pTForm, count++); // // }while(pCtrl); TControl *GUIControl(TForm *F, int idx) { TControl *rval = 0; int RunCount = 0; for(int i=0; i<F->ControlCount && !rval; i++) { TControl *pCtl = F->Controls[i]; if(RunCount == idx ) rval = pCtl; else rval = GUIChildControl( pCtl, RunCount, idx); RunCount++; } return(rval); } TControl *GUIChildControl(TControl *C, int &runcount, int idx) { TControl *rval = 0; TWinControl *pC = dynamic_cast<TWinControl *>(C); if(pC) { for(int i=0; i<pC->ControlCount && !rval; i++) { TControl *pCtrl = pC->Controls[i]; runcount++; if( runcount == idx) rval = pCtrl; else { TWinControl *pCC = dynamic_cast<TWinControl *>(pCtrl); if(pCC) { if( pCC->ControlCount ) rval = GUIChildControl(pCtrl, runcount, idx); } } } } return(rval); }