Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear TForm en Runtime (https://www.clubdelphi.com/foros/showthread.php?t=64687)

mjjj 14-04-2009 22:21:37

Crear TForm en Runtime
 
Hola amigos del foro.

Tengo una pregunta para ustedes.
Estoi haciendo una aplicacion que es un chat, con el cual se puede escribir en un canal abierto y lo pueden ver todos los usuarios conectados.

Ahora bien, quiero tener la posibilidad de tener una conversacion privada (como un messenger), en donde al apretar el boton de mensaje privado, me abra una ventana por cada usuario (tal cual como es messenger)

El asunto es que no puedo tener miles de form creados e ir poniendolos visibles.

Mi idea es crear form en runtime, con este código.

Código Delphi [-]
var componentT : TComponent;
Frame: TFrame;
begin
        with TForm.Create(self) do
        begin
                Left := 150;
                Top := 150;
                Width := 300;
                Height := 500;
                Name := listbox1.Items.Strings[slistbox1.itemindex];
                Caption := slistbox1.Items.Strings[slistbox1.itemindex];
                show;
        end;
        with TMEMO.Create(self) do
        begin
                Left := 7;
                Top := 8;
                Width := 257;
                Height := 273;
                Name := 'memo';
                Caption := '';
                Parent := self;
        end;
        with TEdit.Create(self) do
        begin
                Left := 7;
                Top := 287;
                Width := 257;
                Height := 21;
                Name := 'edit';
                Caption := '';
                onkeypress :=  Edit1KeyPress;
                Parent := self;
        end;
 
 end;
end;

aparte del form necesito crear un TEdit y un TMemo, el problema es que en la propiedad parent, no se como hacer referencia al TForm recien creado, porque si lo dejo como SELF, lo crea en el form en donde aprete en boton de mensaje privado.

Otra cosa, al apretar el boton de mensaje provado, y crea el componente TForm, antes de crear debiese comprobar si es que existe o no, sino me arroja un error de que ya existe un componente con ese nombre... como se hace para saber si existe o no algun componente?

Bueno, espero que me puedan ayudar.

Saludos y muchas gracias

roman 15-04-2009 01:08:41

Para referenciar al formulario recién creado necesitas asignarlo a una variable al momento de crearlo:

Código Delphi [-]
var
 Form: TForm;

begin
  Form := TForm.Create(Self);

  with Form do
  begin
    ...
    with TMemo.Create(Form) do
    begin
      ...
      Parent := Form;
      ...
    end;
  end;
end;

Pero por otra parte, no veo la necesidad de construir cada componente del formulario. Crea un formulario TVentanaPrivada (en tiempo de diseño) al que le pones todos los controles que necesites para ese formulario, lo quitas del AutoCreate y al moento de necesitar un privado creas tu formulario:

Código Delphi [-]
var
  Form: TVentanaPrivada;

begin
  ...
  Form := TVentanaPrivada.Create(Self);
  ...
end;

// Saludos

mjjj 15-04-2009 01:53:44

me parece una buena idea, pero de esa manera solo podre tener un solo privado a la vez.

siguiendo con la idea original, tengo un codigo que esta algo asi:

Código Delphi [-]
var form : Tform;
memo : Tmemo;
begin
   if key=#13 then
with (Sender as TEdit) do
begin
 form := FindComponent( slistbox1.Items.Strings[slistbox1.itemindex] ) as TForm;
 memo := FindComponent( 'memo' ) as TMemo;

with form do with memo do lines.Add(label2.caption+': '+text);

a donde quiero llegar con todo esto, el asunto es que como tengo varios form de mensajeria privada, necesito identificar en donde escribir lo que estoi mandando... es decir en cual TForm creado escribo lo que acabo de mandar al usuario en particular.

el codigo expuesto, no tira error al compilar, pero si al ejecutar el procedimiento.

espero me puedan ayudar.

Gracias

roman 15-04-2009 02:01:25

Cita:

Empezado por mjjj (Mensaje 344967)
me parece una buena idea, pero de esa manera solo podre tener un solo privado a la vez.

Y, ¿por qué crees esto? Así como creas muchos TForm, puedes crear cuanto TVentanaPrivada quieras.

Y yo lo que haría es llevar una lista (TList, TObjectList e incluso TStringList) de las ventanas privadas.

// Saludos

Cheerpipe 15-04-2009 02:46:50

Cita:

Empezado por roman (Mensaje 344970)
Y, ¿por qué crees esto? Así como creas muchos TForm, puedes crear cuanto TVentanaPrivada quieras.

Y yo lo que haría es llevar una lista (TList, TObjectList e incluso TStringList) de las ventanas privadas.

// Saludos

X2. Amigo, estas pensando de forma estructurada, debes abstarer el problema a una logica de objetos, ya veras como es de facil.

Por ultimo mjj, tengo que confesarte que tu razonamiento esta del todo equivocado, creo que te faltan ciertas bases necesarias para que puedas continuar programando tu aplicacion, y esa base se llama POO.

Delphius 15-04-2009 02:57:50

Cita:

Empezado por Cheerpipe (Mensaje 344973)
X2. Amigo, estas pensando de forma estructurada, debes abstarer el problema a una logica de objetos, ya veras como es de facil.

¿Que roman está siguiendo un enfoque estructurado?:rolleyes: ¡Yo no estaría tan seguro!;):D

