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

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

  Все выпуски  

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


Программирование на DELPHI
Выпуск #66 (7 апреля 2007 г.)

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

Delphi.int.ru

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

Delphi.int.ru Expert

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

Главная новость сайта и рассылки - открытие IRC-канала нашего портала!
Сегодня, 7 апреля, он запущен в тестовом режиме. Приглашаем Вас! На канале Вы сможете пообщаться с другими участниками. Для тех, кто знаком с сетью IRC, данные для подключения:

Сервер - irc.dalnet.ru
Порт - 6667
Канал - #delphiintru

Для тех, кто не знаком - подробное пошаговое руководство по подключению:

Руководство по подключению к IRC-каналу www.delphi.int.ru »

Ждём Вас на нашем канале!

Поздравляем всех с праздником Пасхи!

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

Зарегистрированных экспертов: 81 (+4), из них в активном режиме 58 (+2).
Участниками задано вопросов: 459 (+47).
Всего отправлено ответов: 802 (+61).
Всего сообщений на форумах вопросов: 715 (New).
Максимальное число разосланных писем: 553 (25.02.2007).

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

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

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

Количество читателей рассылки (07.04.2007, 15:00):
5460+1070+314= 6844.

Связь по e-mail:

admin@delphi.int.ru
expert@delphi.int.ru
info@delphi.int.ru

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

» Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи".
Последние 3 урока:

2. Первое знакомство
3. Работа с компонентами в дизайнере форм
4. Свойства в Delphi

Управление проектом

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

 

 

