Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-04-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 15-04-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 15-04-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 15-04-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por mjjj Ver Mensaje
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
Responder Con Cita
  #5  
Antiguo 15-04-2009
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
Cita:
Empezado por roman Ver Mensaje
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.

Última edición por Cheerpipe fecha: 15-04-2009 a las 02:50:00.
Responder Con Cita
  #6  
Antiguo 15-04-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Cheerpipe Ver Mensaje
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? ¡Yo no estaría tan seguro!

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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 15-04-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Ah! Esto sí estuvo gracioso

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
Responder Con Cita
  #8  
Antiguo 15-04-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
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...
Responder Con Cita
  #9  
Antiguo 15-04-2009
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
Cita:
Empezado por Cheerpipe Ver Mensaje
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 .
Responder Con Cita
  #10  
Antiguo 15-04-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
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. 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 Ver Mensaje
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 .
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 Ver Mensaje
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...
Si me das un tiempo a que los cables se conecten y funcionen tal vez pueda ver el tema con mayor atención.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #11  
Antiguo 15-04-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Cheerpipe Ver Mensaje
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.


Cita:
Empezado por mjjj Ver Mensaje
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.
Archivos Adjuntos
Tipo de Archivo: zip Creacion de forms.zip (8,2 KB, 19 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear un Shape en Runtime David78 Gráficos 4 28-04-2010 22:03:54
Crear imagen en runtime salvica Gráficos 1 03-01-2008 17:58:16
Crear columnas en runtime Pedro-Juan OOP 8 09-02-2007 12:38:18
Crear índice en runtime Gabriel2 Tablas planas 2 17-11-2005 22:19:00
Crear QuickRep en RunTime MLePuff Impresión 2 18-10-2005 05:32:23


La franja horaria es GMT +2. Ahora son las 02:04:50.


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
Copyright 1996-2007 Club Delphi