PDA

Ver la Versión Completa : Mover un Application.MessageBox


Efren2006
10-08-2013, 00:45:30
Saludos


Tengo el siguiente problema ,, tengo un Formulario con una especia de planilla que el usuario debe llenar, cuando termina el usuario de incluir los datos y pulsa un boton de OK :

Application.MessageBox('Esta Conforme con los Datos..?','VALIDAR',MB_YESNO+MB_ICONQUESTION)

El Problema es cuando se muestra la ventana en el medio de la Pantalla la misma TAPA o no deja ver un dato que necesito que el usuario verifique visualmente antes de conformar, entonces el usuario se la pasa moviendo la ventana,, mi pregunta simplemente es;
Se puede mover esta ventana a otras coordenadas... ?

ecfisa
10-08-2013, 05:07:22
Hola Efren2006.

Podes hacerte un hook CBT, crear tu propio cuadro de dialogo o más simple, usar la función MessageDlgPos (http://www.delphibasics.co.uk/RTL.asp?Name=MessageDlgPos):

if MessageDlgPos('Esta Conforme con los Datos..?', // Msg
mtConfirmation, // Dialog Type
[mbYes,mbNo], // Buttons
0, // Help context
10, // Pos X
10 // Pos Y
) = mrNo then
...


Saludos :)

movorack
10-08-2013, 05:12:40
prueba agregando los flags


MB_SYSTEMMODAL flag ensures that the user must respond to the message box before continuing work in the window identified by the hWnd parameter.
MB_TOPMOST flag specifies that the message box should be placed above all non-topmost windows and should stay above them, even when the window is deactivated.
MB_SETFOREGROUND flag ensures that the message box becomes the foreground window.

link: http://delphi.about.com/od/windowsshellapi/a/notactive_modal.htm

Chris
10-08-2013, 05:19:46
Realmente no estoy seguro si el código que te proporcionaré funciona. Lo estoy escribiendo según mi conocimiento de la WinAPI y no tengo Delphi a mano.

El truco pasa por utilizar los Hooks que ofrece la API de Windows. Por eso yo mejor utilizaría la función nativa MessageBox en lugar de Application.MessageBox.


use Windows, SysUtils;

var
hook_handle: HHOOK;

function CBTProc(nCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT stdcall;
var
message_wnd: HWND;
begin
if (nCode = HCBT_ACTIVATE) then
begin
message_wnd = HWND(wParam);

// Movemos la ventana del messagebox con SetWindowPos
SetWindowsPos(message_wnd ... );

// quitamos el hook
UnhookWindowsHookEx(hook_handle);
end
CallNextHookEx(hhk, nCode, wParam, lParam);
else
CallNextHookEx(hhk, nCode, wParam, lParam);
end;

// instalamos el hook
hook_handle := SetWindowsHookEx(WH_CBT,
@CBTProc,
0,
GetCurrentThreadId());

// hacemos nuestra llamada a messagebox
Windows.MessageBox('Esta seguro de los datos...' .... );


Saludos!

Efren2006
10-08-2013, 05:47:15
Buenas Noches

Gracias a Todos por sus valiosos aporte y conocimientos,,, me funciono a la perfección la solución que me dio ecfisa

Saludos

movorack
10-08-2013, 05:49:23
and the winner is... :D