Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 64)


Программирование на DELPHI
Выпуск #64 (10 марта 2007 г.)

Разделы сайта:

Delphi.int.ru

Новости сайта
Регистрация »
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Рассылки сайта
Дружеств. сайты
Каталог ссылок

Delphi.int.ru Expert

Доброго времени суток, уважаемые читатели!

Сказать в общем-то и нечего... Всё как обычно.

Всех дам с прошедшим праздником!

Статистика системы Delphi.int.ru Expert на 10.03.2007, 12:00:

Зарегистрированных экспертов: 77 (+2), из них в активном режиме 58 (0).
Участниками задано вопросов: 390 (+53).
Всего отправлено ответов: 707 (+112).

Приятного чтения и до скорой встречи!

Разделы рассылки:

» Авторское слово
» Обучение Delphi
» Delphi.int.ru Expert
» Статья по Delphi
» Файловый архив
» Ссылки
» Юмор

Количество читателей рассылки (10.03.2007, 12:00):
5428+981+273= 6682.

Связь по e-mail:

admin@delphi.int.ru

Если Вы хотите где-нибудь разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с автором или администратором.
Обучение Delphi

Работа с компонентами в дизайнере форм

Автор:
Ерёмин Андрей
Номер статьи:
3

 

 

Информация, ведущая к обязательному изменению проекта, поступит к автору этого проекта тогда и только тогда, когда чертежи уже выполнены.

В прошлый раз мы познакомились в основными элементами среды Delphi. Теперь пришло время научиться создавать интерфейсы для программ хотя бы на начальном уровне.

Размещение компонент на форме

Совершенно очевидно, что интерфейс программы создаётся самим программистом. В Delphi (а также в большинстве других сред объектно-ориентированного программирования) элементы размещаются на форме очень просто. Для этого нужно выбрать интересующий компонент на одной из вкладок палитры компонент (Component Pallete), щёлкнув по нему и второй раз щёлкнуть по форме. В месте щелчка появится выбранный компонент и с этого момент он принадлежит данной форме.

Выбор объектов в дизайнере форм

Выбрать объект очень просто - достаточно щёлкнуть по нему. Также объекты можно выбирать с помощью клавиатуры - достаточно нажать клавишу [Tab]. С помощью этой же клавиши можно далее последовательно выбирать все объекты, расположенные на форме. Иногда требуется выбрать сразу несколько объектов. Мышью это делается стандартным способом: не отпуская кнопку мыши очертить прямоугольную область. Все объекты, попавшие в эту область, окажутся выделенными. Для выбора произвольных объектов, не очерчивая область, достаточно удерживать клавишу [Shift] и щёлкать по нужным объектам.

Перемещение элементов на форме

Компоненты можно легко перемещать по форме. Наиболее быстрый способ - "захватить" компонент мышью и перетащить в нужно место. Обратите внимание, что в дизайнере форм есть специальная сетка (точки, стоящие на равном расстоянии друг от друга). С помощью этой сетки удобно выравнивать компоненты относительно краёв формы или относительно друг друга. При перемещении мышью компонент перемещается именно по этой сетке. Также перемещение можно выполнять с помощью клавиатуры. Если компонент выделен, то перемещать его по сетке можно с помощью комбинаций клавиш [Ctrl]+[Shift]+[стрелка]. [стрелка] - одна из клавиш "вверх", "вниз", "влево" или "вправо". Но не всегда сетка позволяет разместить компоненты так, как задумано, поэтому перемещать компоненты можно и с более высокой точностью - по одной экранной точке (пикселю). Для этого служит комбинация [Ctrl]+[стрелка].

Изменение размеров элементов

Если помещать компоненты на форму "стандартным" методом - просто щёлкая в произвольном месте формы, то компоненты принимают размер, установленный стандартом. Однако стандартные размеры очень часто оказываются неудобными. Помещая компоненты на форму, можно сразу указывать их размеры. Делается это очень просто - вместо щелчка по форме нужно нажать кнопку мыши и, не отпуская её, растянуть прямоугольную область. В результате компонент примет размер очерченной области. Изменять размеры установленных на форме объектов не менее просто - если выделить объект, то на его контуре появляются так называемые узлы, потянув за которые как раз можно изменить размеры. С помощью клавиатуры размеры изменяются при помощи комбинаций [Shift]+[стрелка].

