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 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
Problemas con la propiedad Parent

Saludos al Foro.

Cuando creo una ventana con la propiedad parent = self, es decir

Self -> ventana con estilo fsNormal

MiVentana:=TForm.create(self);
MiVentana.parent:=self;
MiVentana.show;

la nueva ventana aparece, pero sin tomar el foco adema los controles TEdits están inoperaivo. Me he dado cuenta tambien que el evento OnActivate no entra. Esto no ocurre si no asigno nada a parent.

Creo que alguien me dirá : Utiliza mdiForm/mdiChild, pero lo he estado probando y me da muchas pegas, entre las que destaco: el poder pintar un fondo de escritorio en el mdiForm o no poder controlar la presentacion de las ventanas activas mediante la pulsación de ctrl*tab.

Bueno espero de no haber liado mucho la perdiz.

Saludos
Responder Con Cita
  #2  
Antiguo 10-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No he comprobado lo que dices, pero, tal vez te resultara interesante (si es que te es menester) crear el formulario mediante el constructor "CreateParented" (o algo así). Es posible que a partir de ahí no tengas los problemas que mencionas, por otro lado, raros, raros, raros, me parece a mí, vamos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
Parent

Gracias por tu interes.

Antes de nada...¿Qué es lo raro?, el problema del parent o mis problemas con las ventanas mdi.

Sobre CreateParented, lo voy haber.

Chao
Responder Con Cita
  #4  
Antiguo 10-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por _Io
¿Qué es lo raro?
Pues lo raro (me parece a mí, pero, ya digo que no lo he comprobado) es que tengas problemas en hacer lo que mencionas. Es decir, no es la primera vez que uno quiere poner un formulario "en otro", y esto se consigue (por lo menos) utilizando la propiedad "Parent". Pero, siempre que intenté algo así no recuerdo haberme topado con los problemas que mencionas, por eso decía que me parece raro, raro, raro.

Claro que cosas más raras se habrán visto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
parent

Con la pregunta ¿Qué es lo raro?. Sólo quería saber si te referias a la pregunta en sí o a mis problemas con los mdi.

Efectivamente, como tú bien dices todo el mundo ha creado alguna vez, una ventana desde otra. Hasta yo . Pero nunca he utilizado el parent. y ahora que lo he utilizado me ha pasado ésto. El objetivo que andaba buscando era que la ventana creada estuviera delimitada en movimiento y espacio a su ventana padre.(Estilo mdi)

Chao
Responder Con Cita
  #6  
Antiguo 10-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por _Io
Efectivamente, como tú bien dices todo el mundo ha creado alguna vez, una ventana desde otra.
No, no, pero, yo me refiero, precisamente, a crear una ventana no desde otra, sino en otra, o sea, justo lo que quieres hacer tú. Y no recuerdo haber tenido los problemas que mencionas. Pero, claro está... dependerá de no pocas variables, o sea. Prueba a ver con el "CreateParented" (aunque no sé porqué me da ahora en pensar que no va a serte del todo útil, porque no se consigue exactamente lo mismo que utilizando la propiedad "Parent").

¿Porqué no haces una cosa? Inicia un nuevo proyecto a modo de prueba, y ahí trata de crear un formulario dentro de otro. Que el primero tenga componentes "TEdit" y demás, y pruebas a ver qué ocurre. Si te funcionase (como lo espero) habría que pensar más bien en que algo en tu proyecto está influyendo en los problemas que te surgen... a ver cómo salimos de ahí entonces...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
parent

Como una imagen vale más que mil palabras...

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(self) do
  begin
    parent:=self;
    show;
  end;
end;

end.

Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  action:=caFree;
end;

end.

Haber si ha suerte y me dices dónde me he equivocado.

Adjunto el ejemplo, que por cierto me da un error al compilar, me sale la ventana CPU y no lo sé interpretar.
Saludos
Archivos Adjuntos
Tipo de Archivo: zip prueba.zip (3,5 KB, 9 visitas)

Última edición por dec fecha: 10-08-2006 a las 14:14:51.
Responder Con Cita
  #8  
Antiguo 10-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. El código fuente es correcto (creo yo). Y según la ayuda de Delphi la propiedad "Parent" puede usarse para lo que quieres. Empero, la única forma (en las pruebas que he hecho) de que la cosa funcione tal como esperas, es cambiar la propiedad "BorderStyle" del "segundo formulario" por "bsNone". Con el resto de valores posibles para esta propiedad, efectivamente, ocurre lo que dices, y,... ahora mismo no sé porqué.

Pero, prueba a ver cambiando esa propiedad que te comento: a lo mejor te es bastante para conseguir lo que quieres.

Edito:

Cita:
Empezado por _Io
Adjunto el ejemplo, que por cierto me da un error al compilar, me sale la ventana CPU y no lo sé interpretar.
No he tenido problemas para compilar el ejemplo. Utilizo Delphi 7 Update 2 con Windows XP SP2... por si sirve de algo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
parent

Gracias Dec, por tú interés .
Chao
Responder Con Cita
  #10  
Antiguo 10-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por _Io
Gracias Dec, por tú interés .
¿Eso es que te funcionó o qué?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #11  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
parent

No
Efectivamente, la ventana con el borderstyle bsNone, si queda en el formulario
padre, pero..., por ejemplo el evento OnActivate no entra, y es en este evento, donde inicializo mis variables, ademas hay controles que no se inicializan bien, por ejemplo un componente heredado de stringGrid, no se pinta adecuadamente (se queda toda la rejilla en negro), en fin.....

Seguiré buscando.

Aprovecho tu interes, para comentarte lo que estoy buscando.

Partimos de un formulario principal que funciona como fondo de escritorio,con menu principal y barra de herramientas,la imagende fondo generalmente en diseño es una foto de Angelina jolie .

desde esta ventana principal se pueden ir activando distintas ventanas de gestión, las cuales el usuario las puede ir manejando a su inters etc.
Hasta aquí todo va bien.

El problema básicamente radica en el diseño. Quiero que una/s determinada/s ventanas con una funcion determinada (TPV), abarque todo el area cliente de la ventana principal, sin que por ello afecte al resto de ventanas de gestión que se podrán seguir manejando ( obviamente estarán superpuestas a las ventanas TPV)

Espero no haber liado mucho el tema.

Saludos





Responder Con Cita
  #12  
Antiguo 10-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por _Io
(...) por ejemplo el evento OnActivate no entra, y es en este evento, donde inicializo mis variables, ademas hay controles que no se inicializan bien, por ejemplo un componente heredado de stringGrid, no se pinta adecuadamente (se queda toda la rejilla en negro), en fin.....
Tal vez, y digo tal vez, podrías probar con el evento "OnShow". Y aprovechar ahí incluso para repintar la rejilla que mencionas... con el método "Repaint", ya sabes, con el que tiene que contar dicha rejilla.

Por otro lado, tal vez sea la respuesta más fácil, y además, si ya te has liado haciéndolo como dices... no sé yo, pero, ¿te planteaste que la aplicación fuera de tipo MDI? Ahora mismo no se me ocurre otra cosa... y lo lamento.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #13  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
parent

Gracias de nuevo.
Como dicen en una pelicula......
Cita:
La solución vendrá por si sola
Chao
Responder Con Cita
  #14  
Antiguo 10-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Entiendo lo que quieres hacer, pero no comparto el método...

Si el usuario tiene la ventana del TPV por detras y quiere mover una de las ventanas al frente, puede cometer el fallo de activar tal o cual botón del TPV, por ello, no veo una alternativa lo que estas planteando.

Si la ventana TPV no es muy grande, podrías acoplarla a la ventana MDI, o incluso dividir esa ventana de TPV en varios paneles con la funcionalidad Dock, es decir, que el usuario arrastre el panel que quiera y lo adose a los bordes del MDI.

Si no te sirve... pues a cambiar de diseño, nos olvidamos de ventanas MDI y simulamos el IDE de delphi 6/7, donde el menú es una ventana y se pueden abrir otras ventanas por todos los sitios. En este caso, puedes hacer un control al abrir las ventanas de forma que cada una se sitúe donde te apetezca, según el tipo de ventana. Controlando las propiedades "Constraint" de cada ventana podrás conseguir lo que quieres.

Incluso... podrías crear una ventana sin nada dentro y sin bordes, para que simule el fondo de una ventana MDI, usando los mensajes WM_WINDOWSPOSCHANGING de la ventana del menú puedes modificar el tamaño de esta nueva ventana.

A ver si entre todos te podemos dar más ideas, dicen que cuatro ojos ven más que dos

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 10-08-2006
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
Estube jugando con ese codigo y con otros nuevos para descartar alguna propiedad modificada. y si cuando mustro el form con la propiedad PArent:=form1; tengo el mismo resultado qu evos
pero lo que podes hacer es mostrarlo como modal.

es decir

Código Delphi [-]
with tform2.create(self) do
     showmodal;
y sino como dijo lepe TRabajar con Forms MDI
Responder Con Cita
  #16  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
parent

La verdad que se agradece la ayuda que se recibe.

Ante de descartar MDI. he tenido muchos contratiempos. Creo que en la fase en la que me encuentro todavía estoy a tiempo de volver. Os enumero los problemas.
  • Problemas al crear una imagen de fondo en el formulario principal.
  • Si tengo una ventana máximizada, y creo otra que no la está, la primera deja de estar máximizada.
  • Pulsando ctrl+tab, se van activando sucesivamente las entanas creadas. Si hubiera una que no me interesa que se active ¿Cómo lo hago?
En fin he pasado muchas horas intentando solucionar estas pegas, pero me rindo.Tambien debo decir que he empezado ahora a mirar las aplicaciones MDI, y seguramente me faltará :Tablas,conocimientos,tiempo,dinero,etc

Sobre hacer la ventana modal, no creo que sea una solución, pues me obliga a tener que cerrarla para abrir cualquier otra ventana de gestión.