En lo que si tal vez se podría llegar a discutir si es viable el uso de tener la lista.... La lista está hecha... en SCreen.Forms;)

Saludos,

roman 15-04-2009 03:26:16

¡Ah! Esto sí estuvo gracioso :D

Un TForm es una clase, un TVentanaPrivada es una clase (que hereda de TForm), un TList es una clase.

Delphius: Screen.Forms es una lista de todas las ventanas creadas, pero yo usaría una lista específica puesto que en ScreenForms puede haber muchas otras formas que no interesan.

// Saludos

mjjj 15-04-2009 03:38:16

seguramente me falta muchisimo que aprender, pero de apoco es la cosa...

porque no me echan una mano con este problemita... como debiera quedar mi codigo pa que funcione...

Cheerpipe 15-04-2009 04:33:08

Cita:

Empezado por Cheerpipe (Mensaje 344973)
X2. Amigo, estas pensando de forma estructurada, debes abstarer el problema a una logica de objetos, ya veras como es de facil.

Por ultimo mjj, tengo que confesarte que tu razonamiento esta del todo equivocado, creo que te faltan ciertas bases necesarias para que puedas continuar programando tu aplicacion, y esa base se llama POO.

Mi error, debi poner punto aparte y no seguido xD..

Mjj esta usando un enfoque esteucturado, y POO :).

Insito en que el amigo Mjj, podria partir por instruirse que es POO, con eso se le ará mas facil comprender el ejemplo de Roman, ya que es justamente, un enfoque muy correcto, digo muy correcto, porque siempre hay mas de 1 forma de solucionar un problema :D.

Delphius 15-04-2009 05:27:57

Cita:

Empezado por roman (Mensaje 344978)
Delphius: Screen.Forms es una lista de todas las ventanas creadas, pero yo usaría una lista específica puesto que en ScreenForms puede haber muchas otras formas que no interesan.

// Saludos

Lo se amigo. Nomás yo lo decía como alternativa, y... si... en parte para "calentar" el ambiente:p:D. Pues hay que ver... yo me digo ¿cuantas ventanas más pueden llegar a haber? Tampoco será para tanto ¿no?

Tal vez sea mucho más directo disponer de esa lista... pero con tal de evitarme estar haciendola yo me digo: "Va, que más da... si ya hay una usarla e ignorar las forms que no van"

Cita:

Empezado por Cheerpipe (Mensaje 344982)
Mjj esta usando un enfoque esteucturado, y POO :).

Insito en que el amigo Mjj, podria partir por instruirse que es POO, con eso se le ará mas facil comprender el ejemplo de Roman, ya que es justamente, un enfoque muy correcto, digo muy correcto, porque siempre hay mas de 1 forma de solucionar un problema :D.

En eso no te puedo discutir. Tal vez algo "más POO" le sea de mayor ayuda, lo que debería ver mjj es si dispone del tiempo, esfuerzo y conocimiento para apuntarle bien al tema.


Cita:

Empezado por mjjj (Mensaje 344980)
seguramente me falta muchisimo que aprender, pero de apoco es la cosa...

porque no me echan una mano con este problemita... como debiera quedar mi codigo pa que funcione...

Debo reconocer que yo estoy frio... y a estas horas tengo el cerebro un tanto desconectado:o...
Si me das un tiempo a que los cables se conecten y funcionen:p tal vez pueda ver el tema con mayor atención.

Saludos,

Neftali [Germán.Estévez] 15-04-2009 10:23:12

1 Archivos Adjunto(s)
Cita:

Empezado por Cheerpipe (Mensaje 344973)
X2. Amigo, estas pensando de forma estructurada, debes abstarer el problema a una logica de objetos, ya veras como es de facil.

Yo también creo Román, que si lo intentas podrás entenderlo. Revisa algún manual y busca en los foros. :D:D:D:D:D


Cita:

Empezado por mjjj (Mensaje 344980)
porque no me echan una mano con este problemita... como debiera quedar mi codigo pa que funcione...

Creo que la opción comentada de usar una lista e ir guardando los apuntadores a los formularios que creas es la mejor opción.
Además eso te permite tener controlados los form que creas y tienes creados y realizar operaciones con ellos.

Como bien te ha dicho Román no hace falta que crees el form en ejecución.

Creo que lo más sencillo es un ejemplo; Aquí te adjunto uno, además puedes controlar al tenerlos en la lista cosas como que la ventana privada ya esté abierta.

Échale un vistazo a ver si te sirve.


La franja horaria es GMT +2. Ahora son las 20:28:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi