Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Расширенный MessageBox [D7, WinXP]


Wood ©   (2005-10-07 05:44:00) 

Не сочтите за труд, подскажите, как создать диалог, типа Application.MessageBox c флагом (как: "не показывать больше это сообщение"). И еще, как добавить свою иконку в подобный диалог? Спасибо.


GrayFace   (2005-10-07 17:54:00) [1]

y-soft ©   (07.10.05 11:16) [8]
Раз есть возможность обойтись малой кровью, то и надо ей обходиться

И все-таки?


Wood   (2005-10-07 16:40:00) [2]

да... это интересно...


y-soft   (2005-10-07 12:58:00) [3]

А вот еще проще с помощью хука:

http://www.catch22.net/tuts/msgbox.asp


y-soft   (2005-10-07 12:53:00) [4]

Кстати, вот как люди решают сабжевую задачу (кастомизация MessageBox) на CPP:

http://www.codeproject.com/dialog/xmessagebox.asp
http://www.codeproject.com/dialog/CPPMessageBox.asp


y-soft   (2005-10-07 12:32:00) [5]

>Игорь Шевченко ©   (07.10.05 12:21) [11]

Не только скучно, но и потенциально чревато, учитывая, что Microsoft не приветствует использование своих ресурсов кем-либо другим :)


Игорь Шевченко   (2005-10-07 12:21:00) [6]


> Как вариант - можно покопаться в исследовательских целях
> в ресурсах системных файлов и найти подходящие строки, а
> потом - грузить через LoadString...


Для messageBox они в Win32k.sys живут, скучно оттуда вынимать :)


y-soft   (2005-10-07 11:53:00) [7]

>Wood   (07.10.05 11:28) [9]

Так и свой компонент для подобных целей можно написать

Конечно, так и надо делать - свой компонент, класс или функцию...

Я правда сам предпочитаю писать диалоги общего назначения на WinAPI+RT_DIALOG и размещать в отдельных Dll, а для доступа из Delphi - простенькие компоненты-оболочки...


Wood   (2005-10-07 11:28:00) [8]

> y-soft ©   (07.10.05 10:44) [5]
Это, конечно, мысль. Так и свой компонент для подобных целей можно написать. Спасибо за помощь.


y-soft   (2005-10-07 11:16:00) [9]

>GrayFace ©   (07.10.05 11:13) [7]

А это возможно?

Раз есть возможность обойтись малой кровью, то и надо ей обходиться

А можно ли это сделать, не вызывая MessageBox и не читая надписи на его кнопках?

Как вариант - можно покопаться в исследовательских целях в ресурсах системных файлов и найти подходящие строки, а потом - грузить через LoadString...


GrayFace   (2005-10-07 11:13:00) [10]

> Все равно там класс TMessageForm определен в секции Implementation,
>  без хака к внутренним полям и методам не подлезть...

А это возможно?
Я умею получать доступ к protected методам и полям, писать Read-Only property, но тут ничего, кролме указания явного смещения, в голову не лезет.

> либо - грузить дефолтовые строки Windows...

А можно ли это сделать, не вызывая MessageBox и не читая надписи на его кнопках?


y-soft   (2005-10-07 10:49:00) [11]

>Wood   (07.10.05 10:26) [4]

Насчет автоматической локализации...

Если делать на чистом WinAPI, то либо (при создании из ресурса RT_DIALOG), придется определить строковые ресурсы для разных языков, либо - грузить дефолтовые строки Windows...


y-soft   (2005-10-07 10:44:00) [12]

>Wood   (07.10.05 10:26) [4]

Если будете использовать вариант Easy ©, то может проще будет скопировать код функции CreateMessageDialog из модуля Dialogs, да и переделать под свои нужды? Все равно там класс TMessageForm определен в секции Implementation, без хака к внутренним полям и методам не подлезть...


Wood   (2005-10-07 10:26:00) [13]

Ух...спасибо за быстрый отзыв и помощь. Просто я сдуру подумал, что функция InputBox() виндовая, а она диалоговая...
Еще не пробуя, думаю, если применить то что подсказал easy, то надписи на кнопках диалогового окна будут не на русском (при русской винде), в отличии от применения Application.MessageBox('','',MB_YESNO). Можно ли это как-то предусмотреть?


begin...end   (2005-10-07 09:49:00) [14]

> easy ©   (07.10.05 09:08) [1]

> ACheckBox.Free

Зачем?


y-soft   (2005-10-07 09:35:00) [15]

>easy ©   (07.10.05 09:08) [1]

Конференция-то вроде называется WinAPI :)

>Wood   (07.10.05 05:44)  

Пользовательскую иконку в стандартный MessageBox добавить легко - посмотрите функцию MessageBoxIndirect

Добавить CheckBox сложнее, если поставлена задача использовать WinAPI, то придется создавать собсбвенное диалоговое окно и самостоятельно обрабатывать сообщения от его элементов управления...

Если такой задачи не стоит, то используйте вариант easy ©, только не удивляйтесь, что размер скомпилированного файла может сильно увеличится...


easy   (2005-10-07 09:08:00) [16]

procedure TForm1.Button1Click(Sender: TObject);
var
 AMsgDialog: TForm;
 ACheckBox: TCheckBox;
begin
 AMsgDialog := CreateMessageDialog ('This is a test message.', mtConfirmation, [mbYes, mbNo]);
 ACheckBox := TCheckBox.Create(AMsgDialog);
 with AMsgDialog do
   try Caption := 'Dialog Title' ;
     Height := 150;
     with ACheckBox do
       begin Parent := AMsgDialog;
       Caption := 'Dont show me again.';
       Top := 100;
       Left := 8;
       Width:=AMsgDialog.Width;
     end;
     if (ShowModal = ID_YES) then
       begin
         if ACheckBox.Checked then
           showmessage('checked')
         else
           showmessage('NOT checked');
       end;
   finally ACheckBox.Free;
     Free;
   end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо