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 04-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
mostrar frame como modal

Hola

Estoy usando frames dentro de un formulario en Delphi, y no he hallado la forma de mostrarlos en forma modal... es decir, que cuando se muestren no se permita acceder al formulario de donde se creó el frame, por que no quiero que se modifiquen datos que tengo ahí....

¿Cómo puedo hacer para que se comporte así un Frame?

Saludos
Responder Con Cita
  #2  
Antiguo 04-06-2008
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,

Pues, me parece que podrías meter el "Frame" dentro de un formulario, y mostrar este "modalmente". Igual hay otra forma...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 04-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
claro, yo tengo los frames dentro del form...

pero desde el form no puedo hacer frame.showmodal, no existe ese procedimiento...

creo que debe ser algúna propiedad del frame, pero no se cual.... sigo probando...

es que no quiero tener que bloquear controles dentro del formulario principal ya que son muchos
Responder Con Cita
  #4  
Antiguo 04-06-2008
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,

Hum... ¿tal vez deshabilitando los controles del formulario, excepto los del frame en cuestión? ...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 04-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
Sip voy a hacer eso...

el problemita que tengo ahora, es que no puedo volver a activar los componentes del form principal...

No encuentro el evento OnClose... OnHide ... o algo por el estilo... el evento OnExit no se dispara cuando cierro el frame...
Responder Con Cita
  #6  
Antiguo 04-06-2008
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,

Pero, si "cierras el frame", tienes que hacerlo en algún sitio. Ese sería el lugar para volver a habilitar los controles, supongo. De todas formas, pienso que podrías mostrar el "frame" en un formulario, podrías usar un formulario vacío, que no contuviera el "frame" en tiempo de diseño, pero al que se lo insertaras en tiempo de ejecución (pienso en el mismo "frame" que muestras en el formulario "principal", por decirlo así). De este modo tendrías los eventos que necesitas. No sé qué te parece la idea.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 04-06-2008
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,

Ahí te adjunto una especie de ejemplo de esto último que he comentado, a ver si entra dentro de tus expectativas.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-07-2008 a las 20:15:40.
Responder Con Cita
  #8  
Antiguo 04-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
Hola Dec, muchas gracias por el ejemplo. Creo que antes de insertar el frame en tiempo de ejecución, prefiero usar directamente forms comunes...

El problema que tengo con ellos (frames) es que tienen arriba a la derecha el botón cerrar, y no se como capturar el evento cuando se cierran desde allí... Cuando cierro el frame desde otro lado si puedo volver a activar los controles sin problemas....
Responder Con Cita
  #9  
Antiguo 04-06-2008
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,

El evento de un botón situado en el "Frame" puedes "capturarlo" en el propio "Frame". Fíjate en el ejemplo que te envié. El botón que ves (que está dentro del "Frame") maneja su evento "OnClick". En este se averigua qué "Parent" tiene asignado el "Frame", de modo que se haga una cosa u otra.

Volviendo al ejemplo, el botón comprueba si su "Parent" es el formulario "principal" de la aplicación, y entonces no hace nada, simplemente. Pero, si el "Parent" es el formulario en el que incluimos el "Frame" en tiempo de ejecución, entonces cierra esta formulario, volviendo a asignarse como "Parent" el formulario "principal". No sé si te refieres a algo así o qué.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #10  
Antiguo 04-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
No me refería al ejemplo, sino al botón de cerrar q tienen los frames en la esquina superior derecha...

Cuando cierran el frame desde allí es el evento que me interesa capturar y no se como
Responder Con Cita
  #11  
Antiguo 05-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
Thumbs up

Bueno por ahora lo que voy a hacer es dejar los frames estaticos, es decir con la propiedad DragKind a dkDrag, de esa forma no aparece el bendito botoncito de cerrar...

eventualmente voy a colocar los frames en forms de la forma que indicas amigo Dec, es que todavia no le veo la gracia de hacerlo de esa forma contra usar directamente forms

me queda la inquietud de como capturar el evento 'al cerrar frame', ya que el evento 'onExit' se dispara solo cuando sucede 'OnHide' y no cuando el usuario apreta el botoncito cerrar....