Чистота - это что-то из разряда невозможного (Закон кухни О'Рейли)

В каком виде сохраняются созданные программы? Этот вопрос возникает у любого начинающего программиста. Эта тема заслуживает отдельного внимания. Как известно, в Windows любая программа представляет собой exe-файл, который является исполняемым, т.е. может быть запущен как отдельное приложение. Понятно, что разрабатывая программу, в итоге нужно получить именно exe-файл, чтобы его можно было запустить на компьютере, где не установлена среда, в которой эта программа была создана. В языках программирования для DOS, в частности Turbo Pascal, всё довольно просто - весь программный код сохраняется в один-единственный файл, а в итоге получается exe-файл. Довольно просто и удобно. При переходе в Windows всё становится гораздо сложнее. Оконное приложение Windows не может быть сохранено в одном файле. Если в среде DOS программы можно называть именно программами, то в объектно-ориентированном программировании они называются проектами. Почему проектами? Всё достаточно просто - программа представляет собой совокупность н екоторого числа файлов различного типа, определённым образом связанных между собой. Очевидно, что всю эту группу логично назвать проектом.
В этой статье мы познакомимся с самыми основными типами файлов, которые включены в любой проект, созданный на Delphi. На самом деле типов файлов гораздо больше, но эти - базовые.

*.dpr - файл проекта

Это главный файл всего проекта. Если этот файл отсутствует, запустить программу будет невозможно. В файле хранятся все основные параметры приложения, а также информация об окнах, которые в приложение включены. Файл представляет собой свободно читаемый код. Посмотреть содержимое этого файла можно командой меню Project -> View Source.

*.dfm - файл описания формы

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

*.pas - модуль (самостоятельный, либо модуль формы)

Именно этот файл больше всего похож на файл программ Turbo Pascal. В этом файле находится код программы. Модули могут быть отдельными от конкретных проектов - в этом случае их можно подключить к любому проекту и использовать. Как правило, в отдельных модулях находятся вспомогательные функции, либо какие-либо объекты. Помимо этого модуль есть у каждой формы. В результате *.pas-файл неразрывно связан с файлом *.dfm, а форма соответственно описывается этими двумя файлами - один содержит её состояние и объекты, а второй - код программы, относящийся к этой форме. Следует отметить, что модули значительно облегчают процесс написания программы и ориентацию в больших модулях - отдельные элементы большого модуля можно вынести в несколько модулей и просто подключить их к проекту.

*.res - файл ресурсов

Это дополнительный файл. В нём находятся данные различных типов - это могут быть тексты, изображения, звуки и т.д. К примеру, для проекта этот файл создаётся автоматически и в нём сохраняется иконка (значок) приложения, а также некоторая информация о проекте.

Вот и все основные файлы, информацию о которых обязательно нужно знать. Чтобы перенести проект, достаточно следующих файлов: *.dpr, *.dfm и *.pas. Имея эти файлы проект можно восстановить, а программу - запустить. Желательно также наличие *.res-файла(ов), но тем не менее это не обязательно. Если *.res-файл, сопоставленный проекту будет отсутствовать, то при открытии проекта Delphi предупредит, что файл не найден и спросит, что нужно сделать. Достаточно проигнорировать сообщение и файл будет создан автоматически при следующем запуске программы.

Работа с проектом

Ну а теперь пришло время рассказать о базовых операциях с проектом, так как ранее речь об этом не шла. Рассмотрим всё по порядку.

Меню File содержит все основные команды управления проектом

Создание нового проекта

Для создания "чистого листа" следует выбрать в меню File -> New -> Application. В разных версиях Delphi содержимое подменю New может немного отличаться, но всё основное присутствует всегда. После этого создаётся новый проект, такой, какой появляется при запуске Delphi.

Открытие существующего проекта (или файла)

Для этого существует команда File -> Open... Выбрав файл *.dpr, откроется проект, а выбрав какой-либо другой файл (например, *.pas или *.dfm) откроется что-либо другое (например, отдельная форма).

Сохранение

С сохранением есть несколько тонкостей. Исходя из того, что проект представляет собой совокупность нескольких файлов, можно сделать вывод, что сохранять нужно все эти файлы, а не какой-то в отдельности. Выбрав File -> Save, Вы сохраните только текущую форму, но не более того, а проект останется "висеть в воздухе". File -> Save As... - стандартный пункт, который делает то же самое, что и Save, только позволяет пересохранить файл (форму) под другим именем. Команда Save Project As... сохраняет файл проекта (*.dpr). Таким образом, чтобы сохранить проект полностью, нужно сохранить каждую из форм и сам проект. Делать это по отдельности достаточно неудобно, поэтому существует команда, облегчающая этот процесс: File -> Save All. При вызове этой команды сначала появится диалог для сохранения формы (если форм несколько, то и диалогов будет несколько), а затем диалог для сохранения проекта. После того, как все диалоги отраб отали, можно с уверенностью сказать, что проект сохранён полностью.

Меню File содержит все основные команды управления проектом

Железное правило: каждый проект должен быть сохранён в отдельном каталоге!

Если в один каталог сохранить несколько проектов, то все файлы перемешаются и можно отправлять всё в корзину. Этого нельзя делать ни в коем случае!

Запуск и остановка программы

Теперь, когда проект сохранён, программу можно и запустить и посмотреть, что же получилось. Ещё одно правило, которое желательно соблюдать: перед запуском программы проект нужно сохранить. Мгновенный вопрос: зачем? Конечно, делать это или нет - решать Вам, но бывают случаи, когда программа зависает (по вине самого программиста например), а с ней зависает и оболочка Delphi. В этом случае ничего не остаётся делать, как "убивать" Delphi через Диспетчер задач Windows. Понятно, что изменения, которые были внесены в проект, теряются. Однако не всё так плохо. Случаи зависания Delphi IDE достаточно редки. Как правило, если программа зависает, Delphi позволяет её просто уничтожить из памяти и продолжить работу. Запомните следующие основные горячие клавиши:

Ctrl+F9 - компиляция программы. Что такое компиляция? Говоря простым языком - создание выходного (exe) файла программы. Следует отметить, что имя выходного файла совпадает с именем проекта, т.е. именем *.dpr-файла и не может быть изменено. Выходной файл создаётся в том же каталоге, где расположение *.dpr-файл. Однако компиляция просто "собирает" всю программу, но не запускает её.

F9 - запуск. В отличие от компиляции, это уже полноценный запуск программы.

Ctrl+F2 - остановка выполнения программы. Это именно то, о чём сказано чуть выше. Если нужно экстренно завершить работу программы, нужно активировать какое=-либо из окон оболочки Delphi и нажать это сочетание клавиш. Программа будет остановлена и можно будет безболезненно продолжить работу.

Все эти команды доступны и напрямую из меню: Run -> Run, Project -> Compile, Run -> Program Reset.

Все основные команды управления проектом вынесены также в виде кнопок на панели инструментов:

Панели инструментов Delphi

Свойства проекта

Окно свойств проекта

Для проекта можно установить множество разнообразных параметров. Все они находятся в окне Project -> Options. В частности, на вкладке Application можно указать заголовок проекта, который будет отображаться на кнопке программы на панели задач. Совет: всегда прописывайте заголовок своей программе, не оставляйте стандартного "Project1" - это резко бросается в глаза. На этой же вкладке можно выбрать иконку (значок) для приложения - файл *.ico размером 32х32 пикселя. В блоке Output settings можно указать расширение выходного файла. Заполнять это поле не обязательно - по умолчанию файлу присваивается расширение .exe. Однако в некоторых случаях эта настройка бывает полезной. Например, экранные программы-заставки представляют собой те же исполняемые exe-файлы, только имеют расширение .scr. Неудобно каждый раз после внесения изменений в программу, чтобы протестировать заставку, переименовыв ать файл. А прописав в указанное поле "scr" проблема мигом решится.

Вкладка Application в окне свойств проекта
Вкладка Application в окне свойств проекта влияет на внешний вид кнопки программы на панели задач

 

Окно свойств проекта

Заключение

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

Оцените данный урок по пятибалльной шкале:
1 2 3 4 5
Комментарии и замечания приветствуются.

 

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

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

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

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

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

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

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

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

Как возможно таблицу БД представить в виде дерева с возможностями модификации данных? Как просто сделать дерево понятно.

Автор вопроса: Наташа (статус: Посетитель)
Дата и время отправки вопроса: 30.11.2006, 14:59
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

1. [Отвечает: Помфюк Владимир Степанович (статус: 7-ой класс), 30.11.2006, 15:36]:

Здравствуйте, Наташа!
Дерево можно сделать в двух случаях:
1)есть серия таблиц которые ссылаются друг на друга (Задача->Работник->Отдел)
2)есть набор данных с полями, которые можно сгрупировать(select City, Department, FIO, ID from workers order by 1,2,3)
Рисовать дерево надо перебирая в данные цикле (или вложеных циклах). При создании каждого TreeNode в его свойство Data (тип - Pointer) надо занести указатель на record в который стоит записать начальное значение и условие которое идентифицирует запись (группу записей) и, при необходимости, таблицу. Тогда в событии OnEdited Вы легко сможете написать SQL-запрос обновления таблицы.
Еще: на OnDeletion всем этим датам надо сделать dispose.

Приложение:

2. [Отвечает: Alex Van Glukhman (статус: 7-ой класс), 30.11.2006, 16:39]:

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

Создать структуру дерева в зависимости от того что должно появиться в представлении например варианты
1.имя таблицы - поля - значения
2.имя таблицы - номер записи - значения полей
и т.д.
А далее структурой
Tbl.first;
while not Tbl.eof do
begin
...
//Переносим значения таблицы в TTreeView у каждого
//TreeViewItem есть свойство Text
...
Tbl.next
end;

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



Вопрос № 182

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

Как программно в Delphi7 просмотреть права группы пользователей на указанную директорию, в которую входит текущий пользователь?

Автор вопроса: Наташа (статус: Посетитель)
Дата и время отправки вопроса: 30.11.2006, 15:00
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

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

Обратитесь к справке по поводу функций ACL. В одном с недавних журналов Хакер был пример.

2. [Отвечает: Николай Рубан (статус: 2-ой класс), 01.12.2006, 12:32]:

Рекомендую Вам воспользовать командой Cacls.

Cacls
Просмотр или изменение файлов избирательных таблиц управления доступом (DACL).

В приложении смотрите пример использования, после выполнения команды создасться файл 1.txt, в котором будут данные о правах доступа к папке которая описана в переменной s.

Удачи!!!

Приложение:



Вопрос № 183

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

Здраствуйсте ув. эксперты!
Я так и не дождался ответа в вопросе 175. Поэтому задам его здесь еще раз.
Короче: как на delphi сделать что то типа рабочего стола в Windows? Главное чтобы значки можно было двигать "повсюду".

ЗЫ: Я пробовал через ListView но у меня не получилось

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


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

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

Здравствуйте, Александр!
Что Вам мешает написать свой класс от TGraphicControl, содержащий в себе все нужные Вам данные (иконка, подпись и все остальное) и реализующий в себе методы выделения, перетаскивания и рисования. Потом пишите потомка, например от TPanel - хозяина всех этих значков. Он в свою очередь, должен содержать в себе методы выделения (с помощью клавиатуры), сохранения положения всех значков и т.д.

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

2. [Отвечает: min@y™ (статус: 6-ой класс), 01.12.2006, 08:56]:

Лень читать хэлп по TListItem? Ладно, я сделал это за тебя. Вот тебе пример, как таскать мышой иконки по ListView в режиме vsIcon (см. приложение). Я такого никогда не делал, но поиск нужной инфы в хэлпе + написание примера заняло у меня 10 минут.

Приложение:

Оценка за ответ: 4.
Комментарий: Спасибо. Но разговаривать все же надо по вежливей.

3. [Отвечает: Denisss (статус: 2-ой класс), 01.12.2006, 20:45]:

Здравствуйте, Александр!

Небольшое дополнение к ответу min@y™. См. приложение.

Удачи!

Приложение:

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



Вопрос № 184

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

Доброе время суток, господа программисты. Как написать программу, в которой внутри будет защита от копирования. Вот допустим у меня есть файл, я пытаюсь его скопировать, а мне пишут, типо нельзя.

Автор вопроса: Geron (статус: 1-ый класс)
Дата и время отправки вопроса: 01.12.2006, 14:11
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

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

Здравствуйте, Geron!
Не совсем корректно задан вопрос - программа сама не может защитить себя от копирования, так как Вы описали, если она (программа) не запущена (если не рассматривать драйвера). В программу может быть вшит алгоритм защиты от копирования, например такой: при первом запуске определяется текущий каталог, сохраняется где-то и при последующих запусках программы сверяется с сохраненным. Если не совпадает - работа завершается. Естественно это только пример, на самом деле нужно использовать сразу несколько "критериев привязки к системе", таких как серийный номер и тип процессора, номер материнской платы, винчестера, логического диска т.д. Все эти данные должны где-то как-то хитро сохраняться, чтобы небыло возможности для их подмены, а потом сверяться.

Есть еще такая вещь как Таблицы Управления Доступом к файлам (ACL). Вы можете запретить доступ к файлу, а при использовании этого файла Вашей программой изменять права доступа, разрешая доступ на чтение.
Делается это с помощью консольной утилиты CACLS.
Вот пример как запретить доступ к файлу C:\test.dat:
CACLS "C:\test.dat" /P admin:N

Пример как разрешить только чтение файла:
CACLS "C:\test.dat" /P admin:R



Вопрос № 185

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

у моей программы не работает докачка, может кто-нибудь знает где ошибка?
Вот код которым я пользуюсь.

Приложение:

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


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

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

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

В коде отсутствует метод Append. А вообще это лучше делать через TFileStream



Вопрос № 186

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

Здравствуте, подскажите как сделать программную непрерывную задержку звука на 1-2сек. (например вход микрофон, выход колонки)
Спасибо.

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


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

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

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

Данная тема достаточно сложная. Вот исходник для работы со звуком на низком уровне. Попробуйте разобраться. Удачи!!!

Приложение:



Вопрос № 187

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

1. Перемещаю в игровой программе картинки Image в цикле While, используя Form.Update. При исполнении программы нервирует постоянное мерцание при перерисовке объектов. Используя вместо циклов таймеры, результат получше, но не хочу. Можно ли сделать вывод более мягким и сглаженным?

2. Как узнать количество принятых и переданных модемом данных в байтах?

Автор вопроса: Павлов Евгений Владимирович (статус: Посетитель)
Дата и время отправки вопроса: 07.12.2006, 01:16
Получено ответов на вопрос: 3
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


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

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

Здравствуйте, Павлов Евгений Владимирович!
1. Основная идея избавления от мерцания - не совершать промежуточных закрашиваний. При использовании TImage эти лишние отрисовки появляются. Вам нужно лучше использовать единое поле для рисования, скажем TPaintBox и отрисовывать в нем изображения самостоятельно методом Draw (он самый быстрый в GDI). Если картинка изменила свое положение Вы можете вычислять области, которые необходимо закрасить фоном, но не закрашивая текущее положение картинки. Если перемещения картинок сложные и этот вариант не проходит - заведите канву в памяти (используя TBitmap, т.к. TCanvas - виртуальный класс) и рисуйте на нем, а в конце, когда все отрисаванно - просто выводите на экран.

2. Начните искать с вот этой ссылки - http://delphi.about.com/od/fullcodeprojects/l/aa112903a.htm.

2. [Отвечает: Dron (статус: 10-ый класс), 07.12.2006, 08:05]:

Здравствуйте, Павлов Евгений Владимирович!
1. Конечно, делать стандартными средствами графическую игру - это неправильно. Даже если вам удастся избавиться от мерцания, могут появиться новые проблемы. Например, если вы будете перемещать одновременно большое количество изображений. Для написания 2D-игр лучше использовать соответствующие готовые движки. Самый распространённый - DelphiX. Там никакого мерцания, естественно, не будет. При этом, конечно, вам потребуется какое-то время на изучение базовых принципов работы с движком.
Загрузить движок можно здесь: ftp://rada.evpanet.com/soft/UnDelphiX_D7.zip

Оценка за ответ: 5.
Комментарий: Спасибо за помощь. Любая информация полезна. Правда, я никогда не понимал использование готовых движков вместо собственных идей.

3. [Отвечает: Вадим К (статус: Средний уровень), 07.12.2006, 12:49]:

Рекоменую уйти от отрисовки в цикле и перейти к отрисовке по таймеру/потоку. Мож это как бы сложно, но потом это окупиться десятикрат.
По поводу отрисовки. Для быстрой отрисовки я использую следующий приём. Рисую вначале на TBitmap,который создан динамчески в памяти, а потом одной строкой переношу на форму. Лучше рисовать в обработчике OnPaint по следующей причине: Windows в этот момент ожидает от вас отрисовки и не "мучиться сама".
В общем код для отрисовки схематически должен выглядеть так. Дополнительный поток, который реализует логику, анализирует клавишы, таймеры и решает, что куда поставить. Поменяв некоторые переменные, он вызывает PostMessage(Form1.handle, WM_Paint,0,0) и этим генерит сообщение о необходимости перерисовки. Windows ставит это сообщение в очередь и через некоторое время оно приходит к вашей проге. В ответ на это в обработчике OnPaint вы должны проанализировав переменные, отрисовать картинку.
Я не рекомендую использовать SendMessage по той причине, что она дожидается результата сообщения, а если в программе используются критические секции, то нарваться на взаимоблокировку - раз плюнуть. При таком подходе "дёрганий" картинки практически нет и скорость заметно повышается. Замечу, что если в очереди будет два сообщения WM_PAINT (ваша процедура не успевает их обработать) - то Windows вправе удалить эти сообщения.

Оценка за ответ: 5.
Комментарий: Ответ хороший но сложный для понимания начинающего, коим я являюсь, програмиста. Зато теперь я знаю в каком направлении двигаться. Правда, текст кода процедуры не помешал бы.А вообще я ценю любую помощь.



Вопрос № 188

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

Где взять исходный код на Delphi или на Pascal для расчета NхN-размерных матриц методом Гаусcа?

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


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

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

Здравствуйте, Петров!
Наверное надо войти в Delphi и попытаться ручками написать реализацию решения. Голая математика почти как калькулятор. Ну ежели с Pascal так всё сложно то - поиск по Yandex. Google и т.д.

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

Здравствуйте, Петров!
Взято из справочника DelphiWorld.
www.delphiworld.narod.ru

Приложение:



Вопрос № 189

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

Доброго всем времени суток!
В Дельфи программирую недавно, поэтому часто возникают вопросы. Например, такой: как создать всплывпющую подсказку. На "канве" карта. Нужно при перемещении мыши вблизи точки расположения населенного пункта (из базы данных) всплывала подсказка с названием города.
Заранее благодарю за конкретную помощь.

Автор вопроса: Драганов Василий Михайлович (статус: Посетитель)
Дата и время отправки вопроса: 08.12.2006, 22:42
Получено ответов на вопрос: 3
Сообщений в форуме вопроса: 3
Страница данного вопроса >>


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

1. [Отвечает: Виталий Лещенко (статус: 3-ий класс), 08.12.2006, 23:31]:

Здравствуйте, Драганов!
Можно сделать так:
1. в базе хранишь координыта на карте + дополнительную информацию для показа.
2. в класс TImage грузишь нужную картинку.
3. замем делаешь обработчик события OnMouseMove
4. в нем делаешь выборку из базы по нужным координатам. (тебе будут переданы координыты мыши)
5. позиционируешь компонент TLabel, например, в нужное место... и все.
6. если при выборке не найдено ниодного населенного пункта, то просто скрываешь TLabel

Приложение:

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

2. [Отвечает: Бубырь Александр Николаевич (статус: 3-ий класс), 09.12.2006, 12:42]:

Делал когда-то подобную вещь на базе MapObject.
Только это делал не на OnMouseMove, а по таймеру.
Приведу кусок своего кода, думаю можно понять:
Если переделать определение координат с MapObject на свое, и свой массив точек с метками, остальное должно работать.
Успехов.

Приложение:

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

3. [Отвечает: Alex Van Glukhman (статус: 7-ой класс), 09.12.2006, 16:09]:

Здравствуйте, Драганов!

