Hola, hace meses descubrí este método o truco en VB6 y ahora estoy intentando llevarlo a Delphi. Lo pueden encontrar en muchas de mis herramientas como Oricalco y FIFA 2010. Sin mas, comienzo.

Código: Seleccionar todo

Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cX As Long, ByVal cY As Long, ByVal wFlags As Long) As Long
Creo que todos conocemos esa función. Su función por lo general es hacer o poner a una ventana o form por encima de todos los demás. Esta será necesaria, aunque no indispensable para el correcto funcionamiento del método.

Lo primero que necesitaremos será abrir VB6 o cualquier otra versión. Después creamos otro Form, llamado Form2. En total son dos formularios. Para lograr la perfección recomiendo cambiar la propiedad StartUpPosition a 2, o sea CenterScreen.

Agregar un CommandButton llamado CommandButton1

Form1:

Código: Seleccionar todo

Option Explicit
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cX As Long, ByVal cY As Long, ByVal wFlags As Long) As Long

Private Sub Command2_Click()
Form2.Timer2.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
Unload Form2
End Sub

Private Sub Form_Load()
Form2.Show
SetWindowPos Me.hWnd, -1, 0, 0, 0, 0, 2 Or 1
End Sub
Todavía no ejecuten o pongan a correr el programa porque las probabilidades indican que dará error. Explico un poco: Declaramos la función SetWindowPos y en el Form_Load del Form1 la aplicamos. Después hacemos un Form2.Show (mostramos el form2). He aquí el por qué poner la propiedad StartUpPosition a 2 ya que cuando el form2 se muestra, lo hace detrás del form1 y no se llega a observa ningún parpadeo. Y en el Form_Unload, cerramos el form2.

En el Form2, agregar dos Timers llamados Timer1 y Timer2, respectivamente. Intervalos 1 ó 10 ó 100. El timer1con la propiedad enabled en True y el timer2 en False.

Form2:

Código: Seleccionar todo

Private Sub Form_Load()
Me.Width = 3930
Me.Height = 3420
End Sub

Private Sub Timer1_Timer()
Me.Left = Form1.Left + 500
Me.Top = Form1.Top + 1000
End Sub

Private Sub Timer2_Timer()
Dim C As Integer
For C = 3420 To 5710
Me.Height = C
Next C
Timer2.Enabled = False
End Sub
En el Form_Load aplicamos las dimensiones (archo y largo) del form2. Recomiendo dejarlas así, aunque este es un sólo un ejemplo con dimensiones personalizadas.

Código: Seleccionar todo

Private Sub Form_Load()
Me.Width =1
Me.Height = 1
End Sub
Continuamos con mi ejemplo, lo anterior es para cuando quieran perfeccionar.

El Timer1, mantiene una posición respecto al Form1, o sea que donde quieras que muevas el form1, el form2 mantiene su posición inicial. Ahora en el timer2 hacemos un desplazamiento a agrandamiento o cambiamos el Height del form2. El Timer2 está deshabilitado por lo que ese cambio no ocurrirá hasta que oprimas o des click en el Command1 del Form1.

En el Timer2 del Form2, pueden utilizar un integer o pueden hacer lo siguiente:

Código: Seleccionar todo

Sub UNO()
Me.Height = 3420
Me.Height = 3430
Me.Height = 3440
Me.Height = 3450
Me.Height = 3460
Me.Height = 3470
Me.Height = 3480
Me.Height = 3490
Me.Height = 3500
Me.Height = 3510
Me.Height = 3520
Me.Height = 3530
Me.Height = 3540
Me.Height = 3550
Me.Height = 3560
Me.Height = 3570
Me.Height = 3580
Me.Height = 3590
Me.Height = 3600
Me.Height = 3610
Me.Height = 3620
Me.Height = 3630
Me.Height = 3640
Me.Height = 3650
Me.Height = 3660
Me.Height = 3670
Me.Height = 3680
Me.Height = 3690
Me.Height = 3700
Me.Height = 3710
Me.Height = 3720
Me.Height = 3730
Me.Height = 3740
Me.Height = 3750
Me.Height = 3760
Me.Height = 3770
Me.Height = 3780
Me.Height = 3790
Me.Height = 3800
Me.Height = 3810
Me.Height = 3820
Me.Height = 3830
Me.Height = 3840
Me.Height = 3850
Me.Height = 3860
Me.Height = 3870
Me.Height = 3880
Me.Height = 3890
Me.Height = 3900
Me.Height = 3910
Me.Height = 3920
Me.Height = 3930
Me.Height = 3940
Me.Height = 3950
Me.Height = 3960
Me.Height = 3970
Me.Height = 3980
Me.Height = 3990
Me.Height = 4000
Me.Height = 4010
Me.Height = 4020
Me.Height = 4030
Me.Height = 4040
Me.Height = 4050
Me.Height = 4060
Me.Height = 4070
Me.Height = 4080
Me.Height = 4090
Me.Height = 4100
Me.Height = 4110
Me.Height = 4120
Me.Height = 4130
Me.Height = 4140
Me.Height = 4150
Me.Height = 4160
Me.Height = 4170
Me.Height = 4180
Me.Height = 4190
Me.Height = 4200
Me.Height = 4210
Me.Height = 4220
Me.Height = 4230
Me.Height = 4240
Me.Height = 4250
Me.Height = 4260
Me.Height = 4270
Me.Height = 4280
Me.Height = 4290
Me.Height = 4300
Me.Height = 4310
Me.Height = 4320
Me.Height = 4330
Me.Height = 4340
Me.Height = 4350
Me.Height = 4360
Me.Height = 4370
Me.Height = 4380
Me.Height = 4390
Me.Height = 4400
Me.Height = 4410
Me.Height = 4420
Me.Height = 4430
Me.Height = 4440
Me.Height = 4450
Me.Height = 4460
Me.Height = 4470
Me.Height = 4480
Me.Height = 4490
Me.Height = 4500
Me.Height = 4510
Me.Height = 4520
Me.Height = 4530
Me.Height = 4540
Me.Height = 4550
Me.Height = 4560
Me.Height = 4570
Me.Height = 4580
Me.Height = 4590
Me.Height = 4600
Me.Height = 4610
Me.Height = 4620
Me.Height = 4630
Me.Height = 4640
Me.Height = 4650
Me.Height = 4660
Me.Height = 4670
Me.Height = 4680
Me.Height = 4690
Me.Height = 4700
Me.Height = 4710
Me.Height = 4720
Me.Height = 4730
Me.Height = 4740
Me.Height = 4750
Me.Height = 4760
Me.Height = 4770
Me.Height = 4780
Me.Height = 4790
Me.Height = 4800
Me.Height = 4810
Me.Height = 4820
Me.Height = 4830
Me.Height = 4840
Me.Height = 4850
Me.Height = 4860
Me.Height = 4870
Me.Height = 4880
Me.Height = 4890
Me.Height = 4900
Me.Height = 4910
Me.Height = 4920
Me.Height = 4930
Me.Height = 4940
Me.Height = 4950
Me.Height = 4960
Me.Height = 4970
Me.Height = 4980
Me.Height = 4990
Me.Height = 5000
Me.Height = 5010
Me.Height = 5020
Me.Height = 5030
Me.Height = 5040
Me.Height = 5050
Me.Height = 5060
Me.Height = 5070
Me.Height = 5080
Me.Height = 5090
Me.Height = 5100
Me.Height = 5110
Me.Height = 5120
Me.Height = 5130
Me.Height = 5140
Me.Height = 5150
Me.Height = 5160
Me.Height = 5170
Me.Height = 5180
Me.Height = 5190
Me.Height = 5200
Me.Height = 5210
Me.Height = 5220
Me.Height = 5230
Me.Height = 5240
Me.Height = 5250
Me.Height = 5260
Me.Height = 5270
Me.Height = 5280
Me.Height = 5290
Me.Height = 5300
Me.Height = 5310
Me.Height = 5320
Me.Height = 5330
Me.Height = 5340
Me.Height = 5350
Me.Height = 5360
Me.Height = 5370
Me.Height = 5380
Me.Height = 5390
Me.Height = 5400
Me.Height = 5410
Me.Height = 5420
Me.Height = 5430
Me.Height = 5440
Me.Height = 5450
Me.Height = 5460
Me.Height = 5470
Me.Height = 5480
Me.Height = 5490
Me.Height = 5500
Me.Height = 5510
Me.Height = 5520
Me.Height = 5530
Me.Height = 5540
Me.Height = 5550
Me.Height = 5560
Me.Height = 5570
Me.Height = 5580
Me.Height = 5590
Me.Height = 5600
Me.Height = 5610
Me.Height = 5620
Me.Height = 5630
Me.Height = 5640
Me.Height = 5650
Me.Height = 5660
Me.Height = 5670
Me.Height = 5680
Me.Height = 5690
Me.Height = 5700
Me.Height = 5710
End Sub
Es mucho más trabajoso, pero mucho más personalizable.No solo es aplicable al Height del Form, sino también al Width, Left, Top y cualquier cosa lógica. Aquí os dejo el pequeño ejemplo en el que me he basado para hacer este post.

[Enlace externo eliminado para invitados]

Ya se me olidó por qué lo nombré así a este método. Cualquier duda comenten e intentaré ayudar.

Saludos.
mal ejemplo para demostrar el uso de la api que dices, incluso tu code funciona sin usar la api por que usas los timers que lo acomodan automaticamente, al igual los timers no deberian de ir, seria mejor un hook o algún evento que se produsca cuando muevas el primer formulario

Código: Seleccionar todo

Me.Height = 3420
Me.Height = 3430
Me.Height = 3440
esto tiene una secuencia.... podria ir dentro de un bucle, bueno para los que busquen algún ejemplo mas claro aqui les dejo esto del api guide

Código: Seleccionar todo

Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Private Sub Form_Activate()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: [email protected]
    'Set the window position to topmost
    SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub
K-0Z escribió:mal ejemplo para demostrar el uso de la api que dices, incluso tu code funciona sin usar la api por que usas los timers que lo acomodan automaticamente, al igual los timers no deberian de ir, seria mejor un hook o algún evento que se produsca cuando muevas el primer formulario

Código: Seleccionar todo

Me.Height = 3420
Me.Height = 3430
Me.Height = 3440
esto tiene una secuencia.... podria ir dentro de un bucle, bueno para los que busquen algún ejemplo mas claro aqui les dejo esto del api guide

Código: Seleccionar todo

Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Private Sub Form_Activate()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: [email protected]
    'Set the window position to topmost
    SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub
Esta función sería innecesaria si cuando le das click al form2 para activar una opción o cualquier cosa, este no se muestre completamente por encima del form1. No obstante, una forma de evitar usar esta función sería llevando o poniendo o coincidiendo borde con borde entre los formularios. Hasta ahora no he podido encontrar un evento que cumpla o que haga funcionar a este truco. Lo más semejante que he encontrado es el MouseMove, pero aún así no funciona.

Las constantes son código agregado, no indispinsable para usar esta api.

Saludos.
He logrado hacer algo parecido, pero no es igual. Este simple ejemplo lo he visto en programas como Google Talk, de ahí la idea derivada. A ver si pasa alguien y me corrige los error en este source de Delphi.

[Enlace externo eliminado para invitados]

Saludos.

No puedo editar mi última respuesta, así que aquí va un doble post.
AX escribió: Esta función sería innecesaria si cuando le das click al form2 para activar una opción o cualquier cosa, este no se muestre completamente por encima del form1.
sí me di cuenta de eso despues... pero solamente eso, y si hay una manera sin el timer es usando varios eventos del form mientras que se esta moviendo para que llames a la función de acomodar el segundo formulario, salu2
Responder

Volver a “Delphi”