2011-12-22 8 views
6

Chcę utworzyć okno dialogowe z ostrzeżeniem, które zapyta użytkowników, czy informacje wpisane podczas rejestracji są poprawne, i prosi go o dodanie, że chce kontynuować lub zamknąć to dialog i popraw jego informacje.Jak wyświetlić okno dialogowe z dwoma przyciskami (Kontynuuj/Zamknij) w Delphi

+0

Nawet [ 'Task Dialog'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb760441%28v=vs.85%29.aspx) w nowych wersjach systemu Windows nie ma wspólnych przycisków z tym podpisem. Mówiąc o oknie dialogowym zadania, możesz użyć przycisków niestandardowych (zobacz zrzut ekranu z linku). W standardowym ['MessageBox'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505%28v=vs.85%29.aspx) IMHO nie ma możliwości zmiany napisów na przyciskach . Tak więc najprościej jest stworzyć własną, ale może się mylę ... Może ['this'] (http://www.codeguru.com/cpp/wp/win32/messagebox/article.php/c10873) droga ? – TLama

+1

@TLama Okno dialogowe zadań pozwala nadać przyciskom dowolną nazwę, którą masz ochotę –

+0

@ David, mówiłem o 'dwCommonButtons', tych, których nie możesz zmienić lub czy się mylę? – TLama

Odpowiedz

11
var 
    td: TTaskDialog; 
    tb: TTaskDialogBaseButtonItem; 
begin 
    td := TTaskDialog.Create(nil); 
    try 
    td.Caption := 'Warning'; 
    td.Text := 'Continue or Close?'; 
    td.MainIcon := tdiWarning; 
    td.CommonButtons := []; 

    tb := td.Buttons.Add; 
    tb.Caption := 'Continue'; 
    tb.ModalResult := 100; 

    tb := td.Buttons.Add; 
    tb.Caption := 'Close'; 
    tb.ModalResult := 101; 

    td.Execute; 

    if td.ModalResult = 100 then 
     ShowMessage('Continue') 
    else if td.ModalResult = 101 then 
     ShowMessage('Close'); 

    finally 
    td.Free; 
    end; 
end; 

enter image description here

Uwaga:This will only work on Windows Vista or later.

+2

+1 dla kompletnej odpowiedzi, (chociaż 'close' jest bardzo złym podpisem dla przycisku ze względu na jego ogólną niejednoznaczność i brak znaczenia :-) – Johan

+1

@DavidHeffernan - Tak, nie będzie działać w XP. –

+1

.. i tylko wtedy, gdy motywy są włączone. Pamiętam, że Dawid zanotował coś takiego .. update - [tutaj] (http://stackoverflow.com/a/6344538/243614) –

7

jeśli Delphi następnie

if mrYes=MessageDlg('Continue?',mtwarning,[mbYes, mbNo],0) then 
    begin 
     //do somthing 
    end 
else 
exit; //go out 
+0

co z pisaniem (Kontynuacja i zamknięcie) zamiast (Tak i Nie)? –

+2

możesz to tylko dla wiadomości: mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp – PresleyDias

+0

Możesz, przetestowałem to teraz ... – TLama

2

podstawie this:

procedure HookResourceString(rs: PResStringRec; newStr: PChar); 
var 
    oldprotect: DWORD; 
begin 
    VirtualProtect(rs, SizeOf(rs^), PAGE_EXECUTE_READWRITE, @oldProtect); 
    rs^.Identifier := Integer(newStr); 
    VirtualProtect(rs, SizeOf(rs^), oldProtect, @oldProtect); 
end; 

const 
    SContinue = 'Continue'; 
    SClose = 'Close'; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    HookResourceString(@SMsgDlgOK, SContinue); 
    HookResourceString(@SMsgDlgCancel, SClose); 
    if MessageDlg('My Message', mtConfirmation, [mbOK, mbCancel], 0) = mrOK then 
    begin 
    // OK... 
    end; 
end; 
+0

+1, możesz również użyć ['hook'] (http://www.codeguru.com/cpp/wp/win32/ messagebox/article.php/c10873), aby uzyskać uchwyt do okna komunikatu, a następnie użyć ['GetDlgItem'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645481%28v=vs .85% 29.aspx), aby uzyskać uchwyt przycisku, który chcesz zmienić i ustawić jego tekst za pomocą ['SetDlgItemText'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ ms645521% 28v = vs.85% 29.aspx); całkiem przesadnie, wiem :) Ale najgorsze w tym rozwiązaniu jest to, że musisz użyć biblioteki DLL dla tego haka. – TLama

+0

http://www.swissdelphicenter.ch/torry/showcode.php?id=946? – TLama

+0

ouch! Całkiem drakońskie! –

8
var 
    AMsgDialog: TForm; 
    abutton: TButton; 
    bbutton: TButton; 
begin 

    AMsgDialog := CreateMessageDialog('This is a test message.', mtWarning,[]); 
    abutton := TButton.Create(AMsgDialog); 
    bbutton := TButton.Create(AMsgDialog); 

    with AMsgDialog do 

    try 

     Caption := 'Dialog Title' ; 
     Height := 140; 
     AMsgDialog.Width := 260 ; 

     with abutton do 
     begin 
     Parent := AMsgDialog; 
     Caption := 'Continue'; 
     Top := 67; 
     Left := 60; 
     // OnClick :tnotyfievent ; 
     end; 

     with bbutton do 
     begin 
     Parent := AMsgDialog; 
     Caption := 'Close'; 
     Top := 67; 
     Left := 140; 
     //OnClick :tnotyfievent ; 
     end; 

     ShowModal ; 

    finally 
     abutton.Free; 
     bbutton.Free; 
     Free; 
    end; 

enter image description here

Powiązane problemy