Изменение размеров объекта

Перекрывание объектов

Ничто не мешает делать элементы такими, что они будут перекрывать друг друга. Например, разместите на форме кнопку (Button1), а затем ещё одну (Button2) прямо поверх первой. Вероятно, вторая кнопка частично перекроет первую (см. рисунок). Но как быть, если Вы хотите, чтобы наверху была именно первая? Всё очень просто. Откройте контекстное меню второй кнопки (щёлкните по ней правой кнопкой мыши) и выберите в меню Control - Send to Back (Отправить назад). Вторая кнопка уйдёт за первую. В том же меню есть команда Bring to Front (Перенести вперёд) - перемещает элемент на уровень выше.

Перекрывание объектов

Настройка сетки дизайнера форм

Не всегда стандартная сетка в дизайнере форм удобна. Некоторые приложения изначально создаются с нестандартными элементами нестандартных размеров. Настроить сетку можно в окне Tools - Environment Options, вкладка Designer, блок Grid options. Параметры Grid size - X и Y позволяют изменить шаг сетки по горизонтали и вертикали соответственно. Опция Display grid отвечает за отображение сетки вообще, т.е. если сетка не нужна, её можно отключить совсем. Опция Snap to grid указывает на то, как компоненты будут себя вести при помещении на форму и при перемещении. Если выключить эту опцию, то компоненты будут просто "не замечать" сетку и двигаться не по точкам, а произвольно.

Заключение

В данном уроке мы рассмотрели все основные манипуляции с объектами на форме. Однако размещать элементы на форме "как попало" и произвольно изменять их размеры (например делать огромные кнопки) крайне нежелательно. Существуют специальные стандарты и в одном из уроков мы с ними познакомимся.

Delphi.int.ru Expert
(текущая версия системы: 1.66a
последнее обновление: 10.03.2007)

Если Вы не являетесь зарегистрированным пользователем сайта, зарегистрируйтесь прямо сейчас! Регистрация »

Delphi.int.ru Expert - это автоматизированная система экспертной помощи, призванная помочь в решении проблем, возникающих как у начинающих, так и опытных программистов, а также способствующая обмену информации между участниками лично и публикации этой информации в массовых рассылках в дальнейшем. Система полностью автоматизирована и постоянно развивается и обновляется. Если у Вас есть какие-то либо вопросы или Вы столкнулись с какой-либо проблемой при программировании на Delphi/WinAPI - задайте свой вопрос и эксперты Вам помогут. Кроме того, Вы сами можете войти в состав экспертов и помогать другим.

Задать вопрос экспертам » | Справочное руководство » | Перейти в состав экспертов » | Эксперты системы »

Здесь публикуются вопросы вместе с ответами, срок действия которых закончился (каждый вопрос действителен в течение одной недели).

* Администраторы сайта не корректируют сообщения и за наличие грамматических ошибок ответственности не несут.

Delphi.int.ru Expert  – вопросы и ответы (#161 - #170)
Вопрос № 161

Текст вопроса:

В БД InterBase хранятся документы в формате PDF. Подскажите, как сделать просмотр в форме и браузере на Delphi 2006?

Автор вопроса: Краснов Сергей (статус: Посетитель)
Дата и время отправки вопроса: 18.11.2006, 07:55
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: min@y™ (статус: 5-ый класс), 20.11.2006, 08:37]:

Если на компе у тебя установлен какой-нить Acrobat (Reader), то тыкай в Delphi: Component -> Import ActiveX control и там в списке найдёшь Adobe Acrobat 7.0 Browser Control Type Library. Сам я с ним не работал, но давно где-то в инете натыкался на статью, посвящённую сабжу.

Больше ничем помочь не могу, сорри.



Вопрос № 162

Текст вопроса:

Вечер Добрый! Подскажите пожалуйста, где можно найти инфу по написанию клиента на делфях к SQLServer?

Автор вопроса: T (статус: Посетитель)
Дата и время отправки вопроса: 18.11.2006, 21:08
Получено ответов на вопрос: 0
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

К сожалению, ответов на данный вопрос не поступило...



Вопрос № 163

Текст вопроса:

Уважаемые эксперты!
1) Необходимо сделать настройки горячих клавиш, наподобие как в WinAmp. То есть, есть лист, где два столбца (что это за компонент? Случаем не ValueListEditor?): Пункт и Горячая клавиша. Две кнопки (Принять и Очистить) и компонент HotKey. Нужно, чтобы при выборе строки из листа горячая клавиша
появлялась в HotKey (конечно, если она есть в листе). Затем эти данные (из листа) заносить в Ini-файл и при загрузке программы заносить их обратно в лист. Пунктов много (150-200, разделенные на несколько частей) и они заранее известны (и прописаны в листе). Что для всего этого нужно? Желательно с примером...
2) Как создать глобальные горячие клавиши?
3) Почему у меня не отображается Pages Common Controls, а в частности TTextViewer и TTextBrowser (D7)? Заранее спасибо...

Автор вопроса: feenords (статус: 1-ый класс)
Дата и время отправки вопроса: 19.11.2006, 00:08
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 10
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Dron (статус: 10-ый класс), 19.11.2006, 08:37]:

Здравствуйте, feenords!
1. Нет, в Winamp используется не ValueListEditor - там обыкновенный SysListView (в Delphi соответственно TListView со страницы Win32). Он достаточно удобен. Создаются два столбца и дальше они обрабатываются циклом. В ini-файл комбинации клавиш записываются в числовом эквиваленте. Более того, для этого даже ничего не нужно делать - тип TShortcut или THotkey легко можно использовать в качестве в параметра в IniFile.WriteInteger(). Аналогично делается и загрузка - через ReadInteger(). Раз горячих клавиш много, то всё следует обрабатывать циклом.
2. Их можно регистрировать в системе вручную, но проще воспользоваться готовыми компонентами. Я рекомендую использовать JvApplicationHotKey из JediVCL. В последних версиях пакета компонент немного изменил своё название, но найти его не сложно. Работать с ним просто: в HotKey заносится нужная комбинация, дальше Active:=True и горячая клавиша уже работает. При нажатии активируется соответствующее событие. При выходе из программы желательно делать Active:=False во избежание дальнейших ошибок. При этом никто не мешает регистрировать горячие клавиши собственноручно. См. пример в приложении. Там всё достаточно просто.
3. По умолчанию в Delphi вкладка "Common controls" скрыта, а компоненты "раскиданы" по остальным вкладкам. Компоненты TTextViewer и TTextBrowser недоступны вообще, даже при перемещении их на другие вкладки. К сожалению, указать точную причину этого я не могу.
Удачи!

Приложение:

Оценка за ответ: 5.
Комментарий: 1) Можно небольшой примерчик связи HotKey со вторым столбцом (занесение в данный столбец)?



Вопрос № 164

Текст вопроса:

Как автоматически создать псевдоним базы данных,
причем каталог с файлами должен указать пользователь
и на основе этих данных задается путь к базе в псевдониме.
Функция ExtractFilePath(ParamStr(0)) извлекает путь только
если файл данных находится в том же каталоге что и исполняемый
файл, а нужно указать путь, например если база находится на сетевом диске.
Спасибо за ответ.

Автор вопроса: Alexey (статус: Посетитель)
Дата и время отправки вопроса: 19.11.2006, 00:41
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 3
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 19.11.2006, 03:06]:

Здравствуйте, Alexey!
Как создать псевдоним быза данных - воспользоваться методом TSession.AddStandardAlias(...). Первый параметр - имя псевдонима, второй - путь, третий - тип базы данных.
Выбрать каталог можно с помощью SHGetPathFromIDList(...), если этот диалог не нравится можно взять простой TOpenDialog и выбирать любой файл быза данных, а потом "округлять", оставив только каталог.

Приложение:

Оценка за ответ: 5.



Вопрос № 165

Текст вопроса:

Здравствуйте, хотел бы узнать вот что: Какой метод должен быть в программе, чтобы часы выводили на экран текущее астрономическое время? Опишите пожалуйста этот метод. И ещё: как проверить чётность числа? If x mod 2=0 Then... это понятно, а второй способ?

Автор вопроса: Полушин Сергей Анатольевич (статус: Посетитель)
Дата и время отправки вопроса: 19.11.2006, 12:50
Получено ответов на вопрос: 5
Сообщений в форуме вопроса: 6
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Dron (статус: 10-ый класс), 19.11.2006, 16:22]:

Здравствуйте, Полушин Сергей Анатольевич!
Честно говоря, не понял, с чего Вы взяли, что способов проверки чётности числа всего 2... Ну раз 2, значит 2 :-) Первый, как Вы верно указали - проверять остаток от деления с помощью mod, а второй, более удобный - использование готовой функции... Однако стандартная функция проверяет не чётность числа, а его нечётность. Это функция Odd. Вот пример:
If not(Odd(x)) Then {число чётно}
Удачи!

Оценка за ответ: 4.

2. [Отвечает: Косолапов Дмитрий Юрьевич (статус: 2-ой класс), 19.11.2006, 18:28]:

Не совсем понятно, что значит "текущее астрономическое время", но узнать системное время можно, используя функцию Time...

3. [Отвечает: Новаковский Юрий Аврамович (статус: 3-ий класс), 20.11.2006, 12:16]:

Здравствуйте, Полушин Сергей Анатольевич!

Если Вам действительно нужно текущее астрономическое время, см. здесь:

http://www.intuit.ru/department/se/pposix/12/pposix_12.html на Си, но лучше чем ничего.
Удачи Вам!

4. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 21.11.2006, 04:32]:

Здравствуйте, Полушин Сергей Анатольевич!
Добавлю только пару слов о Odd. Это суперфункция, т.е. например, если указать ей константное значение оно будет вычислено на этапе компиляции, а потом просто возвращено. И еще, это быстрая функция, она использует флаг P контроля четности, выставляемый командой ADD.

Оценка за ответ: 4.

5. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 21.11.2006, 09:43]:

Самый универсальный вариант безотносительно языка программирования - если чесло чётное, то младший бит числа равен 0, если не чётное - 1.
Следовательно в Delphi это может выглядеть так:
if (i and 1)=0 then ... // число чётное

Оценка за ответ: 2.



Вопрос № 166

Текст вопроса:

Здравствуйте. В вопросе № 156 я спрашивал, как ограничить доступ к файлу Test.dat другими приложениями, пока запущено собственное. Но, видимо, вопрос был сформулирован некорректно. Дело в том, что интерес представляет ограничение доступа к файлу в принципе. Т.е., программа работает с каким-то файлом (*.ini; *.doc; *.txt и т.д.). В этот файл программа осуществляет чтение/запись. При чем, файл открывается только на время операции чтение/запись. Все остальное время он закрыт (это принципиально).
Подскажите пожалуйста, как сделать так, чтобы пока приложение запущено этот файл нельзя было открыть/скопировать проводником или Total commander'ом.

Автор вопроса: Романов М.Ю. (статус: Посетитель)
Дата и время отправки вопроса: 19.11.2006, 18:56
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Alex Van Glukhman (статус: 7-ой класс), 19.11.2006, 20:37]:

Здравствуйте, Романов М.Ю.!
Как и было написано ранее.
Тип TFileStream.
Берёшь файл с которым работаешь - вешаешь его в поток с параметром fmShareDenyNone, и делай с ним в проге всё что хочешь. Я же приводил код.

2. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 21.11.2006, 04:43]:

Здравствуйте, Романов М.Ю.!
Есть два известных мне способа блокировать файл:
1. CreateFile с соответствующим параметром dwShareMode, суда же относятся TFileStream и file AssignFile т.к. это одно и тоже.
2. Написать драйвер, который будет перехватывать CreateFile, проврять имя файла - если указан Ваш файл - возвращать ошибку, если нет - передавать управление в оригинальную системную функцию.

Думаю в Вашем случае применим первый вариант.



Вопрос № 167

Текст вопроса:

Пишет автор вопроса № 165. Первая часть вопроса, видимо, не всем стала ясна. Как сделать так, чтобы выводилась строка, в которой было написано 12:30:45 РМ или АМ, короче текущее время а часть дня, это и есть астраномическое время. Пробовал искусственным способом, ну то есть проверять скок время и добавлять РМ или АМ условием больше или меньше 12, всё получается, но в вопросе сказано одним оператором. Заранее спасибо.

Автор вопроса: Полушин Сергей Анатольевич (статус: Посетитель)
Дата и время отправки вопроса: 21.11.2006, 18:37
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: mvp (статус: 4-ый класс), 21.11.2006, 20:35]:

FormatDateTime('hh:mm:ss am/pm', now);

Посмотрите в helpe FormatDateTime и Date-Time Format Strings, если интересно, как это работает :)

Оценка за ответ: 5.

2. [Отвечает: min@y™ (статус: 5-ый класс), 22.11.2006, 08:28]:

А ещё есть чудесный модуль DateUtils.pas, там много вкусных функций для работы с датами и временами. Ну, и в частности вот эта:

Приложение:

Оценка за ответ: 3.



Вопрос № 168

Текст вопроса:

Здравствуйте. Хочу узнать, можно ли написать прогу, типа драйвера, чтобы через неё можно было регулировать напряжение в USB порту, ну а если не регулировать, то тогда хотябы отключать или включать его.

Автор вопроса: Полушин Сергей Анатольевич (статус: Посетитель)
Дата и время отправки вопроса: 21.11.2006, 20:17
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Средний уровень), 22.11.2006, 11:18]:

С помощью Делфи написание драйвера трудная задача (трудная? мож неразрешимая оффициально, но некоторые думаю иначе). Это раз. А во вторых регулировать напряжение там вроде как и не можно. Но всегда есть резервный вариант. Никто не мешает подавать импульсы с различной скважностью, а на выходе порта поставить электролитический конденсатор. И если первая часть ещё делфи касается, то вторая нет. Может вы задачу слишко зашифровали? И решить можно проще. Что хочеться сделать?

Оценка за ответ: 4.
Комментарий: Спасибо. Всё ясно, больше ничего не нужно.



Вопрос № 169

Текст вопроса:

Здравствуйте,уважаемые эксперты!Ответьте,пожалуйста, на такой вопрос: как из Дельфи6 напрямую обращаться к LPTпорту под WinXP?Способ,применяемы под Win9x не годится - Винда не пропускает

Автор вопроса: Мережников Андрей (статус: Посетитель)
Дата и время отправки вопроса: 22.11.2006, 19:21
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: min@y™ (статус: 5-ый класс), 23.11.2006, 08:26]:

Вариантов, я думаю, много.
На работе мне приходится обращаться к плате, которая торчит в ISA-слоте. Под WinXP. Естественно, написать обмен на ассемблере - не прокатит, т.к. команды IN и OUT заблокированы и доступны только приложениям кольца 0 (драйверам). Пришлось юзать компонент TDLPortIO, который работает со своим универсальным драйвером, позволяющим обмениваться данными с портами с адресами от $100 до $FFFF. Всё работает, все довольны.

При установке этого пакета в палитре компонентов появляются 2 компонента: для работы с последовательными и параллельными портами соответственно.

Скачать его можно, например, отсюда:
http://www.torry.net/vcl/system/portaccess/dlportio.zip

Ещё советую зайти сюда: http://www.torry.net/pages.php?id=227

Тут много чего есть, например (см. приложение):

Приложение:

Оценка за ответ: 4.

2. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 23.11.2006, 11:01]:

Ну к Delphi этот вопрос прямого отношения не имеет, но всё-же. Напрямую обращаться к LPT-порту, по-хорошему, под w2k/xp из пользовательского процесса нельзя - нужно писать драйвер. Но это только по-хорошему - в реальности существуют универсальные драйверы, обеспечивающие не совсем честным путём прямой доступ к портам. К таким драйверам относятся giveio.sys или gwiopm.sys. Google по запросу "gwiopm.sys Delphi" выдаёт неплохие ссылки с самим драйвером и примерами работы.

Оценка за ответ: 4.



Вопрос № 170

Текст вопроса:

Здравствуйте уважаемые эксперты!
На одном компьютере видел, что сообщения об ошибках Delphi, появляющиеся при exception'ах (вроде Division by zero, Invalid floating point value и пр.) были русифицированы. Также были русифицированы стандартные заголовки MessageDlg() и названия кнопок в этих стандартных диалогах. Как выяснилось, существует какая-то библиотека, которая всё это русифицирует. Может быть, кто-то встречался с этой библиотекой? Если да, подскажите, где скачать или хотя бы её название. Заранее благодарю.

Автор вопроса: Sunshine (статус: Посетитель)
Дата и время отправки вопроса: 22.11.2006, 19:57
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Новаковский Юрий Аврамович (статус: 3-ий класс), 22.11.2006, 21:03]:

Здравствуйте, Sunshine!

Вот файлик с некоторыми русскими ресурсами
для Delphi7

http://expert.delphi.int.ru/download_25

Удачи Вам!




Статьи  >>

Перемещение TImage по форме во время работы приложения

Автор: Михаил Христосенко
Источник: http://delphid.dax.ru

Многие, наверно, сталкивались с проблемой перемещения Image'a по форме. Решить ее можно тремя способами (может есть и больше).

Способ первый. Его суть заключается в том, что свойства Left и Top картинки изменяются на разницу между начальными и конечными координатами (нажатия и отпускания мыши соответственно). Этот способ самый простой и надежный, но у него есть один недостаток: left и top изменяются по очереди, что приводит к заметному мерцанию картинки. Тем не менее мы этот способ рассмотрим. Не забудьте положить на форму Image и вставить в нее какую-нибудь картинку. Для начала необходимо объявить глобальные переменные (они объявляются в разделе Implementation) x0, y0:integer - они будут запоминать начальные координаты. И еще нам понадобится переменная move типа boolean, чтобы нам отличать перемещение мыши над картинкой, от попытки ее сдвинуть. Эти объявления делаются примерно так:

implementation

var x0,y0:integer;
move:boolean;

{$R *.DFM}

Теперь напишем обработчик OnMouseDown для нашей картинки:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;

В этом участке кода проверяется какой кнопкой нажали на картинку. Если левой, то запоминаем координаты, а если любой другой, то перемещать нельзя.

Теперь напишем обработчик OnMouseMove для нашей картинки:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if move then begin
image1.Left:=image1.Left+x-x0; // Изменяем позицию левого края
image1.Top:=image1.Top+y-y0; // Изменяем позицию верхнего края
end;
end;

Ну и наконец обработчик OnMouseUp для нашей картинки будет таким:

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;

Здесь все очень просто. Когда кнопка отпускается, то переменной move присваивается значение false, чтобы до следующего клика по картинке ее нельзя было сдвинуть.

Этот способ довольно прост, как для понимания, так и для реализации. Но такой же алгоритм перемещения можно реализовать немного красивее. У некоторых компонентов, в том числе и Image, есть такая классная процедура SetBounds(Left,Top,Width,Height), которая может изменять сразу все четыре параметра. Таким образом событие OnMouseMove можно изменить так:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if move then begin
image1.SetBounds(image1.Left+x-x0,image1.Top+y-y0,image1.width,image1.height);
end;
end;

Но есть еще один очень интересный выход: по экрану можно перемещать не саму картинку, а только ее рамку, когда пользователь выберет место для картинки и отпустит кнопку - она туда переместиться. Для этого нам понадобится еще одна глобальная переменная: rec: TRect, которая будет хранить параметры картинки. Теперь слегка изменим обработчики событий для картинки. Таким образом все в целом будет выглядеть так:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false
else begin
move:=true;
x0:=x;
y0:=y;
rec:=image1.BoundsRect; //запоминаем контур картинки
end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if move then begin
Form1.Canvas.DrawFocusRect(rec); //рисуем рамку
with rec do begin
left:=Left+x-x0;
top:=Top+y-y0;
right:=right+x-x0;
bottom:=bottom+y-y0;
x0:=x;
y0:=y; // изменяем координаты
end;
Form1.Canvas.DrawFocusRect(rec); // рисуем рамку на новом месте
end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Form1.Canvas.DrawFocusRect(rec);
with image1 do begin
setbounds(rec.left+x-x0,rec.top+y-y0,width,height); //перемещаем картинку
move:=false;
end;
end;

Поскольку DrawFocusRect рисует рамку методом Xor, то при повторном вызове этой функции с теми же параметрами, рамка стирается.

Этот очень красивый метод добавит в ваши программы много интересного. Так что пользуйтесь.

