La Web del Programador: Comunidad de Programadores
 
    Pregunta:  34827 - CREAR UN COMPONENTE EN RUN TIME
Autor:  Josue Jimenez
Lo que pasa es que al inicio del programa creo unos clientes para comunicarme via socket!!!
Ejem:
Cliente:=TClienSocket.create(Cliente);

CLiente.name:=CSOperador;
etc....
Como puedo hacer referencia a ese componente con el nombre que le puse, en otra parte del codigo. Lo que pasa es que lo estoy haciendo asi porque necesito que se conencten desde el inicio, porque si establesco la conexion cuando la requiero tarda como 9 segundos en conectarse y pierdo mucha informacion. Es por ello que decido crearlos desde el inicio porque el numero de clientes es variable tengo que crearlos deacuerdo al numero que sean.

De antemano gracias!!!

  Respuesta:  Fernando Reyes
En primer lugar debes dejar el componente en alguna parte, yo lo dejaría en el form, así el segmento que escribiste quedaría algo así...

Cliente:=TClienSocket.create(Form1); // ojo con el owner...
Cliente.name:=CSOperador;
....

Después cuando quieras recuperar el componente puedes hacer un...

with TClienSocket( form1.findComponent(CSOperador) ) do begin
...
end;

si no tienes un Form (Owner) entonces ocupa un TStringList...

//en alguna parte antes de crear los sockets...
lista:=TStringList.create;
lista.sorted:=true;
lista.duplicates:=dupError; //para que no permita duplicados...
.....

//al momento de crear el socket...
lista.addObject( CSOperador , TClienSocket.create(nil) ); // con esto no es necesario ponerle nombre al Socket.
....

//para acceder al socket...
with lista.objects[ lista.indexOf(CSOperador) ] as TClientSocket do begin
....
end;

//y al finalizar, ya que no tienen "Owner" que los libere...
for i:=0 to lista.count-1 do lista.objects[i].free;