Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Orden formularios (https://www.clubdelphi.com/foros/showthread.php?t=76372)

Casimiro Notevi 27-10-2011 19:57:03

Cita:

Empezado por roman (Mensaje 416935)
De hecho, eso mismo es lo que le propongo con la "desktop bar", pero él quiere el dibujo azul bonito.
// Saludos

Que lo ponga transparente :D

newtron 27-10-2011 19:58:41

Gracias José Luis por la idea.

Cita:

Empezado por roman (Mensaje 416935)
De hecho, eso mismo es lo que le propongo con la "desktop bar", pero él quiere el dibujo azul bonito.

A ver.... si encima que mis programas no funcionan los hago feos ¿qué les quedaría a mis clientes? :D:D

newtron 27-10-2011 19:59:49

Cita:

Empezado por roman (Mensaje 416932)
Ok. Ahí te va una aproximación a lo que quieres:

Código Delphi [-]type TForm1 = class(TForm) private procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE; end; implementation procedure TForm1.WMMouseActivate(var Message: TWMMouseActivate); begin Message.Result := MA_NOACTIVATE; end;


// Saludos

... por cierto... ¿y esto qué es lo que hace?

José Luis Garcí 27-10-2011 20:00:25

Cierto Román, lo que pasa es que no conocia rel termino, ni cai en la cuenta de ello, de todas maneras, lo del fondo bonito que lo ponga en otro form que ocupe el resto de la pantalla, que no se pueda cerrar y que haga lo mismo que el Form del menú, así aunque otros form se abran encima, el menu es independiente, eso pienso yo, por lo menos, pero no me hagais mucho caso.:o:p:rolleyes:

José Luis Garcí 27-10-2011 20:08:51

Acabo de probar la demo de Román y es aún mejor de lo que yo pensaba, me parece super útil.

newtron 27-10-2011 20:10:10

Cita:

Empezado por Casimiro Notevi (Mensaje 416936)
Que lo ponga transparente :D

Que sepas que te ríes de mi y me da sentimiendo. :p

Cita:

Empezado por newtron (Mensaje 416938)
... por cierto... ¿y esto qué es lo que hace?

Uh... ya veo... que no le haga caso si picas en el menú.

Tampoco me sirve porque el programa se convertiría en Modal.

Yo quiero poder hacer algo así:

Uploaded with ImageShack.us

Casimiro Notevi 27-10-2011 20:22:20

Cita:

Empezado por newtron (Mensaje 416941)
Yo quiero poder hacer algo así:


Vale, y si alguien pincha en la ventana de menú que está detrás, ¿qué quiéres que haga?, es que creo que no tiene sentido lo que quieres, si pinchas en el menú, por fuerza, debe ponerse delante para hacer lo que quieras hacer con el menú, por lo tanto las ventanas que están delante quedarán detrás, es lógico, ¿qué quiéres hacer con esas ventanas? :confused:

roman 27-10-2011 21:13:20

Cita:

Empezado por newtron (Mensaje 416941)
Uh... ya veo... que no le haga caso si picas en el menú.

Tampoco me sirve porque el programa se convertiría en Modal.

A ver, por eso dije que era una aproximación. Con ese código no inhabilitas por completo el formulario menú, simplemente le impides activarse. Entonces, si para tu menú usas, por ejemplo, SpeedButtons, puedes pinchar uno de ellos y su acción se ejecutará aun cuando el formulario permanezca en el fondo.

Ahora, si no quieres usar botoncitos speedbutton entonces puede hacer como dice JoséLuis. Dejas el menú solito en una "desktop bar" y en otro formulario pones tu dibujo. En este formulario pones el código que te puse.

Claro, creo que ese formulario tiene otros botoncitos pero es que como dice Casimiro, lo que quieres es imposible: quieres que el usuario pinche un botón al cual no tiene acceso porque no quieres que se monte arriba de lo demás.

// Saludos

ecfisa 27-10-2011 21:54:03

Hola newtron.

Como te dije antes, sigo pensando que la opcion más simple es usar MDI...
Según la imágen de tu form principal (que ahora veo), hay uno o dos botones y algunos items que ignoro si responden a eventos del mouse pero no parece que ninguno de ellos necesiten capturar el foco del teclado.

Si mál no recuerdo tu problema era que los controles ubicados en el área cliente del MDIForm, quedan al frente de la ventana MDIChild abierta (comportamiento normal con MDI y TWinControl).
Entonces, una solución es que en lugar de usar descendientes de TWinControl, guardes esos botones e items como imágenes y utilices para mostrarlos unos TImage. De esa forma no tendras problemas de que solapen al MDIChild ya que al ser descendientes de TGraphicControl no tienen handle de ventana y no interferirán con el normal desempeño MDI.

Un saludo.

Casimiro Notevi 27-10-2011 22:32:43

Vamos a cambiarle el nombre, ahora será Newtron, El Incomprendido :)