То что описал Виталий Лещенко достаточно приемлимый вариант, только в дополнение к написанномиу им
1. База данных хранит координаты границ населённого пункта к примеру определенного прямоугольником(Xmin, Ymin, Xmax, Ymax) иначе точку в один пиксель на экране ловить не очень удобно. Необходимо объявить переменную типа TRect для хранения координат объекта и str типа String для значения Caption TLabel
2. На OnMouseMove проверяется нахождение курсора в границах области объекта выбрав значения X и Y и проверив соответствие координат X, Y в пределах TRect.
X, Y не в TRect - запрос в БД на наличие объекта в БД если его нет то проверяем TLabel, если TLabel Visible=true, то Visible=false и Caption='' иначе ничего не делаем.
Если объект в баазе данных то если TLabel не видима то включаем её со значением из БД и присваиваем координаты объекта переменной TRect и значение заносим в str, если видима то если значение в БД <> str то изменяем Caption у TLabel в противном случае ничего не делаем.
Это необходимо для избежания мерцания TLabel и чрезмерных количеств выполнения запросов к БД. Вместо TLabel можно использовать Hnt: THintWindow

Подробно обращайся в ICQ 165711772

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



Вопрос № 190

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

Здравствуйте эксперты!
прошу прощения за ламерский вопрос, я учусь программировать на Delphi. Есть строка с путем к некоторому файлу, например: D:\catalog\file.exe, как мне отбросить имя файла и оставить только имя одного каталога, например получая эту строку через TOpenDialog.
Спасибо за ответ.

Автор вопроса: Alexey (статус: Посетитель)
Дата и время отправки вопроса: 09.12.2006, 02:15
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

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

Здравствуйте, Alexey!
Это можно сделать с помощью функций ExtractFilePath и ExtractFileDir. Их отличие состоит только в том, будет ли у выданного пути слеш "\" в конце... Первая выдаёт путь вместе с ним, вторая - без него. Использовать функции очень легко - в скобках нужно указать строку в явном виде, либо строковую переменную, а на выходе прочитать значение. См. пример в приложении. Удачи!

Приложение:

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

2. [Отвечает: Дима Гусаков (статус: 1-ый класс), 09.12.2006, 13:42]:

Здравствуйте, Alexey!
if OpenDialog1.Execute then
Label1.Caption := ExtractFilePath(OpenDialog1.FileName);

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




Статьи  >>

Защита формы паролем

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

Раз это вызывает такой интерес, сегодня мы попробуем разобраться с азами такой защиты. Давайте обсудим как мы это будем делать. Логично, что перед запуском формы, которую мы хотим защитить, надо запросить у пользователя пароль (можно конечно и комбинацию имя пользователя - пароль, но мы рассмотрим на примере только пароля) и сравнить введенное значение с каким-то зарезервированным в программе (оно может храниться как в явном виде так и в зашифрованном). Если значения совпадут, то мы откроем необходимую форму, иначе завершим все приложение.

Теперь непосредственно займемся разработкой формы запроса пароля. Хотя разрабатывать нам ничего и не надо: самый простой вариант такой формы Delphi поставляет. Вам надо выбрать пункт меню File -> New, в открывшемся диалоговом окне выберите закладку Dialogs, щелкните на значке Password Dialog и нажмите Ok. На экране появится готовая форма запроса пароля с именем PasswordDlg.

На этой форме будут две кнопки Ok и Cancel, текстовое поле ввода пароля с именем Password, метка Label1 с надписью Enter Password. Заменим свойство Caption метки Label1 на более приятное русскому глазу 'Введите пароль'. Также поменяем свойство Caption и для самой формы на 'Запрос пароля', например.

Обратите внимание на свойство PasswordChar поля ввода Edit равно * (звездочке) - это означает, что при вводе все символы будут заменены на звездочки.

Нам необходимо добиться, чтобы форма запроса пароля появлялась на экран раньше основной формы. Это делается так. В обработчике события OnShow главной формы нужно написать такой код:

PasswordDlg.ShowModal;

Этот код запустит нашу форму запроса пароля (PasswordDlg) перед основной. И сделает недоступной основную форму, до закрытия формы запроса пароля. Теперь запустите программу, компилятор спросит Вас хотите ли Вы добавить в Uses, модуль второй формы, конечно же надо ответить, что хотите!

Далее поступим следующим образом. Пароль будет хранится в виде константы в нашем приложении. При вводе правильного пароля будет открываться главная форма, а при вводе неправильного пароля, нажатии кнопки Cancel и других попытках закрыть форму запроса будем завершать наше приложение.

