Pokażę poniżej dwa rozwiązania. Z zastosowanem VCL oraz WinAPI. Ponieważ mozna rozwiązać to tak, jak opisał @kAzek. Jednak ta funkcja nie instnieje raczej w starszych wersjach IDE. Poza tym z tego co googlowałem, to jest nieudokumentowana raczej. Także pewnie i tak trzeba by się pobawić w dodawanie własnych deklaracji funkcji i ładowania jej z dllek systemowych.
Dodam tylko, że jeśłi chodzi o rozwiązanie WinAPI, to jeżeli mielibyśmy pokazywać MessageBox
, ktory normalnie da się zamknąć klawiszem Escape (na przykład z samym przyciskiem "OK". To należało by subclassować w taki sposób jak dla formatki, okienko MessageBoxa
i dodać tam obsługę wykrywania klawisza Escape przez GetAsyncKeyState
. Po stwierdzeniu naciśnięcia Escape po prostu wykonać EndDialog
i tyle. Myślę, że wszystko teraz powinno być jasne.
I na przyszłość prośba do pytającego. Najpierw googlujesz, kombinujesz sam "do bólu", a dopiero w ostateczności smarujesz post na forum. Ja nie jestem geniuszem programistycznym, a wszystkie podstawy tego kodu ustaliłem kiedyś tylko dzięki googlowaniu. Także da się, jeżeli się tylko chce wykazać samodzielnością :)
//...
var
Btn : TButton;
function ShowPolishMsgDlg(Msg : string; DlgType : TMSgDlgType; Buttons : TMsgDlgButtons) : TModalResult;
var
Dlg : TForm;
begin
Dlg := CreateMessageDialog(Msg, DlgType, Buttons);
Dlg.BorderIcons := [];
Dlg.Caption := Application.Title;
TButton(Dlg.FindComponent('Ok')).Caption := 'OK';
TButton(Dlg.FindComponent('No')).Caption := '&Nie';
TButton(Dlg.FindComponent('Yes')).Caption := '&Tak';
Btn := TButton(Dlg.FindComponent('Yes'));
TButton(Dlg.FindComponent('Help')).Caption := 'Pomoc';
TButton(Dlg.FindComponent('Retry')).Caption := 'Ponów';
TButton(Dlg.FindComponent('All')).Caption := 'Wszystko';
TButton(Dlg.FindComponent('Cancel')).Caption := 'Anuluj';
TButton(Dlg.FindComponent('Ignore')).Caption := 'Ignoruj';
TButton(Dlg.FindComponent('NoToAll')).Caption := 'Nie na wszystko';
TButton(Dlg.FindComponent('YesToAll')).Caption := 'Tak na wszystko';
Dlg.ShowModal;
Result := Dlg.ModalResult;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
Timer1.Enabled := True;
ShowPolishMsgDlg('Test', mtConfirmation, [mbYes, mbNo]);
end;
procedure TForm1.Timer1Timer(Sender : TObject);
begin
Btn.Click;
end;
const
WM_CHANGEMSGBOX = WM_USER + 2013;
var
POldFormProc : Pointer;
function MsgBox(AHWnd : HWND; Text, Title : string; UType : UINT) : integer;
begin
PostMessage(Form1.Handle, WM_CHANGEMSGBOX, 0, 0);
Result := MessageBox(AHWnd, PChar(Text), PChar(Title), UType);
end;
var
BtnHandle : HWND;
function NewFormProc(AHWnd : HWND; Msg : UINT; AWParam : WParam; ALParam : LParam) : LResult; stdcall;
var
H : HWND;
begin
if Msg = WM_CHANGEMSGBOX then
begin
H := FindWindow(WC_DIALOG, nil);
if GetParent(H) = Form1.Handle then
begin
SetDlgItemText(H, IDTRYAGAIN, '&Try again');
SetDlgItemText(H, IDCONTINUE, 'Contin&ue');
SetDlgItemText(H, ID_CANCEL, '&Cancel');
SetDlgItemText(H, ID_RETRY, '&Retry');
SetDlgItemText(H, IDIGNORE, '&Ignore');
SetDlgItemText(H, IDABORT, '&Abort');
SetDlgItemText(H, ID_HELP, '&Help');
SetDlgItemText(H, ID_YES, '&Yes');
SetDlgItemText(H, ID_NO, '&No');
BtnHandle := GetDlgItem(H, ID_YES);
end;
end;
Result := CallWindowProc(POldFormProc, AHWnd, Msg, AWParam, ALParam);
end;
procedure TForm1.FormCreate(Sender : TObject);
begin
Timer1.Enabled := False;
Timer1.Interval := 3000;
Timer2.Enabled := False;
Timer2.Interval := 3000;
POldFormProc := Pointer(SetWindowLong(Self.Handle, GWL_WNDPROC, Integer(@NewFormProc)));
end;
procedure TForm1.Button2Click(Sender : TObject);
begin
Timer2.Enabled := True;
MsgBox(Self.Handle, 'Googluj zanim zapytasz o cokolwiek na forum!', 'Test', MB_ICONQUESTION + MB_YESNO);
end;
procedure TForm1.Timer2Timer(Sender : TObject);
begin
SendMessage(BtnHandle, BM_CLICK, 0, 0);
end;