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 13-01-2012
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Restaurar Ventana minimizada con biSystemMenu := False

Hola !

Tengo una ventana MDIChild que minimizo haciendo doble clic en el marco de la ventana. La propiedad biSystemMenu la tengo en False porque no quiero que se pueda cerrar esa ventana hasta que se introduzca por parte del usuario un valor válido en un TEdit.

Así que le he quitado todos los botones de menu con biSystemMenu := False, y he puesto BorderStyle := bsSingle.

Para minimizarla :

Código Delphi [-]
procedure TMiForm.WMNCLButtonDblClk(var Msg: TWMNCLButtonDblClk);
begin
  if WindowState = wsNormal then WindowState := wsMinimized;
end;

Una vez que la tengo minimizada, no logro volver a abrirla de ninguna de las maneras. Con cientos de otras ventanas MDI funciona perfectamente pero con esta, al no tener ningún botón de menú del sistema, al intentar hacer doble click en el marco de la ventana minimizada, el programe se mete en algún bucle que no logro identificar, pero se queda 'colgado'.

Como puedo restaurar la ventana sin tener que mostrar los botones del sistema, ya que si fuera así, tendría que mostrar entre otros el botón de cerrar la ventana MDI, cosa que como explico arriba, quiero evitar.

Gracias por vuestra ayuda !

Saludos
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 13-01-2012
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
De entrada, está muy raro eso de minimizar la ventana con doble clic, siendo que esa acción por defecto maximiza la ventana en lugar de minimizarla. Tampoco entiendo porqué quieres ocultar el botón de cerrar siendo que puedes evitar que cierren la ventana con el evento CloseQuery.

Aún así, algo que puedes hacer es inhabilitar el botón Cerrar en lugar de quitar el menú de sistema. Con la función siguiente:

Código Delphi [-]
procedure EnableSysCloseItem(Handle: HWND; Enable: Boolean);
const
  Flags : array[Boolean] of Integer = (MF_DISABLED, MF_ENABLED);

var
  SysMenu : HMENU;

begin
  SysMenu := GetSystemMenu(Handle, false);
  EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or Flags[Enable]);
end;

puedes habilitar o inhabilitar dicho botón y aún preservas los otros botones.

// Saludos
Responder Con Cita
  #3  
Antiguo 13-01-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
La propiedad biSystemMenu la tengo en False porque no quiero que se pueda cerrar esa ventana hasta que se introduzca por parte del usuario un valor válido en un TEdit.
Hola gluglu.

Otra opción para obtener el comportamiento que buscas, podría ser:
Código Delphi [-]
...
type
  TfrmChild = class(TForm)
    Edit1: TEdit;
    ...
  private
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  public
  end;
...
implementation

procedure TfrmChild.WMSysCommand(var Msg: TWMSysCommand);
begin
  if (Msg.CmdType = SC_CLOSE) and (Edit1.Text <> '1234') then // verificar contenido del Edit mediante una constante o variable
  begin
    ShowMessage('El dato ingresado es incorrecto');
    Abort
  end;
  DefaultHandler(Msg)
end;
...
También podés evaluar otras acciones: WM_SYSCOMMAND.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 13-01-2012
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
Pero para ese caso, está el evento CloseQuery. Por otra parte, si se hace la evaluación en WMSysCommand del formulario hijo, se podría cerrar el formulario principal saltándose la verificación.

// Saludos
Responder Con Cita
  #5  
Antiguo 13-01-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Cita:
Pero para ese caso, está el evento CloseQuery
Tenés toda la razón...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 14-01-2012
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Gracias a todos por responder. Me sirven todos los comentarios.

Suelo usar en todos los forms el WMSysCommand donde tengo otras comprobaciones que realizo.

La solución propuesta por Román también es válida.

Lo que finalmente no logro comprender es por qué cualquier otra venta MDI que minimizo, con los botones de sistema visibles, puedo volver a restaurarla haciendo doble click en el marco de la ventana minimizada, y por qué en el caso de no estar visible esos botones, no funciona.

Se me olvidó aclarar, y también vuelve a tener toda la razón Román, que la verdad es que doy una opción de minimizar con un icono dentro del propio Form, para que el usuario haga click ahí y se minimize (además de poder hacer doble click sobre el marco, aunque no sea lo habitual).

Ahí es donde el usuario minimizaría. Pero una vez que esté minimizada, lo lógico (al menos en MDI) es hacer doble click sobre el marco para restaurarla. Y es ahí donde por razones que no logro entender, Delphi hace la diferenciación entre si tiene o no los botones del sistema visibles.

Lo que pretendía era mostrar de entrada al usuario que ese Form no se puede cerrar si no es poniendo el dato correcto que solicito. Por eso, de entrada, quería quitar el botón de cierre. Lo que he dejado, es que de entrada el botón de cierre no se vea, y si se minimiza, muestro el botón de nuevo pero lo inhabilito como indica Román. Lo normal será que el usuario al ver esa ventana introduzca el dato que se le pide, y confirme con otro botón de confirmación dentro del Form.

Gracias a todos.
__________________
Piensa siempre en positivo !
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
Restaurar ventana previamente minimizada jorosmtz API de Windows 9 20-07-2010 19:04:27
Ventana minimizada rod203 API de Windows 1 17-11-2008 19:25:45
Canvas (ventana minimizada) ganegri Gráficos 5 17-07-2007 22:45:40
Resaltar una ventana minimizada johncook Varios 2 27-11-2004 14:10:00
Ventana Minimizada diegofhernando Varios 4 16-05-2003 15:32:25


La franja horaria es GMT +2. Ahora son las 14:58:08.


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