Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por Casimiro Noteví fecha: 31-10-2011 a las 00:41:03.
Responder Con Cita
  #2  
Antiguo 31-10-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Perdón .

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.
Responder Con Cita
  #3  
Antiguo 31-10-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.702
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Corregido
Responder Con Cita
  #4  
Antiguo 31-10-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Corregido
Gracias


Saludos.
Responder Con Cita
  #5  
Antiguo 31-10-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.225
Poder: 24
newtron Va camino a la fama
Gracias escafandra. Parece que tú has sido el único con la sensibilidad suficiente para entender mis penas.

"Bucearé" en tu código y te cuento.

Gracias de nuevo y un saludo
__________________
Be water my friend.
Responder Con Cita
  #6  
Antiguo 31-10-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.702
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por newtron Ver Mensaje
Gracias escafandra. Parece que tú has sido el único con la sensibilidad suficiente para entender mis penas.
Eso me ha herido, que uno también tiene su corazoncito
Responder Con Cita
  #7  
Antiguo 31-10-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.225
Poder: 24
newtron Va camino a la fama
Amigo escafandra.

El ejemplo que me has propuesto hace más de lo que yo necesitaba, he usado la parte del código que mantiene el formulario principal al fondo de los demás y me sirve a la perfección, era lo que estaba buscando (aunque os parezca raro, bueno, yo es que soy un tío raro ).

Cita:
Empezado por Casimiro Notevi Ver Mensaje
Eso me ha herido, que uno también tiene su corazoncito
No te pongas triste, ven que te dé un chillaito.... ayyyyyyyyyyyyyyyyyyyyyyyyy.... :P

Gracias a todos por vuestra atención y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #8  
Antiguo 31-10-2011
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
A ver, no entiendo. Yo iba por el mismo camino que escafandra (aunque no tan completo)

Cita:
Empezado por roman Ver Mensaje
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;
y sin embargo, mi opción la descartaste. Probando el código de escafandra noto que tampoco permite seleccionar opciones del menú. ¿Entonces?

Me siento ofendido, ja, ja

// Saludos
Responder Con Cita
  #9  
Antiguo 31-10-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
...mi opción la descartaste. Probando el código de escafandra noto que tampoco permite seleccionar opciones del menú. ¿Entonces?...
Bueno quizás mi código tiene dos partes. Una muy similar al tuyo y otra con otra filisofía. Newtron se quedó con la segunda:
Código Delphi [-]
// 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;

Esta segunda si permite accionar el menú pero tiene un efecto visual un poco "raro" en PCs mas antiguos.


Saludos.
Responder Con Cita
  #10  
Antiguo 31-10-2011
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
¡Ah! Ok. Entonces la parte del MouseActivate sale sobrando ¿no?

¿Cuál es el efecto raro en pcs viejos?

// Saludos
Responder Con Cita
  #11  
Antiguo 01-11-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
¡Ah! Ok. Entonces la parte del MouseActivate sale sobrando ¿no?
Bueno, relativamente. Si lo escribimos de la siguiente manera, funcionan los menús:
Código Delphi [-]
procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_MOUSEACTIVATE:
    begin
      if Lo(Message.lParam) = HTMENU then
         Message.Result:= MA_ACTIVATE
      else 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;

Cita:
Empezado por roman Ver Mensaje
¿Cuál es el efecto raro en pcs viejos?
El efecto es que si el PC es lento se aprecia sutilmente que la ventana principal se activa y luego se va hacia atrás. Se aprecia una aparición rápida y fugaz de los bordes del MainForm si se solapan con ventanas secundarias. Es por eso que incluí WM_MOUSEACTIVATE, con sus efectos secundarios, y el motivo por el que anuncié que no me terminaba de convencer.

Saludos.
Responder Con Cita
  #12  
Antiguo 01-11-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.225
Poder: 24
newtron Va camino a la fama
Cita:
Empezado por escafandra Ver Mensaje
Bueno quizás mi código tiene dos partes. Una muy similar al tuyo y otra con otra filisofía. Newtron se quedó con la segunda:
Exacto, de esta manera simulo que tengo formularios mdi, puedo seleccionar opciones del menú y las ventanas siguen al frente. Si te estorba alguna ventana porque se quede encima de alguna opción del menú la puedes mover o minimizar.

La razón de no usar mdi es porque yo uso un formulario propio que necesita crearse y asignarle una serie de propiedades antes de hacer el show, con los formularios mdi se ejecuta el show en el momento de crearlos. No sé si esto lo hubiera podido solucionar pero este y otros problemas los vería duros de resolver, era más fácil buscar la solución al tema de los menús.
__________________
Be water my friend.
Responder Con Cita
  #13  
Antiguo 02-11-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.225
Poder: 24
newtron Va camino a la fama
Amigo escafandra.

Esto se ha quedado estupendamente pero hay un pequeño detalle que rompe mi "paz interior" y es que si tengo un formulario abierto encima del menú y minimizo el menú, al volver a maximizarlo el formulario se queda detrás del menú. ¿Hay forma de arreglar eso?

Gracias y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #14  
Antiguo 02-11-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Una pregunta newtron, porque no pones una variable, que antes de entrar en el menu, o sea al peder el active un Form, grave el nombre del form, con lo cual al salir de la acción del menu abra el form guardado en la variable, vamos es una idea.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #15  
Antiguo 02-11-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por newtron Ver Mensaje
Amigo escafandra.

Esto se ha quedado estupendamente pero hay un pequeño detalle que rompe mi "paz interior" y es que si tengo un formulario abierto encima del menú y minimizo el menú, al volver a maximizarlo el formulario se queda detrás del menú. ¿Hay forma de arreglar eso?

Gracias y un saludo.
Haber si te entiendo. ¿Dices que si tienes un formulario abierto delante del Form Principal (al que tu, perece ser, llamas menú) y minimizas el Form Principal, al restaurarlo éste tapa al Form secundario?

Con el ejemplo que he usado eso no ocurre , es posible que no te entienda bien o que tengas incluidas cosas en tu código distintas a las mías.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Orden formularios newtron Varios 10 06-10-2011 14:03:37
Paneles en Orden ...... Efren2006 OOP 9 11-06-2010 12:36:02
Splash screen ,o splashscreen ,o form o ventana de inicio ,o orden de formularios Peterman C++ Builder 2 29-05-2007 19:46:22
Orden en TIBDataset barman Conexión con bases de datos 6 27-11-2003 10:40:25
Orden en TIBDataset barman Firebird e Interbase 6 24-11-2003 21:26:00


La franja horaria es GMT +2. Ahora son las 09:23:15.


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
Copyright 1996-2007 Club Delphi