Для этого напишем обработчик для события OnCloseQuery для формы запроса. Здесь мы будем сравнивать содержимое строки ввода пароля с нашей константой, которую объявим в этом же обработчике. Таким образом получается такой код:

procedure TPasswordDlg.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
const pass=`велкам`; //наш праоль
begin
if Password.Text = pass then CanClose:=true
else Application.Terminate;
end;

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

if Password.Text = pass then CanClose:=true

надо заменить на:

if lowerCase(Password.Text) = lowerCase(pass) then CanClose:=true

Теперь попробуем защитить форму паролем, который будет храниться в зашифрованном виде. Зашифруем пароль самым простым способом - Xor. Для этого напишем свою функцию:

function TPasswordDlg.xortext(text:string):string;
var key, longkey : string;
i : integer;
toto: char;
begin
key:=`da`; //ключ
for i := 0 to (length(text) div length(key)) do
longkey := longkey + key;
for i := 1 to length(text) do begin
toto := chr((ord(text[i]) XOR ord(longkey[i])));
result := result + toto;
end;
end;

Через свое имя функция будет возвращать зашифрованную строку переданную в параметре Text. Не забудьте объявить эту функцию в разделе Public:

public
{ public declarations }
function xortext(text:string):string;

Теперь поменяем обработчик события OnCloseQuery, описанный в первом пример, на такой:

procedure TPasswordDlg.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var pass:string;
begin
pass:=xortext('велкам');

if xortext(Password.Text) = pass then CanClose:=true
else Application.Terminate;
end;

Как Вы видите поменялось совсем немного, теперь пароль в зашифрованном виде можно хранить например в каком-нибудь файле. Так что защищайте Ваши формы :-)

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


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

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

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

Название
Описание
Раздел
Объём
Ссылки
AL_BrushStyle Combo

Выпадающий список (ComboBox), в котором вместо текстовых строк можно выбрать стили заливки (Canvas.Brush.Style).

2 Кб
ATFileNotification

Компонент ATFileNotification позволяет следить за изменениями файлов/директорий. При обнаружении изменений автоматически срабатывает событие. Компонент поддерживает символы Unicode. Автор: Alexey Torgashin

316 Кб
XPMan

Компонент XPManifest служит для добавления в приложение поддержки стилей Windows XP. Аналогичный компонент есть в Delph 7 и всех последующих версиях, однако этот - независимый. Его можно установить на любую из версий Delphi.

5 Кб
ATStreamSearch

ATStreamSearch - это невизуальный компонент, реалзующий функцию поиска в тексте. Нужно указать путь к файлу (FileName) или поток (Stream) и затем просто вызывать методы FindFirst и FindNext, которые автоматически осуществляют поиск текста с указанными опциями. Размер файлов не ограничен.

Реализованы следующие опции поиска:
- поиск с учётом регистра или без него;
- поиск только целых слов;
- поиск в обратную сторону (назад).

Поддерживаются следующие текстовые кодировки:
- ANSI;
- OEM;
- Unicode (UCS-2) LE и BE.

Автор: Alexey Torgashin

453 Кб
ATImageBox

ATImageBox - компонент Delphi/C++Builder, показывающий изображение в прокручиваемой области. Компонент имеет такие полезные свойства как ImageFitToWindow, ImageCenter, ImageScale и т.д., поэтому с помощью него удобно отображать изображения. Изображение может быть перемещено мышью, а прокрутка области может делаться как с помощью клавиатуры, так и с помощью колёсиков мыши. Есть возможность отобразить с левом верхнем углу информационный текст. Автор: Alexey Torgashin

342 Кб
 
Всего новых файлов: 5  
1.12 Мб
 

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

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

Юмор

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

Доpогой IE, я ухожу от тебя навсегда

Доpогой Internet Explorer!
Все кончено. В последнее вpемя наши отношения никак не складывались, и вот pазвязка. Я ухожу от тебя к дpугому бpаузеpу.

Я знаю, что тепеpь не самое подходящее вpемя - ты заpазился очеpедным виpусом. Hадеюсь, что вскоpе тебе полегчает - искpенне надеюсь, повеpь. Hо ведь и мне надо жить дальше. За все то вpемя, что я тебя знаю, ты всегда, кажется, стpадал от виpусов или какого-нибудь шального чеpвя. Поpа уже тебе показаться доктоpу. Такие отношения между нами больше пpодолжаться не могут. Я знаю, ты скажешь, что испpавишься, что в следующий pаз получится лучше - ты говоpил так и в пpошлый pаз, и в позапpошлый. И каждый pаз я тебе веpил.

