Ir al contenido


Foto

Form encima del borde superior de la pantalla del escritorio


  • Por favor identifícate para responder
12 respuestas en este tema

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 01 julio 2012 - 01:50

Aprovechando la oportunidad quisiera hacerles una consulta.

Como puedo hacer para que mi programa este encima de la pantalla de escritorio
es decir que traspase el borde superior y que no se vea.

trato de hacerlo con:



delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   form1.Top:=-form1.Height;
  4. end;



o con



delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   form1.Top:=(Screen.Height-Screen.Height)-self.Top;
  4. end;




se supone que debería quedar bien, pero no lo logró hacer pues no desaparece del
todo, se puede ver una parte del programa todavía...

Esperando su ayuda les adjunto imagenes de como quisiera que quedará



Saludos...

Archivos adjuntos


  • 0

#2 marcosp

marcosp

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 01 julio 2012 - 03:29



delphi
  1. self.top:=-(self.Height+30);



Creeeeoooo que la propiedad 'heigh' de un formulario no toma en cuenta la barra de titulo, solo el cuerpo.. En realidad el alto real del formulario seria: heigh+'alturaBarraTitulo'.

Ojo, esto es una deduccion mia, como para darle una explicacion a porque con 'self.top:=-self.Height;' sigue mostrando una parte del formulario.

Una pregunta: para que necesitas poner un formulario en esa posicion?.. pregunto por curiosidad nomas
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 julio 2012 - 05:56



delphi
  1. uses
  2. LCLIntf
  3.  
  4. procedure TForm1.FormCreate(Sender: TObject);
  5. var
  6.   R: TRect;
  7. begin
  8.   GetWindowRect(Handle, R);
  9.   Top:= R.Top-R.Bottom;
  10. end;

     

Saludos.
  • 0

#4 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 02 julio 2012 - 07:52

Gracias por sus respuestas, lo que pasa es que deseo hacer que el form aparezca de la nada en la parte superior como ejemplo: un aviso de antivirus...

Efectivamente, cuando al form le pongo  la propiedad de BorderStyle a BSnone (Ose sin borde) recién me funcionan los códigos que puse al principio, al parecer no me cuenta los bordes del "Caption"....

Estaré probando sus consejos y luego estaré subiendo mis avances.


Saludos...  :) :)
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 02 julio 2012 - 08:00

Puedes adaptar éste excelente código de nuestro estimado escafandra.

Saludos.
  • 0

#6 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 02 julio 2012 - 12:30

Buenas amiguitos y gracias por sus consejos, he estado acoplandolo a un ejemplo y me ha ayudado.
Funciona bien el aviso, además le he aumentado más código (para que se deslice y tenga forma semiredonda) y he logrado casi terminarlo
les comparto el código que he usado:

FORM1 (principal)




delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  9.   Unit2;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     Button1: TButton;
  17.     procedure Button1Click(Sender: TObject);
  18.     procedure FormCreate(Sender: TObject);
  19.   private
  20.     { private declarations }
  21.   public
  22.     { public declarations }
  23.   end;
  24.  
  25. var
  26.   Form1: TForm1;
  27.  
  28. implementation
  29.  
  30. {$R *.lfm}
  31.  
  32. { TForm1 }
  33.  
  34. procedure delay(msecs:integer);
  35. var
  36. FirstTickCount:longint;
  37.   begin
  38.     FirstTickCount:=GetTickCount;
  39.     repeat
  40.     Application.ProcessMessages; {allowing access to other
  41.     controls, etc.}
  42.     until ((GetTickCount-FirstTickCount) >= Longint(msecs));
  43.   End;
  44.  
  45. procedure TForm1.FormCreate(Sender: TObject);
  46. begin
  47.  
  48. end;
  49.  
  50. procedure TForm1.Button1Click(Sender: TObject);
  51. var
  52.   i, TimeSleep: integer;
  53. begin
  54.   form2.Show;
  55.   TimeSleep := 5;
  56.  
  57.   begin
  58.     for i := 1 to form2.Height do
  59.         begin
  60.         form2.Top := form2.Top+1;
  61.         //Sleep(TimeSleep);
  62.         delay(TimeSleep);
  63.         end;
  64.  
  65.     delay(3000);    // 3seg antes de volverse a ocultar
  66.  
  67.     for i := 1 to form2.Height do
  68.           begin
  69.           form2.Top := form2.Top-1;
  70.           //Sleep(TimeSleep);
  71.           delay(TimeSleep);
  72.           end;
  73.           // end;
  74.  
  75.  
  76.             begin
  77.             ShowMessage('Fin');
  78.             //form2.Hide;
  79.             //form2.Label2.Caption:=IntToStr(virus);
  80.             end;
  81.   end;
  82. end;
  83.  
  84. end.