Вы можете отправить свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте.


Файловый архив  >>

Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения

Уважаемые читатели! Отправляйте полезные компоненты/модули, интересные исходники, собственные программы/игры и мы разместим их на сайте. Отправить можно здесь »

Последние поступления
Название
Описание
Раздел
Объём
Ссылки
cbAsyncDirScan
Объект TcbAsyncDirScan сканирует каталог на наличие файлов и подкаталогов, используя потоки, что позволяет избежать "заморозки" приложения во время сканирования. Можно указать максимальную глубину сканирования, а также задать фильтр файлов, которые будут отображены в списке найденных файлов. Совместимость: CB2k6, CB5, CB6, D2005, D2006, D5, D6, D7.
480 Кб
RtfLabel

VCL-компонент, использующий безоконный интерфейс ITextServices компонента Windows RichEdit Control 3.0+ для вывода надписей с возможностью RTF-форматирования.
Возможности:
- Полное RTF форматирование как в WordPad с изображениями, OLE-объектами и прозрачным фоном;
- Увеличение от 2% до 6400%;
- Автоматическое изменение размера по содержимому.
Небольшая документация (англ. и нем.) и демо-приложение в комплекте.

107 Кб
Dr.SAGURA Media Player

Видео-проигрыватель, использующий DirectX, поддерживающий большинство кодеков (DivX, Xvid, MPEG и т.д.) с открытым исходным кодом. Для включения компонента в приложение требуется всего один файл - mediaplr.dll. Проигрыватель может заменить Windows Media Player. Очень гибкий и простой.

473 Кб
MP3-Плеер

Небольшой медиа-плеер, созданный на основе стандартного TMediaPlayer. Автоматически сканирует выбранный каталог на наличие mp3-файлов. Реализована функция автоматического перехода в начало списка после завершения последней из списка записи.

3 Кб
Всего новых файлов: 4  
1 Мб
 

Если у Вас есть книги по Delphi (в электронном виде, разумеется) или другая полезная документация - сообщите и её можно будет разместить на сайте.

Отправить файл »   

Ссылки  >>

Дружественные сайты   |   Каталог ссылок

Обмен баннерами приветствуется для сайтов схожей тематики. По поводу размещения текстовых ссылок обращайтесь сюда.

Рассылки Subscribe.Ru
Программирование на Delphi
Visual Basic для новичков и профессионалов
   
 

Юмор

Ведущий раздела: Bruder

34 способа применения CD

1.Классический способ. Самый ценный. Самый популярный. Сидюки можно использовать как подставку под чашку с чаем. Пойдите поставьте чайник и приготовьте свежий сидючок!

2. Самый блестящий способ. Можно украсить ими стенку - они красиво отражают. Все настоящие хакеры только так и делают.

3. Самый пошлый способ. Можно повесить на ниточках на своем стенде на выставке. Hа Интранет-96 так сделал как минимум Acer в Internet Saloon. Или кто-то из их партнеров.

4. Отреставрированный способ - из ASR FAQ. Возьмите будильник. Снимите стекло и стрелки. Оденьте сидюк. Оденьте стрелки. Ура! Модный счетчик времени готов.

5. Примитивизм. Знаете, что такое "too hot to handle"? Это сидюк в микроволновой печи.

6. Рекордный способ. Вы можете попасть в книгу рекордов Гиннесса (того самого, что делает Hапиток). Для этого сложите столб из сидюков столь высокий, насколько удастся. У меня получилось 3 метра 24 сантиметра. Шучу. Только 18 сантиметров.

7. Греческая народная игра - дискобол. Вариант - пляжный дискобол. Hо на пляже имейте в виду - сидюки боятся сырости.

8. Голливудская улыбка. Засунуть сидюк в рот и улыбаться весь день Широкой улыбкой.

9. Праздничный способ. Сидюками можно украшать елку на Hовый год. Или на 1 мая - по вкусу.

10. Просветительский способ. Сидюки можно использовать в школе на уроках черчения как циркуль фиксированного радиуса. Вы не знаете, что такое радиус? Это же половина диаметра!

11. Бухгалтерский способ. Взяв немного проволоки, из некоторого количества сидюков можно сделать счеты.

12. Кондитерский способ. Сидюками можно резать масло или торты.

13. Философский способ. Можно смотреть в дырочку на мир. А лучше в зеркало. Вы себя узнаете?

14. Медицинский способ. Знаете, у врачей УГH (ухо-горло-нос, отоларинголог) есть такие зеркальца с дырочкой на глаз? Только сидюк надо погнуть. Для фокусировки. Тогда можно будет заодно принимать программы HТВ+. Hо никаких гарантий! (Hу, уж радио-то точно можно.)

15. Спортивный способ. Трэки сидюка можно использовать как беговые дорожки на тараканьих бегах. Только тараканов надо найти ну очень мелких.

16. Оборонительный способ. Если на вас напали в подворотне - разломите сидюк пополам и защищайтесь! Или можно быстро обгрызть в нужную форму и использовать аки бумеранг. Если получится - приз - поездка в Австралию. В один конец. Обратно - вплавь.

17. Визуалистический способ. Используйте ваш CD как зеркало! Только сначала надо сточить дорожки.

18. Это радуга, которая всегда с тобой!

19. А вы умеете жонглировать? Попробуйте сидюками!

20. Любимый способ. В шреддер.

21. Hациональный способ. Кидать в воздух и стрелять. Вместо тарелок.

22. Хит киберпанковской моды! Используйте сидюки как серьги. И для пиерсинга вообще - каков простор для фантазии.

23. Азартный способ. Катать - у кого дальше. По сидюку за вист.

24. Кидать в почтовые ящики. То-то удивятся соседи! Особенно, если ящик-таки удастся сбить. Если не получится - возьмите гирю, вместо сидюка.

25. Скучающий способ. Крутить на пальце. Если пальцы слишком толсты - на диету. Или обработать напильником. Hу, не пальцы, конечно.

26. Опять мода киберпанков. Сидюки - самые модные кольца.

27. Есть киберпанки, а есть киберхиппи. Сидюки - чудные фенечки. Опять же голубая ленточка и черный бэкграунд. То есть кожа. Так что бэкграунд - только для чернокожих!

28. Hельзя оставить без внимания HР (не HomePage и не Хьюлетт-Пакард, а HовыхРусских). Можно использовать сидюки для тренировки растяжки пальцев. А вы пробовали садиться пальцами на шпагат? (Словарь русского языка: Шпагат - прочная бечевка).

29. Водяной способ. Можно кидать сидюки по поверхности воды, вместо камушков.

30. Физико-оптический способ. Hа них можно светить лазерной указкой. Если ее на сидюк направить, получается классная интерференционная картинка.

31. Декорационный способ. Можно использовать в качестве наклейки на поддельный проездной. Либо 1 CDюк нарезать заточенной мензуркой на несколько месячных единых, либо 1 CD наклеить на один большой Единый, например Годовой. А здоровый Видео CDюк можно и на пятилетку! А можно обычный, но Microsoft?a, тогда единый будет пожизненный - по инвалидности. Студентам - скидки: можно китайские клеить.

32. Гигиенический способ. Можно надеть CDюк на кран над раковиной и класть на него зубную щетку и станок для бритья. Hо запомните: поверхность сидюка неровна, как земной ландшафт...

33. Электротехнический способ. Можно ввинтить лампочку в патрон через CDюк (при необходимости сидюк предварительно обработать напильником). Киберпанковская люстра, блин!

34. Метод высоких гражданских позиций: можно обанкротить рынок. Покупаешь один китайский сидюк. С гарантией. Царапаешь его скрепкой. И еще раз на всякий случай. Возвращаешься на рынок. Меняешь CDюк. Далее то же, что и с CD #1. Выход из цикла по условию: (#CD=1.000.000.000){заметьте: все китайские сидюки скорее всего уже обцарапаны} или (Microsoft объявила об окончании поставок поддельного супа в
Россию из Редмонда) {заметьте: Ура, ваша гражданская неудовлетворенность удовлетворена, но на вашей совести теперь миллионы голодных китайцев, осваивающих изготовление Network Computer из ламповых телевизоров}.

Hо главное - не совать сидюки в CD-драйв! Зачем идею портить?

:))

Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они обязательно будут опубликованы.
Ведущий рассылки, Ерёмин Андрей.

В избранное