Hо больше не стану.

Ты обманщик! Пpавда в том, что тебе больше нечего сказать в свое опpавдание. Я знаю о твоих тайных сношениях с Windows. Ты клянешься, что вы больше не видитесь, но я этому не веpю. Говоpишь, что можешь обойтись и без Windows, а Windows, я слышал, может обойтись без тебя, но я знаю, что все это чистая ложь. А как насчет HTML e-mail в Outlook? Каждый pаз, когда в почтовый ящик падает новое письмо, ты бpосаешься помогать Windows пpочесть его. То же самое и с HTML в Word. И не заставляй меня содpогаться от воспоминаний о тех вечеpах, котоpые ты допоздна пpосиживал за эскизами в Windows Explorer. Ты думаешь только о Windows, а мне что же, пpикажешь закpывать на это глаза?

Ты мне больше не интеpесен. Потом, ты pазленился и, на мой взгляд, потеpял фоpму. Когда ты в последний pаз пpидумывал что-нибудь новенькое? Два года назад? Тpи? Пока ты почивал на своих лавpах, кpуглые сутки латая дыpы, из котоpых хлестало так, будто твой исходный код это дуpшлаг, интеpнет изменился. И очень сильно.

Hа пpошлое Рождество я подаpил тебе бесплатный RSS-pидеp Pluck, и он, казалось, пpишелся тебе по вкусу, вpемя от вpемени ты находил в нем что-нибудь для себя и был весел и полон достоинства. Я уж было подумал, что у нас снова может заладиться. Hо ведь на самом деле ты ничего не пpиобpел, это не было частью тебя. Когда мне захотелось пpосматpивать больше, чем по одной веб-стpанице за pаз, ты только pассмеялся, ответив, что это невозможно. А ведь я знал, что это непpавда. Opera, Netscape, а тепеpь и Firefox - все они на это способны. Ты пpосто не хочешь подумать о том, чтобы измениться.

А если и думаешь, то лишь потому, что так поступает кто-то дpугой. Понятно, кто: Windows. Hе отpицай этого. Ты не колебался, когда Windows XP SP2 показала тебе свой новёхонький свеpкающий pop-up blocker. Или подаpила новый защитный firewall. Я знаю, что Windows пообещала тебе еще ликвидиpовать пеpеполнения буфеpа, - но я повеpю в это только тогда, когда увижу собственными глазами. Так что же, что ты сделал для меня за последнее вpемя? Я не хочу пpодолжать апгpейдить свою опеpационную систему только pади того, чтобы удеpживать тебя pядом. Ты говоpишь, что я кого-то себе нашел.

Да, это так. Знаю, я уже пытался поpвать с тобой pаньше, но каждый pаз возвpащался. Это потому, что не было бpаузеpа, к котоpому можно было бы уйти. Мне нужен независимый бpаузеp, котоpый стоит на собственных ногах и не бегает за юбкой опеpационной системы. Мне нужен бpаузеp сильный и надежный, котоpый не падал бы пpи встpече с новейшим контентом. Я хочу пpозpачности. Хочу, чтобы код действительно что-то значил.

И все это я нашел. С Mozilla Firefox я чувствую себя в своей таpелке. Его код - это откpытый источник, чистый и новый, - а не пеpелицованный. И он ничего от меня не скpывает. По кpайней меpе, когда у Firefox что-то течет, это написано у него на тулбаpе. Он не пытается спpятать свои ошибки в надежде на то, что во втоpой втоpник месяца я получу заплатку и смогу заклеить пpоpеху, котоpая кpасуется вот уже полгода.

Firefox я могу пpивести к своим дpузьям Маку и Линуксу, и всем будет хоpошо. А ты с Маками больше даже не pазговаpиваешь, а когда появляется Линукс, ты каждый pаз ноpовишь выскользнуть из комнаты. Почему? Чего ты боишься? Hеужели ты, взpослый бpаузеp, испугался маленькой опеpационной системы? По-моему, это снобистское поведение пpямо указывает, что наши пути pазошлись. Так что: good-bye. Я знаю, тебе будет хоpошо без меня; так было всегда. Я увеpен, найдется кто-нибудь, кому ты покажешься умным и интеpесным. Hо только не мне.

:))

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

В избранное