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

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

  Все выпуски  

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


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

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

Delphi.int.ru

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

Delphi.int.ru Expert

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

Подведём результаты опроса, предложенного в прошлом выпуске. Проголосовавших как всегда немного, но даже этих мнений вполне достаточно.

Нужно ли публиковать статьи по обучению программированию для начинающих?

Да, в разделе "Статьи" - 3 голоса
Да, но сделать новый раздел - 9 голосов
Нет, это не нужно - 1 голос

Что ж, начиная с этого выпуска, у нас появляется новый раздел, в котором буду публиковаться статьи для последовательного обучения программированию на Delphi. После краткого обзора материалов в сети, мной было принято решение писать свои собственные статьи, а не перепечатывать чьи-либо. Как у меня это будет получаться - не знаю, но попробовать стоит. Оценивать Вам. Любая помощь приветствуется.

На сайте никаких существенных изменений, разве что исправлены некоторые ошибки и улучшена совместимость с разными браузерами.

Статистика экспертной системы Delphi.int.ru Expert на 23.01.2007, 12:00:

Зарегистрированных экспертов: 72 (+2), из них в активном режиме 55 (+2).
Участниками задано вопросов: 279 (+32).
Всего отправлено ответов: 497 (+50).

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

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

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

Количество читателей рассылки (23.01.2007, 12:00):
5397+821+237= 6455.

Связь по e-mail:

admin@delphi.int.ru

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

Введение в Delphi

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

Компьютеры ненадежны, но люди еще ненадежнее.

С какого языка начать?

Delphi, основой которого является язык Pascal, отлично подходит для того, чтобы начать учиться программировать. Сам Pascal постепенно уходит в прошлое и на него всё меньше обращают внимание. Это и понятно - на нём пишутся приложения для MS-DOS, а эту однозадачную операционную систему все пытаются забыть как страшный сон. Если быть более точным, то языком Delphi является Pascal не в том виде, в каком его используют для написания приложений MS-DOS, а в другой модификации - Object Pascal. В этом языке программирование как бы "привязывается" к определённым объектам - как визуальным, так и невизуальным, просто находящимся в памяти. Программирование простых приложений с интерфейсом командной строки (т.е. когда на экран последовательно выводятся строки текста и при этом пользователь вводит какие-либо данные) советуют также начинать с Pascal. Также многие начинают с QBasic, но этот язык один из самых "древних" и возможностей у него немного. Однако для понимания общих принципов программировани я он также подойдёт. Дело в том, что в этих языках нет каких-либо хитроумных конструкций и наборов знаков - написанный код легко читается и воспринимается. Этого нельзя сказать, например, о C++. Есть шутки на эту тему - "то, что ночью программист писал на C++, утром он прочитать не сможет". Конечно, это не так, но синтаксис языка C++ достаточно сложен. Мы начнём изучение Delphi практически с нуля. Pascal будет изучаться попутно.

Почему Delphi?

Delphi - это нечто иное, нежели Pascal, это совершенно другой качественный этап среды программирования. С помощью Delphi создаются приложения для операционной системы Windows, но помимо этого с помощью дополнительных средств можно написать, например, программы и для Linux. Среда Delphi легко расширяется установкой дополнительных модулей. Пользовательский интерфейс также хорошо настраиваемый - каждый организует рабочее пространство так, как ему будет удобно.

Краткие сведения о Delphi

Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Одной из причин называют переход Андерса Хейлсберга, одного из ведущих разработчиков Дельфи, из компании Borland Ltd. в Microsoft Corp.
Версия 1 была предназначена для разработки под 16-ти разрядную платформу Win16;
Версии со второй компилируют программы под 32-х разрядную платформу Win32;
Вместе с 6-й версией Delphi вышла совместимая с ним по языку и библиотекам среда Kylix, предназначенная для компиляции программ под операционную систему Linux;
Версия 8 способна генерировать байт-код исключительно для платформы .NET. Это первая среда, ориентированная на разработку мультиязычных приложений (лишь для платформы .NET);
Последующие версии (обозначаемые годами выхода, а не порядковыми номерами, как это было ранее) могут создавать как приложения Win32, так и байт-код для платформы .NET;

Delphi for .NET — среда разработки Delphi, а так же язык Delphi (Object Pascal), ориентированные на разработку приложений для .NET.

Что нам потребуется...

Подразумевается, что Вы знакомы с общими правилами работы в системе Windows и работали в каких-либо приложениях хотя бы примитивного уровня вроде Блокнот или Калькулятор. Из программного обеспечения нам потребуется сама среда Delphi. Процесс установки описан не будет, так как он довольно стандартный. На сайте дистрибутивов Delphi Вы не найдёте - любая из версий имеет объём не менее 200-300 Мб, а хранить такие файлы на сайте просто невыгодно. Кроме того, Delphi не является официально бесплатным продуктом. Поэтому, если у Вас ещё нет дистрибутива, постарайтесь его как можно быстрее найти. Можете купить в магазине, либо возьмите у кого-нибудь из знакомых.

Какую версию Delphi установить?

Это один из самых частозадаваемых вопросов. По большому счёту, все они очень похожи и в большинстве случаев программы будут одинаково работать независимо от версии Delphi, в которой они были созданы. Однако кое-какие советы я всё же дам. Не устанавливайте версии ниже Delphi 5 - они очень старые и имеют существенные расхождения с более новыми. Среда Delphi 5 содержит все основные возможности, но в ней нет некоторых удобных вещей, которые появились в следующих версиях. Наиболее оптимальный вариант - Delphi 6. Эта версия наиболее популярна среди "населения". Она является самой стабильной из всех и при этом содержит всё необходимое. Delphi 7 - мало чем отличается от Delphi 6, разве что большей совместимостью с Windows XP (имеется ввиду совместимость написанных приложений). Это НЕ означает, что программы, написанные в Delphi 6, будут некорректно работать в WinXP. Всё будет замечательно. Но Delphi 7 всё же менее стабильна, нежели Delphi 6. Дальнейшие версии - 8, 9 я вообще не рекомендую устанавливать. Это самые неудачные из всех. Были сделаны попытки интегрировать средства для написания приложений на технологии .NET, но в ответ сами среды получились довольно неудачными ("глючными"). Последние версии - Delphi 2005 Enterprise Edition и Borland Developer Studio 2006 (Delphi 2006 - часть этого большого пакета) достаточно громоздки и для новичков я бы НЕ рекомендовал использовать именно их. Повторюсь: лучшее решение - Delphi 6 или 7.

Заключение

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

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

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

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

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

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

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

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

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

Уважаемые эксперты!
Не могли бы вы сказать как привязать процедуру к созданному программно(в режиме RUNTIME) объекту?
Ниже представлен код программы.

Проблема:
У меня возникает ошибка при нажатии на изображении (уже когда программа запущена): Steam read error.

Приложение:

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


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

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

Здравствуйте, AlexKZ!
Все у Вас в порядке с процедурами. Это картинка такая. Читайте здесь:
http://www.delphikingdom.com/asp/listerrors.asp?ID=130

Оценка за ответ: 5.
Комментарий: Большое спасибо!

2. [Отвечает: Ершов Денис (статус: 4-ый класс), 25.10.2006, 21:47]:

Здравствуйте, AlexKZ!
Должно быть Delphi не поддеерживает ваш формат картинок. Считаю более надежным размещать картинки в ImageList. Набросал небольшой пример, все работало.

Приложение:



Вопрос № 142

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

Проблема в следующем.
Delphi 7, DBF таблицы.
Выполняется SQL-запрос. При подключении DBF c 1000 записей проблем нет, если же подключается 3млн. записей вылетает ошибка "Temporary table resource limit".
Какие настройки надо поменять, чтобы это обойти.

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


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

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

Здравствуйте, Адамов Сергей Владимирович!
Наверное Вы используете базы данных типа PARADOX/DBASE. Если так, то эти БД сначала кешируют всю БД, а затем делают выборку.
Надо переходить на серверную БД:
MSSQL,MYSQL,ORACLE,INTERBASE/FIREBIRD.
Успехов Вам.



Вопрос № 143

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

Добрый день уважаемые эксперты.
Подскажите как решить проблемму:
Windows Media Plaer ActiveX при воспроизведении музыки показывает на дисплее зрительные образы.
При воспроизведении некоторых файлов выскакивает ошибка проведения операции с плавающей точкой и зрительный образ подвисает, а воспроизведение продолжается... В чём тут проблемма и что нужно сделать, чтобы этого избежать?

Автор вопроса: Ильченко В. Г. (статус: Посетитель)
Дата и время отправки вопроса: 26.10.2006, 09:44
Получено ответов на вопрос: 0
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

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



Вопрос № 144

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

Есть начальная и конечная дата периода.
Как написать оператор цыкла так, чтобы он начинался с
начальной даты и перебырал каждый день до конечной даты? Тоисть, количество цыклов должно равняться количиству дней в указаном перыоде. При этом вкаждом цыкле нужно читать дату с которой он работает.

Автор вопроса: Игорь Середюк (статус: Посетитель)
Дата и время отправки вопроса: 26.10.2006, 13:34
Получено ответов на вопрос: 4
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


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

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

Здравствуйте, Игорь Середюк!
Дата предствляется типом DateTime, который есть не что иное как real, причем целая часть - дни, дробная - время. Таким образом взяв целую часть од начальной даты и от конечной Вы получите числа по которым можно организовать цикл, а внутри цикла преобразовав обратно получите дату каждого конкретного дня.

Приложение:

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

В модуле DateUtils.pas есть много интересных функций для работы с датами и временем. Для вычисления кол-ва дней между двумя датами (т.е. кол-во итераций цикла) используй функцию:

function DaysBetween(const ANow, AThen: TDateTime): Integer;

Для получения текущей даты юзай функцию Date().

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

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

Самое простое узнать номер юлианского дня для второй даты и вычесть из него номер юлианского дня для первой даты даты.
Юлианские дни - число дней с полудня 1 января 4713 до н. э. по юлианскому календарю
служат для расчета числа дней между двумя датами . Есть соответствующие формулы и таблицы, найти их можно в астрономическх календарях (см.приложение).Вычисляет верно, но без учета времени суток.
Удачи Вам.

Приложение:

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

4. [Отвечает: sattar (статус: 2-ой класс), 27.10.2006, 21:54]:

var
Month1,Month2,Year1,Year2,Day1,Day2:Integer;
Month,Day,Year:Integer;

Function CaseMonth(Month:integer):integer;
begin
case Month of
1,3,5,7,8,10,12:Result:=31;
4,6,9,11:Result:=30;
2: Result:=28;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Day1:=StrToInt(Copy(DateToStr(DateTimePicker1.Date),1,2));
Month1:=StrToInt(Copy(DateToStr(DateTimePicker1.Date),4,2));
Month2:=12;
Year1:=StrToInt(Copy(DateToStr(DateTimePicker1.Date),7,4));
Year2:=StrToInt(Copy(DateToStr(DateTimePicker2.Date),7,4));
For Year:=Year1 to Year2 do begin
if Year=Year2 then Month2:=StrToInt(Copy(DateToStr(DateTimePicker2.Date),4,2));
For Month:= Month1 to Month2 do
begin
if Month=12 then day2:=31 else
begin
Day2:=CaseMonth(Month);
if Month=Month2 then Day2:=StrToInt(Copy(DateToStr(DateTimePicker2.Date),1,2));
end;
For Day:=Day1 to Day2 do
Memo1.Lines.Add(IntToStr(Day)+' '+IntToStr(Month)+' '+IntToStr(Year));
Day1:=1;
end;
Month1:=1;
end;
end;



Вопрос № 145

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

Здравствуйте уважаемые эксперты!
Как, не используя сторонних компонентов, нормально вывести отформатированный текст (довольно-таки большой) из, например, RichEdit на PaintBox, при помощи Timer (эффект титров, после конца текста, чтобы он вновь начинался заново)? Желательно привести рабочий пример или статью. Заранее спасибо...

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


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

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



Вопрос № 146

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

Уважаемые!
Подскажите, как можно скопировать строки целиком из одного StringGrid-a в другой.
Например я в цикле делаю копирование нужных мне строк, всё копируется, но при дестрое формы я получаю Access Violation. Оба грида - TAdvStringGrid (TMS Software), содержат в ячейках объекты (графику, всплывающие подсказки, цветовое оформление). Понятно, что присваивание происходит только указателей на объекты и Грид при вызове деструктора вызывает Free для своих объектов. А так как у меня после вызова Assign два грида ссылаются на один и тот же объект, убить его попытаются они оба, и второй грид за такую пошлость получит AV. Может кто подскажет, как решить проблему? ИС примерчиком, если можно...

Приложение:

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


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

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

Здравствуйте, Discorezzz!
Перед вызовом метода Free необходимо ссылкам
на все oбъекты в одном из гридов присвоть nil.

Приложение:

Оценка за ответ: 5.
Комментарий: Спасибо за помощь! Попробую так. Правда я сделал по другому - текст через Assign, а объекты (благо их немного) через промежуточную переменную. Достаточно быстро получается - 46000 позиций одного грида секунды за 2 перелетают в другой.



Вопрос № 147

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

Доброе время суток, программисты. Как распечатать содержимое Memo USB принтером.

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


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

1. [Отвечает: Dron (статус: 10-ый класс), 30.10.2006, 06:49]:

Здравствуйте, Stalker!
Самый стандартный метод: Memo1.Print('Title');
Вместо Title обычно указывают название открытого файла...
Удачи!

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

Что-то вроде такого можно (пишу по памяти):
Var p:TextFile;
f:Integer;
Begin
AssignPrn(p);
Printer.Canvas.Font.Size:=10;
Printer.Canvas.Font.Name:='Arial';
Rewrite(p);
for f:=0 to Memo1.Lines.Count-1 do
writeln(p,Memo1.Lines[f]);
CloseFile(p);
End;

Таким образом можно печатать на любом принтере.
(По ошибке сначала послал через форум).



Вопрос № 148

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

Как в Memo, если пишешь в lines[0], нажимаешь ентер, происходило какое-то событие и мигающий курсор становился в то место, где находился до нажатия ентер. Заранее благодарен.

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


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

1. [Отвечает: Dron (статус: 10-ый класс), 30.10.2006, 06:48]:

Здравствуйте, Stalker!
Вообще, обрабатывать OnKeyDown и проверять Key на VK_RETURN. Но если нужно позаботиться о том, чтобы переносов строки не было в Memo, можно просто установить WantReturns = False и тогда весь текст будет идти одной строкой.
Удачи!

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

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

Дополню предыдущий ответ:
Если нужно запретить нажатие Enter,
то в событии OnKeyDown достаточно добавить
следующий код:
if Key=VK_RETURN then Abort;

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

Здравствуйте, Stalker!
Попробуте так: см. прилжение.
Только как все таки переходить на новую строку?
Удачи Вам.

Приложение:



Вопрос № 149

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

Приветствую!
Столкнулся с таким вопросом:
Нужно каким-то образом получить доступ к свойствам компонента в Run-timе. Во время разработки имя этого компонента не известно (оно генерируется итерацией).
Конкретнее: надо переместить TImage в определённую точку (TImage'ей на форме много и у всех имена "card1", "card2", "card3"...)

Пробывал через FindComponent, но он возвращает TComponent, и у меня не получаеться его переместить.

Что делать?

Автор вопроса: Евгений Козаченко (статус: 2-ой класс)
Дата и время отправки вопроса: 30.10.2006, 19:19
Получено ответов на вопрос: 4
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

1. [Отвечает: Dron (статус: 10-ый класс), 30.10.2006, 20:04]:

Здравствуйте, Евгений Козаченко!
Всё верно - через FindComponent(). Он возвращает TComponent, а его нужно использовать как нужный компонент. Вот пример:
TImage(FindComponent('card1')).Left:=300;
Таким образом, этот самый TComponent можно преобразовать к любому нужному объекту (TButton, TEdit и т.д.) Главное - быть уверенным, что найденный компонент является тем же классом, в который будет преобразован.
Удачи!

Оценка за ответ: 5.
Комментарий: Спасибо.

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

Здравствуйте, Евгений Козаченко!
Эксперт Dron ответил правильно, но предлагаю Вам использовать лучший вариант преобразовния типа:
операции is и as.

(FindComponent('card1') as TImage).Left:=300;
или
with FindComponent('card1') as TImage do
begin
Left:=300;
Right:=150;
......
......
end;
Если надо проверить является ли компонент
Timage -

if Form1.Components[5] is TImage
then //является
else //не является;
Удачи Вам!

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

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

Здравствуйте, Евгений Козаченко!
Предыдущие ответы, конечно, верны и Вы можете ими воспользоваться, но мне кажется лучше создать массив указателей на создаваемые компоненты и обращаться к ним напрямую. Это будет и быстрее, и "правельнее" во всех отношениях См. Код.

Приложение:

Оценка за ответ: 3.
Комментарий: Спасибо. Но первый вариант меня вполне устроил. Ваш вариант, по моему "трудоёмкее", хотя и более правильный.

4. [Отвечает: Alex Van Glukhman (статус: 5-ый класс), 02.11.2006, 14:05]:

Здравствуйте, Евгений Козаченко!

Я полагаю что в данном случае присутствует ошибка динамического создания объекта, т.е. создаётся экземпляр класа TImage c полным набором свойств и методов, но некоторым ключевы&# 1084; свойствам не присвоено начальное значение в данном случае свойство Name в RunTime. Вот пример с другим объектом который я написал для следующего вопроса,
но аналогия та же.

Приложение:

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



Вопрос № 150

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

Доброе время, господа Прораммситы. Как программно создать кнопку в том месте, где находится курсор мышки

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


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

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

Здравствуйте, Stalker!
См. пример в приложении. С координатами можно проводить различные комбинации. Для проверки работы кнопку нужно либо нажать программно (например, по таймеру), либо с помощью клавиатуры.
Удачи!

Приложение:

2. [Отвечает: Новаковский Юрий Аврамович (статус: 3-ий класс), 02.11.2006, 10:04]:

Здравствуйте, Stalker!
Попробуйте так см. пример в приложении.
Если Вам надо чтоб кнопка появлялась на панели,
то соответственно
procedure TForm1.Panel1MouseDown(...
btn := TButton.Create(Panel1);
btn.Parent:=Panel1;
Удачи Вам!

Приложение:

3. [Отвечает: Alex Van Glukhman (статус: 5-ый класс), 02.11.2006, 13:22]:

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

1.Прежде всего в uses подключаем модуль StdCtrls, содержащий описание класса TButton.
2.В разделе объявления переменных модуля формы (interface) объявляем переменную btn: TButton.
3.На Event OnMouseDown пишем код создания кнопки.
В нашем случае необходимо проверить наличие экземпляра кнопки. Если она имеется, то освобождаем её методом Free. Далее создаём её, назначаем родителя и в качестве свойств Left и Top н& #1072;значаем координаты х и у являющимися входными параметрами процедуры FormMouseDown.
(Если кнопок должно быть много, то объяви динамический массив TMsv: array of TButton и названия для переменных TButton вытаскивай из него и не забывай о начальной иниализации массива и его конечно м освобождении освобождении).
Вот исходный код:

unit MnFrm

interface

uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
private

public

end;

var
Form1: TForm1;
btn: TButton;

implementation
{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
//Если есть экземпляр кнопки то уничтожили
if Assigned(btn) then btn.Free;
//Создаём
btn:=TButton.Create(self);
//Родитель форма
btn.Parent:=Form1;
//Координаты кнопки - координаты клика mouse
btn.Left:=X;
btn.Top:=Y;
//Ну и назначаем Caption, т.к. кнопка наследует
//все свойства методы и события класса TButton
btn.Caption:='Кнопка';
end;

Удачи!!!

4. [Отвечает: sattar (статус: 2-ой класс), 07.11.2006, 19:22]:

uses StdCtrls;
var
x2,y2:integer;
a:array[1..10] of TButton;
i:integer=1;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
x2:=x;
y2:=y;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
A:=TButton.Create(self);
a.Left:=x2;
a.Top:=y2;
a.Width:=75;
a.Height:=25;
a.Parent:=Form1;
a.Caption:='Кнопка'+inttostr(i);
inc(i);
end;




Статьи  >>

Липкие окошки

В статье рассматривается приём создания обработчиков сообщений, которые позволяют форме при перетаскивании "прилипать" к краям экранной области.

Конечно же в WinAPI такой возможности не предусмотрено, поэтому мы воспользуемся сообщениями Windows. Как нам известно, Delphi обрабатывает сообщения через события, генерируя их в тот момент, когда Windows посылает сообщение приложению. Однако некоторые сообщения не доходят до нас. Например, при изменении размеров формы генерируется событие OnResize, соответствующее сообщению WM_SIZE, но при перетаскивании формы никакой реакции не происходит. Конечно же форма может получить это сообщение, но изначально никаких действий для данного сообщения не предусмотрено.

Итак, при перемещении окну посылается сообщение WM_MOVING. Обрабатывая данное сообщение, приложение может отслеживать размер и расположение перетаскиваемого квадрата и при необходимости изменять их.

Также существует сообщение WM_WINDOWPOSCHANGING, которое посылается окну в случае, если его размер, расположение или место в Z-порядке собираются измениться, как результат вызова функции SetWindowPos либо другой функции управления окном.

Чаще всего с сообщением передаются дополнительные параметры, которые сообщают нам необходимую информацию. Например, сообщение WM_MOVE, указывающее на то, что форма изменила своё местоположение, также передаёт в параметре LPARAM новые координаты X и Y.

Сообщение WM_WINDOWPOSCHANGING передаёт нам только один параметр - указатель на структуру WindowPos, которая содержит информацию о новом размере и местоположении окна. Вот как выглядит структура WindowPos:

TWindowPos = packed record
  hwnd: HWND; {Identifies the window.}
  hwndInsertAfter: HWND; {Window above this one}
  x: Integer; {Left edge of the window}
  y: Integer; {Right edge of the window}
  cx: Integer; {Window width}
  cy: Integer; {Window height}
  flags: UINT; {Window-positioning options.}
end;

Наша задача проста: нам необходимj, чтобы форма прилипла к краю экрана, если она находится на определённом расстоянии от него (допустим, 20 пикселей).

Пример

К новой форме добавьте Label, один Edit и четыре Checkbox. Измените имя Edit на edStickAt. Измените имена чекбоксов на chkLeft, chkTop, и т.д. Для установки количества пикселей используем edStickAt, который будет использоваться для определения необходимого расстояния до края экрана, достаточного для приклеивания формы.

Нас интересует только одно сообщение - WM_WINDOWPOSCHANGING. Обработчик для данного сообщения будет объявлен в секции private. Ниже приведён полный код этого процедуры "прилипания" вместе с комментариями. Обратите внимание, что Вы можете предотвратить "прилипание" формы к определённому краю путём снятия нужной галочки.

Для получения рабочей области декстопа (минус панель задач, панель Microsoft и т.д.), используем SystemParametersInfo, первый параметр которой SPI_GETWORKAREA.

...

  private
   procedure WMWINDOWPOSCHANGING
            (var Msg: TWMWINDOWPOSCHANGING);
             message WM_WINDOWPOSCHANGING;

...

procedure TfrMain.WMWINDOWPOSCHANGING
          (var Msg: TWMWINDOWPOSCHANGING);
const
  Docked: Boolean = FALSE;
var
  rWorkArea: TRect;
  StickAt : Word;
begin
  StickAt := StrToInt(edStickAt.Text);
  
  SystemParametersInfo
     (SPI_GETWORKAREA, 0, @rWorkArea, 0);

  with Msg.WindowPos^ do begin
    if chkLeft.Checked then
     if x <= rWorkArea.Left + StickAt then begin
      x := rWorkArea.Left;
      Docked := TRUE;
     end;

    if chkRight.Checked then
     if x + cx >= rWorkArea.Right - StickAt then begin
      x := rWorkArea.Right - cx;
      Docked := TRUE;
     end;

    if chkTop.Checked then
     if y <= rWorkArea.Top + StickAt then begin
      y := rWorkArea.Top;
      Docked := TRUE;
     end;

    if chkBottom.Checked then
     if y + cy >= rWorkArea.Bottom - StickAt then begin
      y := rWorkArea.Bottom - cy;
      Docked := TRUE;
     end;

    if docked then begin
      with rWorkArea do begin
      // не должна вылезать за пределы экрана
      if x < Left then x := Left;
      if x + cx > Right then x := Right - cx;
      if y < Top then y := Top;
      if y + cy > Bottom then y := Bottom - cy;
      end; {ширина rWorkArea}
    end; {}
  end; {с Msg.WindowPos^}

  inherited;
end;
end.

Теперь достаточно запустить проект и перетащить форму к любому краю экрана. Вот собственно и всё.

А вот другой более короткий (и может быть, даже лучший) способ:

procedure TCustomGlueForm.WMWindowPosChanging1(var Msg: TWMWindowPosChanging);
var
WorkArea: TRect;  
StickAt : Word;  
begin
StickAt := 10;  
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);  
with WorkArea, Msg.WindowPos^ do    
begin
// Сдвигаем границы для сравнения с левой и верхней сторонами  
Right:=Right-cx;  
Bottom:=Bottom-cy;  
if abs(Left - x) <= StickAt then x := Left;  
if abs(Right - x) <= StickAt then x := Right;  
if abs(Top - y) <= StickAt then y := Top;  
if abs(Bottom - y) <= StickAt then y := Bottom;  
end;  
inherited;  
end;

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


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

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

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

Последние поступления
Название
Описание
Раздел
Объём
Ссылки
Borland Developer Studio 2006
Общий вид интерфейса Borland Developer Studio 2006.
101 Кб
Microsoft Visual Studio
Общий вид интерфейса Microsoft Visual Studio.
201 Кб
Учебник для продвинутых по Delphi 7

- Объектная концепция Delphi 7;
- Интерфейс и логика приложения;
- Приложения баз данных;
- Технологии доступа к данным;
- Распределенные приложения баз данных;
- Генератор отчетов Rave Reports 5.0;
- Технологии программирования.

1.47 Мб
Графика DirectX для Delphi

Главной темой книги является компьютерная графика, а именно - использование в Delphi модулей DirectX, связанных с двумерной и трехмерной графикой.

2.97 Мб
Учебник по COM и ActiveX

Книга предназначена для разработчиков, которые занимаются созданием серьезных коммерческих продуктов, для разработчиков компонентов, а также может быть полезна следующим группам читателей:
- разработчикам, использующим и создающим элементы автоматизации и другие СОМ-объекты;
- студентам вузов, которые изучают Delphi; программистам среднего уровня, желающим повысить свою квалификацию.

1.18 Мб
Mastering Delphi 6 (Sybex by Marco Cantu)

Отличная книга по программированию в Delphi. Единственное неудобство - она написана на английском языке. Но для большинства программистов это не проблема.

9.72 Мб
Всего новых файлов: 6  
15.6 Мб
 

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

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

Ссылки  >>

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

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

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

Юмор

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

Если на клавиатуре
Западает пара клавиш,
Это значит - вы ударник
И вообще герой труда.
Незаметно поменяйтесь
Ей с бездельником соседом:
У таких клавиатуры
Не стареют никогда!

Если ваше руководство
Вам прозрачно намекает,
Что заказчик будет завтра,
А заказ пока стоит -
Оставайтесь на работе
И всю ночь играйте в "диггер",
И, взглянув на вас, заказчик
Крайний срок перенесет.

Если ваш любимый чайник
В тройнике лишен розетки,
То за это преступленье
Надо строго наказать,
И недрогнувшей рукою
Вынуть из розетки сервер,
Чтобы все вокруг узнали,
Что пришла пора пить чай.

Если вдруг твоя машина
Не работает как надо,
Ты по материнской плате
Сильно стукни кулаком.
Не поможет - бей кувалдой,
Дай ногой по монитору...
Объяснишь потом начальству:
"Она первой начала!"

Если вдруг на твой винчестер
Просочился злобный вирус,
Не лечи его Лозинским;
Вирус тоже хочет жить!
Зараженные программы
Раскидай по BBS'ам,
И тебя твои коллеги
Будут часто вспоминать.

Если вашим сослуживцам
Дали премию большую,
А про вас совсем забыли
И не дали никакой,
Вместо краски влейте в принтер
Земляничное варенье,
И про вас в учрежденьи
Не забудут никогда!

:))

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

В избранное