Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Mover un Application.MessageBox (https://www.clubdelphi.com/foros/showthread.php?t=83882)

Efren2006 10-08-2013 00:45:30

Mover un Application.MessageBox
 
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 :

Código Delphi [-]
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:
Código Delphi [-]
 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

Cita:

Empezado por AboutDelphi.com
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/windowssh...tive_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.

Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 00:35:02.

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