Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Restaurar Ventana minimizada con biSystemMenu := False (https://www.clubdelphi.com/foros/showthread.php?t=77313)

gluglu 13-01-2012 13:35:58

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

roman 13-01-2012 16:45:00

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

ecfisa 13-01-2012 21:14:30

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.

roman 13-01-2012 21:47:55

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

ecfisa 13-01-2012 22:00:24

Hola.

Cita:

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

Saludos.

gluglu 14-01-2012 09:01:09

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.


La franja horaria es GMT +2. Ahora son las 20:14:47.

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