Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Создание собственного окошка сообщения.


Автор: Ner-zul 25.7.2006, 11:19
   MessageDlg('Вы действительно хотите завершить работу?',mtConfirmation,[mbYes,mbNo],0)=mrYes then Close:=True;

Вот с помощью такого сообщения я спрашиваю у юзера , действительно он хочет закрыть приложение и выйти из него. Меня раздрожает , что у меня кнопки Yes/No вместо Да/Нет !!! Это не красиво и неудобно. Таким образом, мне хочеться знать как можно редактировать вид подобных сообщений окошек? чтобы сделать кнопки русскими, может  я вообще хочу еще 3 кнопки на него... я могу?
  или единственный вариант создавать новую форму????  

Автор: ~FoX~ 25.7.2006, 11:23
Ner-zul, Можно все, но ИМХО овчинка выделки не стоит....месага это апишный контрол, т.е. уже написанный и упрятанный глубако в дебрях мастдая. 
Проще создать свое окошко и изголяться над ним. 

Автор: Matematik 25.7.2006, 11:33
см. MessageBox()

Добавлено @ 11:36 
Код

Close:=Application.MessageBox('Вы действительно хотите завершить работу?',
'Тупой вопрос',MB_YESNO or MB_ICONQUESTION)=idYES;
  

Автор: Ner-zul 25.7.2006, 11:41
хммммм.... 

Автор: Alexeis 25.7.2006, 12:54
а лучше
Код

  MessageBoxEx(0, 'message', 'caption',
  MB_YESNO    or MB_ICONINFORMATION or MB_DEFBUTTON2, LANG_RUSSIAN)

там и язык идет последним параметром. 

Автор: Ner-zul 25.7.2006, 13:25
ммм классная функция! то что надо! Только вот у меня почему то не срабатывает на русский я и хелп почитал, но мне ничего не дало... smile ... не знаете , почему на русский не переходит?? 

Автор: Snowy 25.7.2006, 13:29
Вероятно потому, что в системе такой язык отсутствует... 

Автор: Ner-zul 25.7.2006, 13:37
хммм, что значит , что в системе такой язык отсутствует??? в какой системе? в винде??
 простите , а я на каком пишу?) 

Автор: Snowy 25.7.2006, 14:56
Раскладка клавиатуры - не есть поддержка языка в винде.
Винда явно английская, раз выдаёт Yes/No.
Цитата
Before specifying a language identifier, you should enumerate the locales that are installed on a system. 
Поскольку не срабатывает, значит данная локаль в системе отсутствует. 

Автор: Akella 25.7.2006, 15:24
MessageDlg всегда выдёт Yes/No, а MessageBox выдаёт кнопки с надписями того языка который установлен в "Панель управления-Язык и региональные стандарты - закладка Региональные параметры" 

Автор: Ner-zul 25.7.2006, 15:25
Угу! Верно! Винда английская!
 И кстати та строчка есчо меня самого насторожила...
  а не знаете как поставить ту локаль ? Или это  систему надо русифицировать? Переставлять? 

Автор: Snowy 25.7.2006, 15:32
Доставлять локаль конечному пользователю - дело неблагородное.
Просто создай формочку с кнопами Да/Нет и показывай её модально.
ЗЫ. MessageDlg почти так и сделан - разница только в том, что он не заранее спроектирован, а создаётся динамически. 

Автор: kostas 25.7.2006, 15:50
Можно открыть уже конечный exe и в его ресурсах найти Yes/No и заменить соответственно на Да/Нет... конечно извратно но все же вариант smile 

Автор: Ner-zul 25.7.2006, 15:55
На счет формочки я тоже так думал)
На счет exe  файла тож интересный вариант!

Всем спасибо, дальше я сам smile 
  

Автор: Snowy 25.7.2006, 16:03
Цитата(kostas @  25.7.2006,  15:50 Найти цитируемый пост)
Можно открыть уже конечный exe и в его ресурсах найти Yes/No и заменить соответственно на Да/Нет...
Не получится.
Эти значения прописаны в самих виндах, а не в ехешнике. 

Автор: Yanis 25.7.2006, 17:38
Цитата(Snowy @  25.7.2006,  17:03 Найти цитируемый пост)
Эти значения прописаны в самих виндах, а не в ехешнике. 

Угу. В user32.dll вроде. 

Автор: svarogik 25.7.2006, 18:01
А как по этому выскочившему окошку проверять можно ли закрывать программу,  это окошко что возвращает какие то значения? 

Автор: Snowy 25.7.2006, 18:18
Читай справку по TForm.ShowModal
Yf выходе модальный результат.
Назначь нужный кнопкам. 

Автор: kostas 29.7.2006, 08:53
Цитата(Snowy @  25.7.2006,  16:03 Найти цитируемый пост)
Не получится.Эти значения прописаны в самих виндах, а не в ехешнике. 

а вот и нет, можешь попробовать сам smile этот способ работает, по крайней мере для MessageDlg 

Автор: GRU 10.8.2006, 22:27
вот нашол. Протестируй ;)

Код

unit MyDialogs;

interface

uses
  Forms, Dialogs, StdCtrls;

  //----
  function MyMessageDlg(Msg: String; MsgDlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons): Integer;
  procedure MyShowMessage(const Msg: string);
  procedure MyShowMessagePos(const Msg: string; X, Y: Integer);
  function MyMessageDlgPos(const Msg: string; DlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer;

  function MyOpenDialog(Msg: String; MsgDlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons): Integer;

implementation

function MyMessageDlg(Msg: String; MsgDlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons): Integer;

  function DialogCaption(DlgCaption: string): string;
  begin
    Result := DlgCaption;
    if DlgCaption = 'Warning' then Result := '1111';
    if DlgCaption = 'Error' then Result := '2222';
    if DlgCaption = 'Information' then Result := '3333';
    if DlgCaption = 'Confirm' then Result := '4444';
  end;

  function ButtonNames(ButtonName: string): string;
  begin
    Result := ButtonName;
    if ButtonName = 'Yes' then Result := '00';
    if ButtonName = 'No' then Result := '11';
    if ButtonName = 'OK' then Result := '22';
    if ButtonName = 'Cancel' then Result := '33';
    if ButtonName = 'Abort' then Result := '44';
    if ButtonName = 'Retry' then Result := '55';
    if ButtonName = 'Ignore' then Result := '66';
    if ButtonName = 'All' then Result := '77';
    if ButtonName = 'NoToAll' then Result := '88';
    if ButtonName = 'YesToAll' then Result := '99';
    if ButtonName = 'Help' then Result := 'AA';
  end;

  function StrCRLF(const StrMsg: string): string;
  var
    nLen, i: Integer;
  begin
    nLen := Length(StrMsg);
    i := 1;
    while (i <= nLen) do begin
      if StrMsg[i] in [';','~']
        then Result := Result + #13
        else Result := Result + StrMsg[i];
      Inc(i);
    end;
  end;

var
  CenterForm: Boolean;
  I: Integer;
  Btn: TButton;
  AForm: TForm;

begin
  CenterForm := {Form1 <> nil;}Screen.ActiveForm <> nil;
  AForm := Screen.ActiveForm;

  with CreateMessageDialog(StrCrLf(Msg), MsgDlgType, Buttons) do
  try
    if CenterForm
    then begin
      Left := AForm.Left + (AForm.Width div 2)-(Width div 2);
      Top := AForm.Top + (AForm.Height div 2)-(Height div 2);
      Caption := DialogCaption(Caption);
    end;

    for I := 0 to ComponentCount -1 do begin
      if Components[i] Is TButton
      then begin
        Btn := TButton(Components[I]) ;
        Btn.Caption := ButtonNames(Btn.Name);
      end;
    end;
    Result := ShowModal;
  finally
    Free;
  end;
end;

procedure MyShowMessage(const Msg: string);
begin
  MyShowMessagePos(Msg, -1, -1);
end;

procedure MyShowMessagePos(const Msg: string; X, Y: Integer);
begin
  MyMessageDlgPos(Msg, mtCustom, [mbOK], 0, X, Y);
end;

function MyMessageDlgPos(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer;
begin
  Result := MyMessageDlg(Msg, DlgType, Buttons);
end;

//---------------------------?????????---------------------------------------

function MyOpenDialog(Msg: String; MsgDlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons): Integer;

  function DialogCaption(DlgCaption: string): string;
  begin
    Result := DlgCaption;
    if DlgCaption = 'Warning' then Result := 'AA';
    if DlgCaption = 'Error' then Result := 'BB';
    if DlgCaption = 'Information' then Result := 'CC';
    if DlgCaption = 'Confirm' then Result := 'DD';
  end;

  function ButtonNames(ButtonName: string): string;
  begin
    Result := ButtonName;
    if ButtonName = 'Yes' then Result := '00';
    if ButtonName = 'No' then Result := '11';
    if ButtonName = 'OK' then Result := '22';
    if ButtonName = 'Cancel' then Result := '33';
    if ButtonName = 'Abort' then Result := '44';
    if ButtonName = 'Retry' then Result := '55';
    if ButtonName = 'Ignore' then Result := '66';
    if ButtonName = 'All' then Result := '77';
    if ButtonName = 'NoToAll' then Result := '88';
    if ButtonName = 'YesToAll' then Result := '99';
    if ButtonName = 'Help' then Result := 'AA';
    if ButtonName = 'Open' then Result := 'BB';
  end;

  function StrCRLF(const StrMsg: string): string;
  var
    nLen, i: Integer;
  begin
    nLen := Length(StrMsg);
    i := 1;
    while (i <= nLen) do begin
      if StrMsg[i] in [';','~']
        then Result := Result + #13
        else Result := Result + StrMsg[i];
      Inc(i);
    end;
  end;

var
  CenterForm: Boolean;
  I: Integer;
  Btn: TButton;
  AForm: TForm;

begin
  CenterForm := {Form1 <> nil;}Screen.ActiveForm <> nil;
  AForm := Screen.ActiveForm;
  
  with CreateMessageDialog(StrCrLf(Msg), MsgDlgType, Buttons) do
  try
    if CenterForm
    then begin
      Left := AForm.Left + (AForm.Width div 2)-(Width div 2);
      Top := AForm.Top + (AForm.Height div 2)-(Height div 2);
      Caption := DialogCaption(Caption);
    end;

    for I := 0 to ComponentCount -1 do begin
      if Components[i] Is TButton
      then begin
        Btn := TButton(Components[I]) ;
        Btn.Caption := ButtonNames(Btn.Name);
      end;
    end;
    Result := ShowModal;
  finally
    Free;
  end;
end;

end.

Автор: Snowy 11.8.2006, 00:43
Цитата(kostas @  29.7.2006,  08:53 Найти цитируемый пост)
а вот и нет, можешь попробовать сам  этот способ работает, по крайней мере для MessageDlg 
MesageDlg - не есть WinAPI функция.
Строки для неё заложены в ресурсы ехешника.
А вот строки для MessageBox заложены в винду и зависят от её языка.

Автор: Snowy 11.8.2006, 00:59
GRU, как-то это не очень компактно.
Проще так:
Код
var
  dlg: TForm;
begin
  dlg := CreateMessageDialog('А ты уверен?', mtConfirmation, [mbYes, mbNo]);
  (dlg.FindComponent('Yes') as TButton).Caption := 'Конечно';
  (dlg.FindComponent('No') as TButton).Caption := 'Не очень';
  if dlg.ShowModal = mrYes then ShowMessage('Он согласился!');
  dlg.Free;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)