Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

Расширенный MessageBox   Найти похожие ветки 

 
Wood   (2005-10-07 05:44) [0]

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


 
easy ©   (2005-10-07 09:08) [1]

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;


 
y-soft ©   (2005-10-07 09:35) [2]

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

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

>Wood   (07.10.05 05:44)  

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

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

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


 
begin...end ©   (2005-10-07 09:49) [3]

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

> ACheckBox.Free

Зачем?


 
Wood   (2005-10-07 10:26) [4]

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


 
y-soft ©   (2005-10-07 10:44) [5]

>Wood   (07.10.05 10:26) [4]

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


 
y-soft ©   (2005-10-07 10:49) [6]

>Wood   (07.10.05 10:26) [4]

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

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


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

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

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

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

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


 
y-soft ©   (2005-10-07 11:16) [8]

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

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

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

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

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


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

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


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

>Wood   (07.10.05 11:28) [9]

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

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

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


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


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


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


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

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

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


 
y-soft ©   (2005-10-07 12:53) [13]

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

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


 
y-soft ©   (2005-10-07 12:58) [14]

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

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


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

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


 
GrayFace ©   (2005-10-07 17:54) [16]

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

И все-таки?



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.037 c
4-1128515659
Alek
2005-10-05 16:34
2005.12.11
message в dll


14-1132125094
Mike Kouzmine
2005-11-16 10:11
2005.12.11
Арестована коллекция Пушкинского музея.


2-1132835209
fast2
2005-11-24 15:26
2005.12.11
Как узнать дату создания файла?


14-1132251501
leonidus
2005-11-17 21:18
2005.12.11
Как подсчитать кол-во обращений к сканеру


14-1132644802
WondeRu
2005-11-22 10:33
2005.12.11
ASM