Cita:
Si no te sirve... pues a cambiar de diseño, nos olvidamos de ventanas MDI y simulamos el IDE de delphi 6/7, donde el menú es una ventana y se pueden abrir otras ventanas por todos los sitios. En este caso, puedes hacer un control al abrir las ventanas de forma que cada una se sitúe donde te apetezca, según el tipo de ventana. Controlando las propiedades "Constraint" de cada ventana podrás conseguir lo que quieres.

Incluso... podrías crear una ventana sin nada dentro y sin bordes, para que simule el fondo de una ventana MDI, usando los mensajes WM_WINDOWSPOSCHANGING de la ventana del menú puedes modificar el tamaño de esta nueva ventana.
Puede ser una solución, que empezaré a mirar cuando descanse un poco porque ya la vista no da para más

Gracias Compissss

P.D.
Si me solucionáis las pegas hasta me planteo volver con los MDIs
Responder Con Cita
  #17  
Antiguo 10-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Bueno, si es requisito imprescindible que la ventana del TPV se quede por detrás de las demás ventanas, no recomendaría trabajar con MDI.


Los problemas que te has encontrado son inherentes a los MDI, para solucionarlos hay que zambullirse en la VCL, derivar de TCustomForm haciendo tu propio MDI y modificando el comportamiento.

Para la imagen de fondo hay por ahí un código, pero la verdad, despues de usarlo y ver lo incomodo que era activar la imagen de fondo y desactivarla, dejé de usarla.

Para lo de maximizar.... bastante curioso, de hecho mirad el comentario que los hombres de borland añadieron al respecto:
(consideresé que Borland no añade casi comentarios a los fuentes, si en este caso lo hacen... por algo será )
Código Delphi [-]

// codigo original de Form.pas a partir de la linea 4417

        if FormStyle = fsMDIChild then
        begin
          { Fake a size message to get MDI to behave }
          if FWindowState = wsMaximized then
          begin
// quizás eliminando estas 2 lineas consigas lo que quieres, pero a saber
// que otro error pueda dar jejeje
            SendMessage(Application.MainForm.ClientHandle, WM_MDIRESTORE, Handle, 0);
            ShowWindow(Handle, SW_SHOWMAXIMIZED);
          end
          else
          begin
            ShowWindow(Handle, ShowCommands[FWindowState]);
            CallWindowProc(@DefMDIChildProc, Handle, WM_SIZE, SIZE_RESTORED,
              Width or (Height shl 16));
            BringToFront;
          end;
          SendMessage(Application.MainForm.ClientHandle,
            WM_MDIREFRESHMENU, 0, 0);
        end
        else
          ShowWindow(Handle, ShowCommands[FWindowState]);

Para CTRL + TAB (me picó la curiosidad ):
Código Delphi [-]

// código copiado de la unidad Forms.pas a partir de la línea 4317

procedure TCustomForm.CMDialogKey(var Message: TCMDialogKey);
begin
  if GetKeyState(VK_MENU) >= 0 then
    with Message do
      case CharCode of
        VK_TAB:
          if GetKeyState(VK_CONTROL) >= 0 then
          begin
//  cooooompadreeeeeee aqui estaaaaaaaamosssss
            SelectNext(FActiveControl, GetKeyState(VK_SHIFT) >= 0, True);
            Result := 1;
            Exit;
          end;
        VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN:
          begin
            if FActiveControl <> nil then
            begin
              TForm(FActiveControl.Parent).SelectNext(FActiveControl,
                (CharCode = VK_RIGHT) or (CharCode = VK_DOWN), False);
              Result := 1;
            end;
            Exit;
          end;
      end;
  inherited;
end;

Puesto que tendríamos que sobreescribir (override) este método, lo más oportuno me parece crear una lista de Objetos con varias propiedades, de tal forma que el usuario de la forma MDI añade en esa lista las ventanas que no se desea el foco. Justo en el código de color rojo, tendríamos que comparar si la forma hija es una de las que hay en la "lista negra" y si está, pasar a otra ventana hija.

Por supuesto el derivar de esta clase y modificar su comportamiento, puede traer efectos colaterales no deseados, y solo haciendo el cambio podrás averiguar si tienes esos efectos o no.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #18  
Antiguo 10-08-2006
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 Borland programmer
// quizás eliminando estas 2 lineas consigas lo que quieres, pero a saber
// que otro error pueda dar jejeje
Que comentarios tan curiosos hacen en Borland

pd: En una aplicación mdi, los formularios hijos, o todos están maximizados o ninguno lo está. No lo juro pero creo que éste es el comportamiento "normal" de Windows y va más allá de la VCL.

// Saludos
Responder Con Cita
  #19  
Antiguo 10-08-2006
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
parent

Definitivamente, para este proyecto dejo el MDI.
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
QReport has no parent window david duarte Impresión 1 19-01-2006 15:06:07
TreeView parent Caro OOP 4 09-11-2005 17:37:45
error : has no parent windows jorodgar Varios 5 23-05-2005 21:49:48
TTabSheet - TForm - Parent neon OOP 0 11-01-2005 16:34:03
Opciones de Parent pepelu1975 OOP 7 26-05-2004 18:35:36


La franja horaria es GMT +2. Ahora son las 16:14:10.


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