Componentes visuales dinámicos

Te escribo para hacerte una super consulta, sabes, necesito crear instancias dinámicamente de las clases de los componentes visuales disponibles en Delphi, es decir, que en tiempo de ejecución pueda crear un control del tipo TEdit, haciendo que pueda pintar en un formulario la cantidad de TEdits necesarios de acuerdo a la cantidad de datos que tenga, y no vale ponerlos en tiempo de diseño, ocultarlos y luego visualizarlos, porque la cantidad de datos es variable, por favor dame una mano, es de vida o muerta.

2 Respuestas

Respuesta
1
Hi,
Mira, cualquier componente de Delphi posee la capacidad de crearse dinámicamente. Para tu caso especifico de los TEdit podes hacerlo de la siguiente forma:
- Creas un formulario nuevo (Form1)
- Creas un Botón nuevo (Button1)
- El evento OnClick del botón Button1 tiene que quedar de la siguiente forma:
***********************
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 9 do
with TEdit.Create(Self) do
begin
Name := 'Nahuel' + inttostr(i);
Parent := Form1;
Left := Random(Form1.width - Width);
Top := Random(form1.height - Height);
end;
end;
************************
- Se puede crear otro boton (Button2) para eliminar estos componentes creados
- El evento OnClick del boton Button2 tiene que quedar de la siguiente forma:
***************************
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
begin
for i := ComponentCount - 1 downto 0 do
if copy(Components.Name, 1, 6) = 'Nahuel' then
Components.Free;
end;
***************************
nahuelon..
Respuesta
1
Tienes que mirarte la documentación acerca de component, componentscount, control y controlscount. Crear componentes es fácil, pero estos no tienen nombre, o si lo tienen no es cómodo referirte a ellos por este. Es mejor hacerlo por su indice en el parent. Un ejemplo de creación es el siguiente código. Te crea (en el mismo sitio) componentes TEdit copia de los que tuvieras
var modelo:TEdit;
i:integer;
T:TObject;
begin
for i:=0 to frmLotes.componentcount-1 do
begin
T:=frmlotes.components;
if T is TEdit then
if (T<>DBEMoneda_Ini) and
(t<>DBEFecha_Alta) and
(t<>DBEMoneda_M2) then
begin
modelo:=TEdit.create(self);
modelo.Name:='CLON'+(T as TEdit).name;
modelo.text:='';
modelo.visible:=False;
modelo.parent:=(T as TEdit).parent;
modelo.top:=(T as TEdit).top;
modelo.left :=(T as TEdit).left ;
modelo.height :=(T as TEdit).height ;
modelo.width :=(T as TEdit).width ;
modelo.color :=(T as TEdit).color ;
modelo.font :=(T as TEdit).font ;
modelo.font.Style:=[fsbold];
modelo.borderstyle :=(T as TEdit).borderstyle ;
modelo.bringtofront;
modelo.onchange:=(T as TEdit).onchange;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas