![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расширенный 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;