roman 27-10-2011 22:55:41

Creo que ya dec lo dijo una vez: Lo que quiere hacer no se puede, y, además, es imposible.

// Saludos

Al González 27-10-2011 23:32:57

Off topic
 
No es lo mismo:
Cita:

Empezado por roman (Mensaje 416947)
[...] que el usuario pinche [...]

que:

...el pinche usuario que...

:D

ecfisa 28-10-2011 03:09:31

Hola de nuevo mi incompredido amigo... :)

Más o menos esto es de lo que te hablaba en el mensaje anterior:



Culpa tuya ahora todo el mundo se dará cuenta que mi manejo de imágenes (y mi gusto con las mísmas) son pésimos... :mad: :D

Un saludo.

Al González 28-10-2011 05:20:28

Cita:

Empezado por newtron (Mensaje 416930)
[...] el resultado que quiero es exactamente como si fueran formularios mdi/child pero con formularios normales.

Tal vez me perdí de algo, pero creo que esa frase resume lo que estás buscando.

Mi pregunta es: ¿por qué no le das al formulario principal (el que tiene el menú) el estilo fsMDIForm y a los demás el estilo fsMDIChild? Eso le otorgaría a tu aplicación el comportamiento que, pienso yo, estás necesitando.

Tú quieres que la aplicación trabaje bajo el modelo MDI, pero con formularios "normales". Pues bien, ¿por qué no nos explicas qué inconvenientes habría si los estableces como fsMDIChild? Varias de las desventajas naturales de este esquema, creo yo, podrían ser salvables.

Saludos.

newtron 28-10-2011 09:20:35

Cita:

Empezado por Casimiro Notevi (Mensaje 416953)
Vamos a cambiarle el nombre, ahora será Newtron, El Incomprendido

Si, estoy pensando en cambiar mi avatar a este:



Cita:

Empezado por ecfisa (Mensaje 416964)
Hola de nuevo mi incompredido amigo... :)

Más o menos esto es de lo que te hablaba en el mensaje anterior:



Culpa tuya ahora todo el mundo se dará cuenta que mi manejo de imágenes (y mi gusto con las mísmas) son pésimos... :mad: :D

Un saludo.

Pues a mi me mola, tiene un cierto toque galáctico. :)

Cita:

Empezado por Al González (Mensaje 416968)
Tú quieres que la aplicación trabaje bajo el modelo MDI, pero con formularios "normales". Pues bien, ¿por qué no nos explicas qué inconvenientes habría si los estableces como fsMDIChild? Varias de las desventajas naturales de este esquema, creo yo, podrían ser salvables.

El problema es que mis formularios son complejos y me está resultando complicado pasarlos a MDIChild pero creo que para dejar de ser el hazmerreir del foro :D voy a zanjar esto y seguiré trabajando en convertir los formularios a MDIChild, si es posible, porque me estoy encontrando con algún problema duro.