Gracias y saludos
Responder Con Cita
  #12  
Antiguo 05-06-2008
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:
No me refería al ejemplo, sino al botón de cerrar q tienen los frames en la esquina superior derecha...
Cita:
(...) con la propiedad DragKind a dkDrag, de esa forma no aparece el bendito botoncito de cerrar..
Creo que me he perdido algo, porque, los "Frames" no tiene ningún botón "cerrar", si tú no se lo añades... me parece que estás hablando de formularios y no de "Frames"... como digo, los "Frames" son componentes que no incorporan botón alguno, son una especie de "lienzo" sobre el que situar los componentes que queramos, para reutilizarlos en otros lugares, algo así como "super paneles" (en el sentido de superhéroe), pero, no incorporan "nada" por sí mismos...

A ver qué está pasando aquí.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #13  
Antiguo 05-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
Cool

aquí está dentro de un circulo rojo el botoncito al que hago referencia :

http://img387.imageshack.us/my.php?i...toncitooz0.jpg


seteando la propiedad dragMode a DMAautomatic y la otra que hago referencia arriba a dkDrag el frame en cuestion se puede mover fuera del form... y es cuando aparece... y no puedo capturar el evento cuando el usuario apreta allí... ahora se entiende un poco mas?
Responder Con Cita
  #14  
Antiguo 05-06-2008
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 peccatum
aquí está dentro de un circulo rojo el botoncito al que hago referencia :

http://img387.imageshack.us/my.php?i...toncitooz0.jpg


seteando la propiedad dragMode a DMAautomatic y la otra que hago referencia arriba a dkDrag el frame en cuestion se puede mover fuera del form... y es cuando aparece... y no puedo capturar el evento cuando el usuario apreta allí... ahora se entiende un poco mas?
Sí; desde luego. Y me disculpo, pues desconocía esa cualidad de los "Frames".

Estoy tratando de hacer alguna prueba, pero, no consigo que el "Frame" se me muestre fuera del formulario (con el botón), ni aun usando las propiedades y valores que has mencionado, ¿tal vez el formulario también está implicado y necesito establecer alguna de sus propiedades de alguna manera?

Tal como imagino, tal vez podría capturarse el mensaje que Windows envíe a la ventana del "Frame" cuando se pulsa en el botón cerrar: el "Frame" no implementa un evento "OnClose", pero, podríamos mirar de capturar el mensaje de Windows susomentado. Pero como veo que el "Frame" tiene más eventos relacionados con el "Drag"... y yo en esto estoy pez... igual alguno de estos eventos sería el indicado...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #15  
Antiguo 05-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
Cita:
Empezado por peccatum Ver Mensaje
y la otra que hago referencia arriba a dkDrag
perdon, la propiedad DragKind la pongo a dkDock, entonces se puede mover el frame a cualquier lugar, incluso se puede resizear en tiempo de ejecución...

sacar el botón de algúna forma también me serviría...

Saludos!
Responder Con Cita
  #16  
Antiguo 05-06-2008
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
Interesante cuestión

El problema aquí es que ese botón realmente no pertenece al Frame. Cualquier derivado de TWinControl tiene la capacidad de arrastrarse fuera de su contenedor; lo mismo que haces con el Frame, puedes hacerlo con un Panel, por ejemplo, o ¡incluso con un Button! Al hacerlo con este último queda más clara la situación: al arrastar el control fuera del formulario, lo que sucede es que la VCL crea un formulario en caliente, de tipo TCustomDockForm e inserta en él el control.

Así pues, es con este último formulario con quien tenemos que lidiar.

Para ello, hay que capturar el mensaje CM_FLOAT del control (el Frame) que se le manda cuando -justamente- se pone a flotar y se crea el CutomDockForm.

El mensaje manda como parámetro dicho formulario y lo que podemos hacer es reemplazar su WindowProc por uno nuestro para interceptar el mensaje WM_CLOSE.

Aquí más o menos la idea:

Código Delphi [-]
type
  TFrame2 = class(TFrame)
  private
    OldHostWndProc: TWndMethod;

    procedure CMFloat(var Msg: TCMFloat); message CM_FLOAT;
    procedure HostWndProc(var Message: TMessage);
  end;

implementation

{ TFrame2 }

procedure TFrame2.CMFloat(var Msg: TCMFloat);
begin
  inherited;
  if (TObject(Msg.DockSource.DragTarget) is TCustomDockForm) then
  begin
    OldHostWndProc := TCustomDockForm(Msg.DockSource.DragTarget).WindowProc;
    TCustomDockForm(Msg.DockSource.DragTarget).WindowProc := HostWndProc;
  end;
end;

procedure TFrame2.HostWndProc(var Message: TMessage);
begin
  if Message.Msg = WM_CLOSE then
    ShowMessage('Frame Closed!');

  OldHostWndProc(Message);
end;

// Saludos
Responder Con Cita
  #17  
Antiguo 05-06-2008
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,

Ahí es nada Román. Yo me ví ayer tratando de sustituir el "WindowProc" (siguiendo código tuyo, por cierto) del "Frame" y... nada de nada. Y ahora se comprende perfectamente porqué no era posible hacerlo de ese modo, por lo menos hasta donde yo llegué. Nada, nada, que el que sabe, sabe, y el que no que aprenda.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #18  
Antiguo 05-06-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por dec Ver Mensaje
Hola,

Ahí es nada Román. Yo me ví ayer tratando de sustituir el "WindowProc" (siguiendo código tuyo, por cierto) del "Frame" y... nada de nada. Y ahora se comprende perfectamente porqué no era posible hacerlo de ese modo, por lo menos hasta donde yo llegué. Nada, nada, que el que sabe, sabe, y el que no que aprenda.
Hola, he estado siguendo este hilo porque nunca he usado frames, no se que beneficios aporte pero veo que tiene sus detalles, bien dices amigo dec el que sabe sabe y yo pues........ me pongo a estudiar

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #19  
Antiguo 05-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 89
Poder: 19
peccatum Va por buen camino
Gracias roman por el esclarecimiento de este tema, igualmente el codigo no me resulta del todo amistoso, jeje, voy a ver como lo soluciono.

Me queda una incógnita y es cómo hacer para que el usuario pueda mover uno de estos componentes libremente dentro del form, tal cual uno los mueve en tiempo de diseño, no en modo 'flotante' digamos.... quizás es una simple configuración de propiedades pero no he dado con ella...

Saludos y gracias...
Responder Con Cita
  #20  
Antiguo 05-06-2008
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 egostar Ver Mensaje
Hola, he estado siguendo este hilo porque nunca he usado frames, no se que beneficios aporte pero veo que tiene sus detalles
En realidad, como dije arriba, no son detalles de los frames. La flotación y anclaje (floating and docking ) son intrínsecas de cualquier control de ventana (TWinControl).

Los frames son simplemente (creo que ya lo mencionó dec) un "super panel": como un panel, puede agrupar distintos controles, pero, además tiene dos grandes ventajas:

1. Puede diseñarse como si se tratase de un formulario, esto es, en una ventana aparte, lo cual es muy cómodo cuando, por ejemplo, quieres trabajar con varios grupos de controles en un mismo formulario (alternándolos) y no quieres estar liándote con veinte páneles en tiempo de diseño.

2. Son reusables. Un Frame es como un componente que puedes insertar en uno o más formularios; le puedes definir propiedades y métodos.

// Saludos
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
Como mostrar Resultados de una consulta en componentes como los Edit,Label y DbGrids! danny Conexión con bases de datos 2 08-05-2008 23:35:46
Como mostrar con DevExpress la grilla como quedo en la última consulta? Alexander Conexión con bases de datos 3 27-03-2007 22:37:03
Como saber si me frame esta creado en cierto evento? Albano OOP 2 15-03-2007 23:13:44
mantaner una aplicación como modal Novás Varios 3 19-02-2004 16:33:44
Como acceder a los componentes de un frame? CORBATIN OOP 7 25-07-2003 20:24:23


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


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