2011-10-13 7 views

Respuesta

16

Puede crear sus propios cuadros de diálogo personalizados mediante la función CreateMessageDialog de delphi.

Ejemplo a continuación:

var 
    Dlg: TForm; 
begin 
    Dlg := CreateMessageDialog('message', mtInformation, [mbOk], mbOK); 
    // Treat Dlg like any other form 

    Dlg.Caption := 'Hello World'; 

    try 
    // The message label is named 'message' 
    with TLabel(Dlg.FindComponent('message')) do 
    begin 
     Font.Style := [fsUnderline]; 

     // extraordinary code goes here 
    end; 

    // The icon is named... icon 
    with TPicture(Dlg.FindComponent('icon')) do 
    begin 
     // more amazing code regarding the icon 
    end; 

    Dlg.ShowModal; 
    finally 
    Dlg.Free; 
    end; 

y por supuesto puede insertar otros componentes aswell en esa forma dinámica.

+1

+1 Esto parece coincidir mejor con lo que Shirish está buscando –

+0

@aldo gracias por la idea – Shirish11

+0

Nunca supe que existiera 'FindComponent'. +1! –

5

El cuadro de diálogo usará el contenido de Application.Title como leyenda. Entonces puede configurar esto antes de llamar al ShowMessage.

Sin embargo, si desea mostrar varios cuadros de diálogo con diferentes subtítulos, sería más conveniente llamar a la función de Windows MessageBox. Ciertamente, si tiene una versión anterior de Delphi, esto dará como resultado una sensación más original de su diálogo.

procedure MyShowMessage(const Msg, Caption: string); 
begin 
    MessageBox(GetParentWindowHandleForDialog, PChar(Msg), PChar(Caption), MB_OK); 
end; 

function GetParentWindowHandleForDialog: HWND; 
begin 
    //we must be careful that the handle we use here doesn't get closed while the dialog is showing 
    if Assigned(Screen.ActiveCustomForm) then begin 
    Result := Screen.ActiveCustomForm.Handle; 
    end else if Assigned(Application.MainForm) then begin 
    Result := Application.MainFormHandle; 
    end else begin 
    Result := Application.Handle; 
    end; 
end; 

Si desea controlar el color y el tamaño, la opción más obvia es la creación de su propio diálogo como descendiente TForm.

+0

no puedo encontrar 'MianWindowHandle' en BDS 2006 teniendo un formulario personalizado como un cuadro de diálogo que parece ser una opción – Shirish11

+0

I misremembered. Es MainFormHandle en Delphi. ¡Estoy respondiendo demasiadas preguntas de WinForms! –

+0

pero viola la propiedad 'Showmodal' de' Showmessages' – Shirish11

0

Aquí hay un poco de código que escribí, es posible que desee utilizarlo nota por nota.

function SetHook(Code : Integer; wparam : Integer; LParam : Integer) : Longint; stdcall; 
function HookWndProc(wnd : HWND ;uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall; 
var 
    CaptHook : HHOOK; 
    GHookProc : TFNWndProc; 
    GOldHookProc : TFNWndProc; 
implementation 

uses Messages, Types, Graphics; 

    function SetHook(Code : Integer; wparam : Integer; LParam : Integer) : Longint; stdcall; 
var 
    pwp : CWPSTRUCT; 
begin 
if Code = HC_ACTION then 
begin 
    pwp := CWPStruct(Pointer(LParam)^); 
    if pwp.message = WM_INITDIALOG then 
    begin 
    GOldHookProc := TFnWndProc(SetWindowLong(pwp.hwnd, GWL_WNDPROC, LongInt(GHookProc))); 
    end; 
    end; 

result := CallNextHookEx(CaptHook, Code, wparam, lparam); 

end; 

function HookWndProc(wnd : HWND ;uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT; 
var 
    DC : HDC; 
    WndRect : Trect; 
    BR: HBRUSH; 
    WndText : array[1..20] of char; 
begin 

result := CallWindowProc(GOldHookProc, wnd, uMsg, wParam, lParam); 
if uMsg = WM_ERASEBKGND then 
begin 
    GetWindowText(wnd, @wndText, 20); 

    //do stuff here (I colored the button red) 
    DC := GetDC(wnd); 
    WndRect := Rect(0, 0, 200,200); 
    BR := CreateSolidBrush(clRed); 
    FillRect(dc, WndRect, BR); 
    DeleteObject(BR); 
    ReleaseDC(wnd, dc); 
end; 
end; 

...

poner esto en su formulario Crear en la que desea realizar los cuadros de mensaje cobardes

uses windows; 

...

CaptHook := SetWindowsHookEx(WH_CALLWNDPROC, @SetHook, 0, GetCurrentThreadId); 
GHookProc := @HookWndProc; 

Por lo tanto, lo que este does se engancha en las funciones emergentes de diálogo de Windows y puede obtener el contexto para el diálogo y dibujar sobre él.

+0

¿Qué demonios hace esto? –

+0

@David Tuve que escribir esto para una aplicación interna porque algunos de los técnicos aquí querían tener botones rojos en los mensajes de advertencia importantes. Es esencialmente un gancho que puede dibujar en el 'lienzo' del diálogo que aparece. Puede dibujar en el lugar donde están los comentarios. –

Cuestiones relacionadas