Como siempre gracias a todos por vuestra atención.

ecfisa 28-10-2011 10:14:24

Cita:

Empezado por newtron (Mensaje 416973)
voy a zanjar esto y seguiré trabajando en convertir los formularios a MDIChild, si es posible, porque me estoy encontrando con algún problema duro.

Entre tantos para aportar ideas, no habrá duro que no se ablande.

Vos andá tirando las dificultades que se te presenten y desde yá, contá con mi ayuda para que las cosas difíciles no te resulten sencillas. :D

Saludos. :)

Casimiro Notevi 28-10-2011 10:35:57

Cita:

Empezado por newtron (Mensaje 416973)
Si, estoy pensando en cambiar mi avatar a este:


Hombre, pero si es mi amigo Calimero :)

Cita:

Empezado por newtron
para dejar de ser el hazmerreir del foro :D voy a zanjar esto

Tampoco es eso, es simplemente que no se le ve mucha lógica, según nuestra lógica, que puede diferir de la lógica de los demás, como es lógico.

newtron 28-10-2011 17:09:49

Cita:

Empezado por ecfisa (Mensaje 416976)
Entre tantos para aportar ideas, no habrá duro que no se ablande.

Vos andá tirando las dificultades que se te presenten y desde yá, contá con mi ayuda para que las cosas difíciles no te resulten sencillas. :D

Saludos. :)

Gracias amigo. :)

Cita:

Empezado por Casimiro Notevi (Mensaje 416978)
Tampoco es eso, es simplemente que no se le ve mucha lógica, según nuestra lógica, que puede diferir de la lógica de los demás, como es lógico.

Si, totalmente lógico. :p

escafandra 30-10-2011 22:07:41

Me gustaría aportar mi granito de arena.

Si no entiendo mal, pretendes realizar una aplicación multiformulario que no sea MDI. Entonces Tu formulario principal se pone delante de todos tapándolos cuando se activa, siendo esto lo que quieres evitar. ¿Es así?.

Aunque pienso, coincidiendo con otros, que lo mejor es usar MDI, te propongo este ejemplo de aplicación multiformulario no MDI:

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
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.dfm}

function GetBackForm(Form: TForm): TForm;
var
  hWnd: Cardinal;
begin
  hWnd:= Form.Handle;
  Result:= Form;
  repeat
     if (FindControl(hWnd) is TForm) then Result:= FindControl(hWnd) as TForm;
     hWnd:= GetNextWindow(hWnd, GW_HWNDNEXT);
  until hWnd = 0;
end;

// Mostramos o creamos varios formularios
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Form3.Show;
end;

// Interceptamos los mensajes de MainForm
procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_MOUSEACTIVATE:
    begin
      if Lo(Message.lParam) = HTCAPTION then  
         Message.Result := MA_NOACTIVATEANDEAT
      else
         Message.Result:= MA_NOACTIVATE;
      exit;
    end;
    WM_WINDOWPOSCHANGED:
    begin
      // Aseguramos que MainForm esté siempre detrás
      SetWindowPos(Handle, GetBackForm(self).Handle, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
      exit;
    end;
  end;
  inherited WndProc(Message);
end;

end.


Aunque no me termina de convencer del todo, este ejemplo mantiene al formulario principal, siempre detrás del resto de los formularios de la aplicación.


Saludos.

escafandra 31-10-2011 00:33:55

Perdón :o.

Releyendo el código me he dado cuenta de que deje un gazapo al eliminar partes del código inútil tras realizar pruebas. Como no lo puedo editar, muestro aquí el gazapo y la corrección:

Donde dice:
Código Delphi [-]
if not S then inherited WndProc(Message);

Debe decir:
Código Delphi [-]
inherited WndProc(Message);

S es una variable que elimine...

Saludos.


La franja horaria es GMT +2. Ahora son las 12:25:51.

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