Y este es del FORM2 (Aviso como antivirus):




delphi
  1. unit Unit2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  9.   StdCtrls;
  10.  
  11. type
  12.  
  13.   { TForm2 }
  14.  
  15.   TForm2 = class(TForm)
  16.     Button1: TButton;
  17.     Label1: TLabel;
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure FormCreate(Sender: TObject);
  20.   private
  21.     { private declarations }
  22.   public
  23.     { public declarations }
  24.   end;
  25.  
  26. var
  27.   Form2: TForm2;
  28.  
  29. implementation
  30.  
  31. {$R *.lfm}
  32.  
  33. { TForm2 }
  34.  
  35. procedure TForm2.FormCreate(Sender: TObject);
  36. var
  37.   f: HRGN;
  38.   R: TRect;
  39. begin
  40.     Left := (Screen.Width - Width) div 2;
  41.     GetWindowRect(Handle, R);
  42.     Top:= R.Top-R.Bottom;
  43.  
  44.  
  45.   // se crea el form en forma semiredonda
  46.   //Form1.Borderstyle := bsNone;
  47.   f := CreateRoundRectRgn(
  48.           0,            // x-coordinate of the region's upper-left corner
  49.           -40,            // y-coordinate of the region's upper-left corner
  50.           clientwidth,  // x-coordinate of the region's lower-right corner
  51.           clientheight, // y-coordinate of the region's lower-right corner
  52.           40,          // height of ellipse for rounded corners
  53.           40);          // width of ellipse for rounded corners
  54.   SetWindowRgn(Handle,f,True);
  55. End;
  56.  
  57. procedure TForm2.Button1Click(Sender: TObject);
  58. begin
  59.   close;
  60. end;
  61.  
  62. end.




pero ahora tengo otro problema, resulta que tengo dos Form, uno es el principal y el otro es el aviso que aparece desde arriba, yo al darle clic en el boton del form principal este llama al segundo que aparece desde arriba aparece deslizando pero como puedo hacer para que cuando le vuelva a dar otro clic el segundo form (aviso antivirus) ya no baje más osea que lo máximo que pueda bajar sea cuando su valor FORM2.TOP sea igual a 0.

Espero me puedan entender....    :)

Esperando su ayuda les adjunto mis avances....
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 julio 2012 - 04:04

Puedes adaptar éste excelente código de nuestro estimado escafandra.


Pues enecumene me ha animado a realizar esa adaptación para Lazarus en entorno Windows. He publicado el código y subilo un ejemplo para Lazarus aquí.


Saludos.
  • 0

#8 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 03 julio 2012 - 12:47

Gracias escafranda por tu ayuda, voy a tomarlo en cuenta.

He hecho algunas modificaciones al primer ejemplo que les mande y ya pude realizar lo que buscaba,
les comparto el código:


El FORM1 (Principal):




delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  9.   Unit2;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     Button1: TButton;
  17.     Button2: TButton;
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure Button2Click(Sender: TObject);
  20.     procedure FormCreate(Sender: TObject);
  21.   private
  22.     { private declarations }
  23.   public
  24.     { public declarations }
  25.   end;
  26.  
  27. var
  28.   Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.lfm}
  33.  
  34. { TForm1 }
  35.  
  36. procedure delay(msecs:integer);
  37. var
  38. FirstTickCount:longint;
  39.   begin
  40.     FirstTickCount:=GetTickCount;
  41.     repeat
  42.     Application.ProcessMessages; {allowing access to other
  43.     controls, etc.}
  44.     until ((GetTickCount-FirstTickCount) >= Longint(msecs));
  45.   End;
  46.  
  47. procedure TForm1.FormCreate(Sender: TObject);
  48. begin
  49.   Form2 := Tform2.Create(Self);
  50. end;
  51.  
  52. procedure TForm1.Button1Click(Sender: TObject);
  53. var
  54.   i, TimeSleep: integer;
  55. begin
  56. form2.Close;
  57. Form2 := Tform2.Create(Self);
  58. form2.Top:=-form2.Height; // esto hará que el aviso de arriba se vuela a ocultar
  59. form2.Show;
  60. //form2.destroy;
  61.   TimeSleep := 5;
  62.   begin
  63.     repeat
  64.             form2.Top := form2.Top+1;
  65.             delay(TimeSleep);
  66.             until form2.top=0;
  67.  
  68.     delay(3000);    // 3seg antes de volverse a ocultar
  69.     repeat
  70.             form2.Top := form2.Top-1;
  71.             delay(TimeSleep);
  72.             until form2.top=-form2.Height;
  73.  
  74.             begin
  75.             ShowMessage('Fin'); 
  76.             form2.Close;   
  77.             //form2.destroy;
  78.             end;
  79.   end;
  80. end;
  81.  
  82. procedure TForm1.Button2Click(Sender: TObject);
  83. begin
  84.   form1.Close;
  85. end;
  86. end.




El FORM2 (Aviso tipo antivirus);




delphi
  1. unit Unit2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  9.   StdCtrls;
  10.  
  11. type
  12.  
  13.   { TForm2 }
  14.  
  15.   TForm2 = class(TForm)
  16.     Button1: TButton;
  17.     Label1: TLabel;
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure FormCreate(Sender: TObject);
  20.   private
  21.     { private declarations }
  22.   public
  23.     { public declarations }
  24.   end;
  25.  
  26. var
  27.   Form2: TForm2;
  28.  
  29. implementation
  30.  
  31. {$R *.lfm}
  32.  
  33. { TForm2 }
  34.  
  35. procedure TForm2.FormCreate(Sender: TObject); // se crea en forma semiredonda
  36. var
  37.   f: HRGN;
  38. begin
  39.     Left := (Screen.Width - Width) div 2;  // alineación centrado
  40.     f := CreateRoundRectRgn(
  41.           0,            // x-coordinate of the region's upper-left corner
  42.           -40,            // y-coordinate of the region's upper-left corner
  43.           clientwidth,  // x-coordinate of the region's lower-right corner
  44.           clientheight, // y-coordinate of the region's lower-right corner
  45.           40,          // height of ellipse for rounded corners
  46.           40);          // width of ellipse for rounded corners
  47.   SetWindowRgn(Handle,f,True);
  48. End;
  49.  
  50. procedure TForm2.Button1Click(Sender: TObject);
  51. begin
  52.   form2.Close;
  53. end;
  54. end.

 


Lo he probado varias vecez (Windows 7) y me funciona.... pero tengo un pequeñito inconveniente....
Si lo prueban se darán cuenta que en el form2 (aviso tipo antivirus) le he puesto un boton para cerrarlo

con el siguiente código:



delphi
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. begin
  3.   form2.Close;
  4. end;



se supone que debe cerrar el form2, pero el problema es que si este form2 lo abro varias veces y lo cierro aún siguen saliendo el mismo form2 pero oculto... como si aún siguiera activo despues de cerrarlo.

mi pregunta es ¿como cerrar el form2 (aunque le de varios clic) para poder cerrar el form1 (principal)?


Gracias por sus respuestas....  :)

PD: les adjunto mi avances.

Archivos adjuntos


  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 julio 2012 - 01:37

Gracias escafranda por tu ayuda, voy a tomarlo en cuenta.


El tema al que puse el enlace esta referido a una ventana desplegable translúcida trabajando sólo con API de Windows, sin formularios. Está pensado para usarlo en aplicaciones optimizadas sin librerías de clases tipo VCL de delphi o LCL de Lazarus. Aunque funciona perfectamente en aplicaciones convencionales.


Saludos
  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 julio 2012 - 01:39

Mira estos cambios:


delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  9.   Unit2;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     Button1: TButton;
  17.     Button2: TButton;
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure Button2Click(Sender: TObject);
  20.     procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  21.     procedure FormCreate(Sender: TObject);
  22.   private
  23.     { private declarations }
  24.   public
  25.     { public declarations }
  26.   end;
  27.  
  28. var
  29.   Form1: TForm1;
  30.  
  31. implementation
  32.  
  33. {$R *.lfm}
  34.  
  35. { TForm1 }
  36.  
  37. procedure delay(msecs:integer);
  38. var
  39. FirstTickCount:longint;
  40. begin
  41.   FirstTickCount:=GetTickCount;
  42.   repeat
  43.     Application.ProcessMessages; {allowing access to other controls, etc.}
  44.   until (((GetTickCount-FirstTickCount) >= Longint(msecs)) or (Form2.Visible = false));
  45. end;
  46.  
  47. procedure TForm1.FormCreate(Sender: TObject);
  48. begin
  49.   Form2 := nil;
  50. end;
  51.  
  52. procedure TForm1.Button1Click(Sender: TObject);
  53. var
  54.   i, TimeSleep: integer;
  55. begin
  56.   if Form2 <> nil then
  57.   begin
  58.     Form2.Close;
  59.     FreeAndNil(Form2);
  60.   end;
  61.  
  62.   Form2 := Tform2.Create(Self);
  63.   Form2.Top:=-form2.Height; // esto hará que el aviso de arriba se vuela a ocultar
  64.   Form2.Show;
  65.   TimeSleep := 5;
  66.  
  67.   repeat
  68.     form2.Top := form2.Top+1;
  69.     delay(TimeSleep);
  70.   until form2.top=0;
  71.  
  72.   delay(3000);    // 3seg antes de volverse a ocultar
  73.  
  74.   repeat
  75.     form2.Top := form2.Top-1;
  76.     delay(TimeSleep);
  77.   until form2.top=-form2.Height;
  78.   ShowMessage('Fin');
  79.   form2.Close;
  80. end;
  81.  
  82. procedure TForm1.Button2Click(Sender: TObject);
  83. begin
  84.   Close;
  85. end;
  86.  
  87. procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  88. begin
  89.   Form2.Close;
  90. end;
  91.  
  92. end.                 




delphi
  1. unit Unit2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  9.   StdCtrls;
  10.  
  11. type
  12.  
  13.   { TForm2 }
  14.  
  15.   TForm2 = class(TForm)
  16.     Button1: TButton;
  17.     Label1: TLabel;
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure FormCreate(Sender: TObject);
  20.   private
  21.     { private declarations }
  22.   public
  23.     { public declarations }
  24.   end;
  25.  
  26. var
  27.   Form2: TForm2;
  28.  
  29. implementation
  30.  
  31. {$R *.lfm}
  32.  
  33. { TForm2 }
  34.  
  35. procedure TForm2.FormCreate(Sender: TObject);
  36. var
  37.   f: HRGN;
  38.  
  39. begin
  40.   Left := (Screen.Width - Width) div 2;  // alineación centrado
  41.  
  42.   f := CreateRoundRectRgn(
  43.       0,            // x-coordinate of the region's upper-left corner
  44.       -40,            // y-coordinate of the region's upper-left corner
  45.       clientwidth,  // x-coordinate of the region's lower-right corner
  46.       clientheight,  // y-coordinate of the region's lower-right corner
  47.       40,            // height of ellipse for rounded corners
  48.       40);          // width of ellipse for rounded corners
  49.   SetWindowRgn(Handle,f,True);
  50. end;
  51.  
  52. procedure TForm2.Button1Click(Sender: TObject);
  53. begin
  54.   Close;
  55. end;
  56.  
  57. end.


Saludos.
  • 0

#11 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 03 julio 2012 - 06:36

Gracias amigo escafandra, voy a probarlo y les aviso.... :)
  • 0

#12 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 13 julio 2012 - 09:06

Bueno amiguitos despues de probar el arreglo del amigo escafranda esta todo ok....

Solo había un problemin... que cuando habría el ejemplo adjuntado si lo primero que hacia era cerrarlo entonces salía un error de "Acces Violation" o algo asi..
Pero eso lo solucione cambiando el codigo del evento Onclose..... exactamente:



delphi
  1. procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  2. begin
  3.   //Form2.Close;  // lo marque como deshabilitado
  4. end;



Si estoy bien con eso todo estuvo perfecto....

ahora tengo otros inconvenientes..... pero ya los postearé.....de momento agradezco a todos por su ayuda..... :)

Saludos...


  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 julio 2012 - 10:12

Me alegra que hayas resuelto tu problema

Entonces asignamos éste hilo como resuelto.

Saludos
  • 0




IP.Board spam blocked by CleanTalk.