Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-10-2006
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Question Ventana MDI, "Siempre visible" y "Pantalla completa"

Hola, me preguntaba cómo podría incorporar a mi programa las opciones de pantalla completa y siempre visible. La ventana principal es una MDI. Para lo de pantalla completa he probado poner BorderStyle en bsNone y WindowsState en wsMaximized, pero me anula un HotKey que tiene el programa (no sé por qué) y cuando devuelvo a las propiedades los valores originales (bsSizeable, wsComoEstuviera) y la dejo "Normal" (wsNormal) ocupa toda la pantalla igualmente.
Para lo de siempre visible se me ocurrió poner un TTimer que cada poco tiempo coloque el programa por delante, pero eso es una chapuza y seguro que hay algún método mejor.

Muchas gracias, desde ya.


Edito: también me da problemas con las ventanas hijas (se comportan de forma exrtaña)
Responder Con Cita
  #2  
Antiguo 02-10-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por ixMike
La ventana principal es una MDI. Para lo de pantalla completa he probado poner BorderStyle en bsNone y WindowsState en wsMaximized, pero me anula un HotKey que tiene el programa (no sé por qué) (...)
Habría que tratar de averiguar qué puede estar pasando (¿tal vez alguna cosa rara porque la aplicación sea MDI?), porque, lo que dices es la manera correcta, que yo sepa, de hacer lo que necesitas.

Cita:
Empezado por ixMike
(...) cuando devuelvo a las propiedades los valores originales (bsSizeable, wsComoEstuviera) y la dejo "Normal" (wsNormal) ocupa toda la pantalla igualmente.
Tendrás que utilizar el método "SetBounds" del formulario en cuestión, o, en todo caso, "volver" a determinar el ancho, alto, "Left" y "Top" de dicho formulario ("SetBounds" puede hacer todo esto de una vez).

Cita:
Empezado por ixMike
Para lo de siempre visible se me ocurrió poner un TTimer que cada poco tiempo coloque el programa por delante, pero eso es una chapuza y seguro que hay algún método mejor.
Pues como no sea dar a la propiedad "FormStyle" el valor "fsStayOnTop"...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 02-10-2006
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Gracias por la información, pero no puedo poner FormStyle en fsStayOnTop porque entonces ya no es fsMDIForm (en mi versión de DElphi es así).

En cuanto a lo de SetBounds, ¿cómo se utiliza?
Responder Con Cita
  #4  
Antiguo 02-10-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Gracias por la información, pero no puedo poner FormStyle en fsStayOnTop porque entonces ya no es fsMDIForm (en mi versión de DElphi es así).
Pues tienes toda la razón del mundo... no sé cómo no me percaté del asunto... Ya no sé tampoco si bastaría, en ese caso, conque dieras un ancho y un alto para el formulario que coincidiera con las medidas de resolución de la pantalla... tendrías que probar: a lo mejor a algún compañero se le ocurre otra cosa.

Cita:
En cuanto a lo de SetBounds, ¿cómo se utiliza?
"SetBounds" es un método de la clase "TWinControl", esto es, y sirve para determinar las medidas de un control (un formulario, por ejemplo) de una vez. Algo así, para que se entienda:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  aLeft, aTop, aWidth, aHeight: integer;
begin
  aLeft := 10;
  aTop  := 20;
  aWidth := 500;
  aHeight := 400;

  // Esto...
  Self.SetBounds(aLeft, aTop, aWidth, aHeight);

  // Es lo mismo que esto...
  Self.Top := aTop;
  Self.Left := aLeft;
  Self.Width := aWidth;
  Self.Height := aHeight;
end;

De todos modos echa un vistazo a la ayuda sobre el método "SetBounds" no vaya a ser que se me pase algo importante...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 03-10-2006
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Pues muchas gracias,
y eso, a ver si a alguien más se le ocurre algo...
Responder Con Cita
  #6  
Antiguo 08-04-2007
d-hugo d-hugo is offline
Miembro
 
Registrado: abr 2007
Posts: 34
Poder: 0
d-hugo Va por buen camino
otras ideas

En cuanto a poner la ventana TopMost, tu problema se resuelve facilmente con la función API SetWindowsPos:

Código Delphi [-]
SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);

Poniendo la propiedad WindowState en swMaximized y usando esta función deberías conseguir lo que deseas.

Los flags SWP_NOMOVE y SWP_NOSIZE mantienen el tamaño y la posición actual de la ventana, de lo contrario tienes que llenar los parámetros que están en cero. Busca en la ayuda del Windows SDK para más información sobre la función.

Una ventaja de esta función sobre la propiedad fsStayOnTop (aparte de poderse usar en aplicaciones MDI) es que al poner y quitar dicha propiedad la ventana suele parpadear, cosa que no sucede al usar la función con los parámetros HWND_TOPMOST o HWND_NOTOPMOST según sea el caso.

En relación al hotkey, ten presente que hacer una ventana TopMost no implica que el hotkey será system wide. Es decir, que cuando la ventana pierda el foco perderás la funcionalidad del KeyPreview. Busca en Google con las siguientes palabras clave y encontrarás información al respecto:
delphi system wide hotkey

Disculpa lo tardío de la respuesta, pero me registré hace poco. En cualquier caso, pensé que esto podría servir de ayuda a otros.

Saludos, Hugo
Responder Con Cita
  #7  
Antiguo 09-04-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por d-hugo
Disculpa lo tardío de la respuesta, pero me registré hace poco. En cualquier caso, pensé que esto podría servir de ayuda a otros.
Sí. Está muy bien la respuesta. Me quedo con que la función "SetWindowPos" evita el desagradable parpadeo que se produce utilizando la propiedad "fsStayOnTop" de los formularios (no MDIs). Muchas gracias.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 11-04-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Muchísimas gracias, d-hugo.

Debido a los estudios y otros proyectos había dejado de lado el programa que me producía el problema (el cual no solucioné). Tendré que probar eso que me has dicho, parece ser la mejor opción.

Gracias otra vez. Saludos a todos.
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
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 12:01:19
"ChequeaEsto" elegido el futuro "Killer CLubDelphi" mamcx Noticias 51 31-10-2006 21:56:32
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 05:21:16
Tipo de Variable."String" ó "Double" UTECYBER OOP 7 15-12-2003 21:25:39


La franja horaria es GMT +2. Ahora son las 02:06:52.


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