![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расширенные возможности MessageDlg [D7, WinXP]
alexey_public © (2007-01-16 17:44:00)Недавно перейдя с Delphi 5 на Delphi 7 столкнулся в справке по MessageDlg несколько ее дополнительных вариантов вызова, эти варианты позволяли указывать заголовок окна, выбирать кнопки по умолчанию и собственную картинку. Именно необходимость использовать кнопки по умолчанию отличные от обычного интерфейса MessageDlg и заставила меня обратить внимание на данные функции. С виду все удобно и красиво. Но не тут то было.
Пройдя предварительно по интернету я убедился что вразумительных советов по использованию этих функций практически не встречается, варианты ответов доходили до полного отказа от всех перегруженных вариантов данной функции под Win и использование только в Linux, хотя в тексте самой функции видно, что она является кроссплатформенной.
Первое с чем столкнулся - это требование использовать CLX библиотеку, на практике это потребовало QDialog и библиотеки qtintf70.dll в папке программы, что не очень удобно. Но зато работают функции заголовка и кнопок.
Второе - это сами картинки. По умолчанию они используют объекты QBitmap из QGraphics. Но я использую несколько картинок и взял для этого обычный TImageList.
Напрямую соединить эти объекты не получается, и тогда я решил использовать обычный поток. По результатам эксперимента была составлена следующая функция:
procedure ImageListToQBitMap(ImageList:TImageList; ImageIndex:integer; var QBitMap:QGraphics.TBitmap);
var
b:TBitmap;
MS:TMemoryStream;
begin
b:=Graphics.TBitmap.Create;
ImageList1.GetBitmap(ImageIndex,b);
MS:=TMemoryStream.Create;
b.SaveToStream(MS);
MS.Position:=0;
QBitMap:=QGraphics.TBitmap.Create;
QBitMap.LoadFromStream(MS);
end;
Эта функция из указанного по индексу изображения создает объект QBitmap, работа ее достаточно прозрачная, комментировать не буду.
Вызов функции осуществляется следующим образом:
var
qb1:QGraphics.TBitmap;
begin
ImageListToQBitMap(ImageList1,4,qb1);// выбрано 5-ое изображение из списка
Пример использования
if (MessageDlg('Внимание','Действительно удалить?',
mtCustom ,[mbOk,mbCancel],0, mbCancel , qb1)
=mrOk)
then .....
К бочке меда нужно приложить ложку дегтя - не получилось использовать картинки так, как задумывалось. На рабочей станции все работает, а вот при копировании приложения вместе с библиотекой qtintf70.dll на сервер под управлением Windows Server 2003 для работы в терминале под Citrix выяснилось, что картинки из ImageList не читаются, говорит неверный формат. Хотя туда были закачаны обычные Bitmap. Т.о. в моем случае мне пришлось ограничиться только текстом и кнопками. Но и это также неплохо.
Предоставляю это все на общее обозрение, критику и использование :-).
А если кто знает как включить и картинки - будет совсем хорошо :-)
alexey_public (2007-01-17 12:29:00) [1]
> А как ты будешь ссылаться, если модуль не будет использоваться?
Я имел в виду другое - порядок вызова, желательно его поставить последним в списке uses. Иначе придется писать:
QDialogs.MessageDlg(...)
Мелочь, но все-таки.
alexey_public (2007-01-17 12:27:00) [2]
> ...настроить, все, что нужно, и использовать? :)
Согласен, но все же заставит работать стандартный MessageDlg было просто интересно ;-)
alexey_public (2007-01-17 12:27:00) [3]
> ...настроить, все, что нужно, и использовать? :)
Согласен, но все же заставит работать стандартный MessageDlg было просто интересно ;-)
ors_archangel (2007-01-17 03:42:00) [4]
> QDialogs;// Чтобы не надо было ссылаться на этот модуль
> при вызове MessageDlg
А как ты будешь ссылаться, если модуль не будет использоваться?
vlad-mal (2007-01-16 18:22:00) [5]А не проще/быстрее просто:
> TMyMsgDlg = class (TForm)
>
...настроить, все, что нужно, и использовать? :)
alexey_public (2007-01-16 17:47:00) [6]Один момент - список uses желательно оформить следующим образом:
uses
...,
QGraphics,
Graphics, // чтобы работали все остальные функции
...
QDialogs;// Чтобы не надо было ссылаться на этот модуль при вызове MessageDlg