Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Нестандартные приемы программирования Delphi - Ревич Ю.

Ревич Ю. Нестандартные приемы программирования Delphi — Спб.: БХВ-Петербург, 2005. — 560 c.
ISBN 5-94157-686-2
Скачать (прямая ссылка): nestandartniepriemiprogrammirovanie2005.djvu
Предыдущая << 1 .. 112 113 114 115 116 117 < 118 > 119 120 121 122 123 124 .. 218 >> Следующая

старшего слова указывается направление прокрутки (вниз - минус, вверх -
плюс), в самом значении этого слова - количество условных "тиков", на
которое колесико прокрутили, а в младшем слове - состояние одновременно
нажатых клавиш-модификаторов. Нас интересует только знак и клавиши, с
"тиками" нам разбираться незачем.
Создадим новый проект ScrollDrop (папка Glaval3\l) с красивой иконкой
(pciii.ico), на форму поставим компонент ScrollBox и растянем его на всю
форму, оставив внизу небольшое пустое пространство. В это пространство
поместим компонент Label, немного левее центра - в него мы будем выводить
подпись. У компонента ScroiiBoxl свойство AutoScroll должно быть равно
True, a AutoSize- False. В левый верхний угол ScroiiBoxl поставим
компонент image, у которого AutoSize, наоборот, должно быть установлено в
True.
Добавим в секцию private процедуру перехвата сообщений:
private
prooedure WndProc(var Msg: TMsg; var Handled:boolean);
и напишем следующий обработчик события oncreate формы:
prooedure TForml.FormCreate(Sender: TObject); begin
if paramcountoO then (если есть параметр загрузки} try
Imagei.Picture.LoadFromFile(paramstr(1));
(пробуем загрузить картинку/
Formi.Labell.Caption:=paramstг(1); except
Imagei.Picture.LoadFromFile('pole.jpg');
(не получается - по умолчанию/
Formi.Labe11.Caption: = 'pole.jpg1; end else begin
Imagei.Picture.LoadFromFile('pole.jpg');
(загружаем по умолчанию)
Formi.Labell.Caption:='pole.jpg'; end;
Приставание с намеком
285
Application. OnMessage:=WndProc; { перо": ка г оконной процедур}
DragAeceptFiles(Forml.Handle,True);
Iсообщаем, что готовы к приему файлов) end;
Здесь мы сразу предусмотрели вот что: если вы запускаете программу из
командной строки с параметром в виде имени файла с картинкой, то она
загрузится в imagel, в противном случае (или если параметр - не картинка)
загрузится картинка по умолчанию poIe.jpg, которую я расположил в папке с
проектом. Картинку по умолчанию я специально выбрал достаточно большой
(фотография в стиле "родные просторы" 1136x852), чтобы при загрузке
появились обе линейки прокрутки в компоненте scroilBoxi. В компоненте
Labell будет отображаться имя файла с картинкой (рис. 13.1). Добавим, что
запуск программы с параметром в Windows осуществляется не только при
ручном запуске из командной строки, но и при "бросании" файла с картинкой
на файл программы в Проводнике - т. е. мы сразу осуществили режим
Drag&Drop для не запущенной программы. Но это бы не сработало, если бы мы
не уведомили Windows, что готовы к такому повороту событий. Это делается
вызовом функции DragAcceptFiles в последней строке процедуры. В
предложение uses еледует добавить два модуля: Shell Api и JPEG.
Рис. 13.1. Окно примера ScrollDrop с загруженной по умолчанию картинкой
286
Гпава 13
Осталось оформить собственно процедуру WndProc. Она будет выглядеть твк:
procedure TForml.WndProc(var Msg: TMsg; var Handled:boolean); begin
if Msg.message=WM_MOUSEWHEEL than begin
if (Msg.wParam and MK_CONTROL) = 0 then begin
if Msg.wParam>0 then {крутим вниз)
ScrollBoxl.VertScrollBar.Position:=
ScroiiBoxl.VertScrollBar.Position+8 else {крутим вверх}
ScroiiBoxl.VertScrollBar.Positions
ScroiiBoxl.VertScrollBar.Position-8;
end
else {нажата Ctrl} begin
if Msg.wParam>0 then {крутим вправо}
ScroiiBoxl.HorzScrollBar.Position:=
ScroiiBoxl.HorzScrollBar.Position+8 else {крутим влево)
ScroiiBoxl.HorzScrollBar.Position:=
ScroiiBoxl.HorzScrollBar.Position-8;
end;
end;
end;
To есть при просто прокрутке колесика у нас будет изображение
передвигаться в вертикальном направлении, а при прокрутке с нажатой
клавишей <Ctrl> - в горизонтальном.
Полный Drag&Drop
Отлично, но как бы еще принять файл, "брошенный" на уже открытую
программу? Надо сказать, что в Delphi этот режим не реализован вообще
никак- тот механизм, что имеется, обеспечивает довольно удобный обмен
через перетаскивание объектов между компонентами одной формы, но мне
лично такое еще не понадобилось ни разу. Разумеется, это совершенно не
лишняя функциональность, но перетаскивание извне куда интереснее. Для
того чтобы осуществить прием "брошенного" файла, нам придется создать еще
один перехватчик сообщения, на этот раз wm dropfiles. Его можно
перехватить в той же процедуре WndProc, но удобнее соорудить отдельный
специализированный перехватчик (для формы, а не для приложения целиком).
Добавим в ту же секцию private следующую строку:
Приставание с намеком
287
procedure DropPicture(var Message: TWMDROPFILES); message WM_DROPFILES;
В секцию var нужно добавить переменную buffer : array[0. .255] of char, а
сама процедура будет выглядеть так:
procedure TForml.DropPicture (var Message: TWMDROPFILES); begin {прием
файлов, брошенных на формуJ
DragQueryFile(Message.Drop,0,@buffer,sizeof(buffer)); try
Imagei.Picture.LoadFromFile(buffer); {пробуем загрузить1
Formi.Labell.Caption:"buffer; except end; end;
Здесь процедура DragQueryFile возвращает нам в переменной buffer строку с
Предыдущая << 1 .. 112 113 114 115 116 117 < 118 > 119 120 121 122 123 124 .. 218 >> Следующая