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

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

  Все выпуски  

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


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

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

Delphi.int.ru

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

IRC-канал сайта:

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

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

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

Несколько слов об изменениях... В очередной урок обучения, который опубликован в данном выпуске, добавлен маленький тест для проверки знаний. Надеюсь, что такие тесты пойдут на пользу. Для того, чтобы тест работал, письмо рассылки должно быть открыто в браузере, а не в почтовой программе. Кроме того, в браузере должен быть включен JavaScript (как правило, он включен). Очень хотелось бы узнать Ваше мнение по поводу таких интерактивных задач - нужны ли они? Проведём стандартный опрос с помощью e-mail (просто щёлкните по ссылке и отправьте письмо):

Нужны ли интерактивные задачи в уроках?

Нужны  |  Не нужны

Комментарии и пожелания всячески приветствуются. А может быть у Вас есть идеи по другой организации таких заданий? Например, чтобы они работали не в браузере, а ещё как-то? Все пожелания будут рассмотрены.

Кстати, 5 мая число зарегистрированных на сайте участников перешагнуло рубеж в 1000 человек! Небольшой, скажем так, праздник :-)

Если Вы ещё не являетесь зарегистрированным пользователем www.delphi.int.ru, зарегистрируйтесь прямо сейчас! Регистрация »

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

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

Зарегистрированных экспертов: 85 (+1), из них в активном режиме 56 (-1).
Участниками задано вопросов: 568 (+31).
Всего отправлено ответов: 954 (+47).
Всего сообщений на форумах вопросов: 806 (+43).
Максимальное число разосланных в день писем: 608 (24.04.2007, +0).

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

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

Delphi.int.ru Expert - решите свою проблему, а также помогайте другим, став экспертом!

Количество читателей рассылки (12.05.2007, 11:00):
5465+1164+346= 6975 (+53).

Связь по e-mail:

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

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

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

5. Управление проектом
6. Обзор свойств формы
7. Обзор палитры компонент: Standard, Additional

Pascal - первое знакомство

Автор:
Ерёмин Андрей
Обучение - это напоминание другим, что они знают всё так же хорошо, как и Вы.
Номер урока:
8
 

Итак, достаточно кратко мы познакомились со способами создания интерфейсов программ. Теперь пришло время начать изучать сам язык программирования - Pascal. В Delphi используется его более усовершенствованная и нацеленная на объектно-ориентированное программирование версия - Object Pascal.

Язык программирования — формальная знаковая система, предназначенная для описания алгоритмов в форме, которая удобна для исполнителя (например компьютера).

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

Ближе к делу...

В Pascal любая программа пишется по определённой заготовке. Вот она:

  program название_программы;

  {раздел описаний}

begin

  {раздел реализации}

end.

В проекте Delphi этой заготовке соответствует файл проекта - *.dpr (открывается с помощью меню Project » View Source). Если после создания нового проекта сразу открыть этот файл, то всё основное там уже будет написано - писать это собственноручно не требуется. К примеру, в "обычном" Pascal такой заготовки нет и всё пишется "с нуля".

Заготовка кода проекта (*.dpr)
Заготовка кода проекта (*.dpr)

Идентификаторы

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

Фактически, идентификатор - это уникальное имя. Нужно чётко усвоить правила создания имён идентификаторов. Они довольно просты. При их несоблюдении, т.е. ошибочном вводе имени, программа просто не скомпилируется.

1. Имя идентификатора может состоять из латинских букв, причём как верхнего, так и нижнего регистра (A, B, ..., Z; a, b, ..., z), цифр (0, 1, ..., 9) и знака подчёркивания ( _ ). Никакие другие символы не могут быть использованы.

2. Первый символ в имени не должен быть цифрой, т.е. он может быть латинской буквой или знаком подчёркивания. Все последующие символы могут быть теми, которые указаны в п.1.

3. Максимальная длина имени - 255 символов. Следует отметить, что это ограничение формально. Вы можете задать имя и из большего числа символов, но компилятор воспримет только первые 255.

4. Язык Pascal нечувствителен к регистру символов (имеется ввиду вообще весь язык) и регистру имён идентификаторов в частности. Т.е. и ABC и abc и даже aBc - это абсолютно одно и то же. Многие языки чувствительны к регистру. Хорошо это или плохо - утверждать не стоит. Однако большинство мнений сходятся на том, что нечувствительность лучше. По крайней мере, это не порождает большого числа ошибок при написании имён разным регистром.

Тест по теме
Давайте проверим, насколько Вы усвоили правила присвоения имён идентификаторам... Для прохождения этого теста в Вашем браузере должен быть включен JavaScript. В почтовых программах тест работать не будет - нужно открыть его в браузере.
Укажите, какие имена являются верными идентификаторами, а какие - нет.
верно неверно _HeLLo
верно неверно 2to3
верно неверно super-star
верно неверно _my_best_book_2
верно неверно 123and456_
верно неверно _1_2_3_4_5_
верно неверно AaAaA_____BbBbB_____55555
верно неверно day of week

Переменные и типы данных - первое знакомство

Абстракция переменной - коробочка

Понятие переменной в языке программирования похоже на понятие переменной в математике. Переменная задана каким-либо именем и хранит некоторое значение. Переменная (variable) - именованная ячейка памяти, имя которой можно использовать для осуществления доступа к данным, находящимся по данному адресу.
Переменная определяется:
а) именем;
б) типом данных;
в) значением.
Мы подошли к одному из практических применений идентификаторов. Каждая переменная имеет свой идентификатор, т.е. имеет своё уникальное имя. Двух переменных с одним именем быть не может (в общем случае, с частными случаями мы столкнёмся в дальнейшем). Тип данных - это диапазон (набор) всех значений, которые может принимать данная переменная. Pascal - язык со строгой типизацией данных. Это означает, что мы не сможем использовать переменную, не указав тип данных для неё. Ну и наконец, значение - это непосредственно то, что хранится в конкретный момент времени в переменной. Это может быть число, символ, текст и т.д.
Визуально переменную можно представить как некую коробочку, в которую можно что-то положить. Например, у нас есть коробочка для разноцветных шаров, на которой написано "Шар №1". В этом случае "Шар №1" - это имя нашей переменной (на других коробочках написано что-то другое) и по этому имени мы можем найти именно эту коробочку среди остальных. Значением в данном случае выступает шар (точнее - его цвет), который мы положили в эту коробочку (например, красный, зелёный, синий). Ну а тип данных - цвет шара, т.е. мы не знаем, какой именно шар окажется в коробочке, но тем не менее знаем, что он будет какого-то цвета.

Константы

Ускорение свободного падения, радиус Земли, длина экватора - примеры констант
Понятие константы используется в математике, физике и других науках. Оно означает, что данная величина не изменяется с течением времени. Абсолютно такое же значение константы и в программировании. Константа (constant) - это переменная, значение которой не меняется во время выполнения программы. Следует отметить, что значение константы должно быть известно ещё до запуска программы, т.е. до этапа компиляции. Пример константы: g ≈ 9.8 (ускорение свободного падения тел на Земле). В Delphi "прописаны" также общеизвестные константы, самым ярким примером которых является число "пи", имя этой константы - PI. Таким образом, эту константу можно свободно использовать в своей программе, не задавая предварительно её значение. Ещё одно из достоинств - константа "пи" занесена с достаточно большой точностью, в то время как для "ручного" объявления придётся где-то "подсмотреть" ци фры после запятой (в расчётах малых значений применение пи = 3.14 может давать некоторые погрешности результата).

Примечание: Помимо имён переменных, идентификаторы встречаются практически повсюду. Имена всех компонент (свойство Name); названия модулей (а соответственно и имена файлов, составляющих проект); название приложения, указываемое после ключевого слова program в файле проекта - всё это тоже идентификаторы, а соответственно, их имена также должны подчиняться правилам, описанным выше.

Зарезервированные слова

Зарезервированные слова - слова языка, которые играют служебную роль. Использовать часть из этих слов в качестве имён, т.е. идентификаторов, запрещено. В редакторе кода эти слова отображаются цветом, отличным от цвета основного кода. Вот перечень все зарезервированных слов Object Pascal:

  and   export   label   resourcestring
  array   exports   library   set
  as   file   mod   shl
  asm   finalization   nil   shr
  begin   finally   not   string
  case   for   object   then
  class   function   of   threadvar
  const   goto   or   to
  constuctor   if   out   try
  destructor   implementation   packed   type
  dispinterface   in   procedure   unit
  div   inherited   program   until
  do   initialization   property   uses
  downto   inline   raise   var
  else   interface   record   while
  end   is   repeat   with
              xor

Заключение

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

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

 

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

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

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

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

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

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

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

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

При попытке выполнить запрос на выборку (селект) получаю "Invalid request BLR at offset 43 function EXT_GENID is not defined module name or entrypoint coud not be found". Из IBExpert тоже самое. На других компах всё ОК. Файербёрд 1.0.3 Может, какую службу надо включить? Непонятно.

Автор вопроса: Ласковый 3лоумышленник (статус: 3-ий класс)
Дата и время отправки вопроса: 22.12.2006, 21:35
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 2
Страница данного вопроса >>


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

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

Здравствуйте, 3лоумышленник!
В сервисах должны быть запущены службы Server, Guardian, Replication Server

Удачи!

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



Вопрос № 212

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

Уважаемые эксперты. Срочно нужна помощь в написании программы посредством Delphi 6-7.
Программа скорее простая, чем сложная. Разумное вознаграждение гарантируется.
Все вопросы и подробности письмом на мой e-mail voinvvs@mail.ru
Спасибо всем кто откликнется!

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


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

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



Вопрос № 213

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

Уважаемые эксперты. Требуется написать программу.Краткие требования к программе в приложении.Просьба к желающим оказать содействие откликнуться.
мой e-mail - voinvvs@mail.ru
Конкретнее по запросам. Заранее признателен.

Приложение:

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


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

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

Здравствуйте, Петров Василий Владимирович!

Ну вопросов по написанию данной программы нет. Только зачем использовать Exel возможности через Delphi , если у Borland вполне хватает своих собственных более гибких.

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



Вопрос № 214

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

как вставить Bitmap в Richedit не используя OLE.

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


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

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

Здравствуйте, андреевский а. а.!

Ну вставить рисунок в TRichEdit труда не составляет. Делается это просто через компонент TImage где просто пишем строку Image1.Parent:=RichEdit1 и устанавливаем Top и Left для него. Только здесь нужно учитывать перерисовки картинки при скролах, изменениях и т.д.
Удачи.



Вопрос № 215

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

Задача: Есть 2 Tlistview. Нужно из 1-го listview "скопировать" только выделенные items во второй.

В приложении к вопросу представлен примерный код. Если это написать без 5-ой строки (то что я написал как комментарий) то будут отображаться только рисунки а названий под ними не будет.

Приложение:

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


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

1. [Отвечает: Евгений Козаченко (статус: 2-ой класс), 24.12.2006, 14:41]:

Вот. Всё должно работать:

var
k:TListItem;
i:integer;
begin
for i:=0 to listview1.Items.Count-1 do
if listview1.Items.Item[I].Selected then
begin
k:=listview2.Items.Add;
k.Caption:=listview1.Items.Item[I].Caption;
k.ImageIndex:=listview1.Items.Item[I].ImageIndex;
end;
end;



Вопрос № 216

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

Здравствуйте, уважаемые эксперты.
Вопрос: Как написать инсталятор для пакетов Делфи? Т. е. я написал пакет(ы)(package), у меня естественно есть исходный код и я хочу написать программу, которая бы устанавливала пакет в Делфи(действовала аналогично кнопки Install при открытом проекте пакета).
Заранее спасибо за ответ!!!

Автор вопроса: Шинкаренко Константин (статус: Посетитель)
Дата и время отправки вопроса: 24.12.2006, 16:33
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 2
Страница данного вопроса >>


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

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

Здравствуйте, Шинкаренко Константин!
Используй Borland Install Shield Wizard

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

2. [Отвечает: Виталий Лещенко (статус: 3-ий класс), 24.12.2006, 18:56]:

Здравствуйте, Шинкаренко Константин!

1. Первое что следует учесть, это то, что пакеты для версии N нельзя установить в версии <>N
2. Как должен устанавливаться пакет? Для всех пользователей или для одного?
3. В сообветствии с пред.пунктом в ветке реестра Delphi (или в HKEY_LOCAL_MACHINE, или в HKEY_CURRENT_USER) в "Known Packages" лежит список пакетов для закрузки... посмотри что там хранится, по аналогии впиши свой пакет.

Приложение:

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



Вопрос № 217

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

Подскажите пожалуйста как програмно менять Options в BDGrid?

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


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

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

Здравствуйте, Илья Бондарь!

TDBGrid.Options - набор предопределённых значений c преффиксом dg.
Например:
DBGrid1.Options:=[]; все значения для Options имеют значение false;
DBGrid1.Options:=[dgEditing, dgTitles]; устанавливает в true возможность редактирования и видимость заголовков колонок.
Всё остальное по аналогии.
Удачи!

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



Вопрос № 218

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

Добрый день! Я программирую на Дельфи базы данных. Использую файрбёрд 1.5 и доступ через BDE. Понимаю что эта технология устарела, но вот никак не могу решить на что перейти. Подскажите.

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


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

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

Здравствуйте, Мельников Георгий!
Переходите на firebird 2 (огромнейшее количество усовершенствований + старые базы будут рботать) и доступайтесь к нему через компоненты InterBase: IBDtataBase, IBTable, IBSQL и т.д (BDE тоже неплохо, но IBBackupService и IBRestoreService - две очень веские причины все-таки использовать IB***)

2. [Отвечает: Ласковый 3лоумышленник (статус: 3-ий класс), 25.12.2006, 10:41]:

Здравствуйте, Мельников Георгий!
В дополнение предыдущего ответа. Следует учитывать, что кроме IBX существуют другие наборы специализированных компонентов, предназначенных для взаимодействия с IB/Firebird. Хорошим примером альтернативы IBX является набор компонентов InterBase Objects (www.ibobjects.com).
И уж что вам точно понадобится, так это программа администрирования IBExpert - лучшая для IB/FireBird/Yaffil. Это отечественныя разработка, для русских бесплатная.
Удачи!

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

Здравствуйте, Мельников Георгий!

Interbase и Firebird являются родными БД по отношению к Delphi. Я не рекомендовал бы переходить на другие БД. Великолепно отлаженный язык SQL, хранимые процедуры, простота и главное надёжность и за ;щищённость БД по открытым портам и наконец самый главный плюс - быстрота.
Что ещё надо для написания клиент-серверных приложений. Всё таки рекомендую - Interbase
В плане технологии - конечно BDE это уже старо, ADO или dbGo по мнению Borland и MS содержит некоторые ошибки в драйверах и компонентах. Для Interbase и Firebird существует своя родная поддержка в Delphi - компонентm 9; IB которые непосредственно связаны со службой IBServer, IBQuardian. Наиболее простое и надёжное решение с минимумом затрат по настройке. И ещё есть dbExpress - тоже вариант наиболее быстрый из всех, н ;о используется он преимущественно для наборов нередактируемых данных. Поэтому выбор за Вами.
За себя скажу только что уже 8 лет работаю в основном с Interbase 6 и 7. Меня и заказчиков всё устраивает. Пока альтернативы именно для клиент-серверного приложения не вижу.

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

Почему то никто не посоветовал FIB+ - тоже очень хорошие компоненты доступа к IB/FireBird/Yaffil. Основное отличие от вышеприведённых компонентов - они более легки в работе (по объему получаемого кода). Достаточно быстры, используют многие преимущества СУБД, например поля-массивы. Также они будут полезны, когда необходимо обеспечить работу через неустойчивое соединение (модем) - там есть средства и методы для поддержания и восстановления соединения



Вопрос № 219

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

Здравствуйте, уважаемые эксперты!!! У меня такая проблема: использую компонеты IBDatabase,IBTransaction,IBQuery. Нужно обработать данные возвращаемые запросом. Цикл Repeat не работает потому как FindNext не срабатывает. RecordCount возвращает 1 (RecNo тоже глюк). Если ставлю DBGrid, то RecordCount возвращает правильное значение, все работает как положено. Что делать? Как обойтись без лишних компонентов?

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


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

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

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

Всё должно работать - хотелось бы увидеть код, структуру таблицы и SQL запрос.

2. [Отвечает: Ласковый 3лоумышленник (статус: 3-ий класс), 26.12.2006, 10:00]:

Здравствуйте, hdrus!
Попробуйте перед циклом выполнить IBQuery1.FetchAll - это заставит запрос вернуть все записи
Рекомендую схему:
...
IBQuery1.Active := true;
IBQuery1.FetchAll;
IBQuery1.First;
while not IBQuery1.Eof do
begin
//do something
IBQuery1.Next;
end;
IBQuery1.Active := false;
...
Читайте учебники!

Оценка за ответ: 5.
Комментарий: Учебники читаю. За совет большое спасибо.Сработало.

3. [Отвечает: Помфюк Владимир Степанович (статус: 8-ой класс), 26.12.2006, 10:06]:

Здравствуйте, hdrus!
А почему бы не
while not(IBQuery.EOF) do
?

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

4. [Отвечает: Бубырь Александр Николаевич (статус: 4-ый класс), 26.12.2006, 20:51]:

Злоумышленник написал все подробно,
хотя IBQuery1.FetchAll; - лишняя команда в таком исполнении (можно также дать IBQuery1.Last; с тем же результатом), она нужна только в случае если необходимо заранее знать точное количество записей (например при создании вариантного массива и перекачивании в него данных из запроса).



Вопрос № 220

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

У меня такая беда. Работал на компе и проверял паралельно вирусы на компе у меня файловая система NTFS . После проверки все нормально и я выключил комп. На следующий день я не смог запустить комп. Сообщает что нет файла с данными ....dll Подсоединил другой винчестер объёмом 10 гб. и поставил на нем Windows xp вайловую систему FAT 32. при запуске нового винчестера он его увидел и определил файловую систему RAW но не открывает и предлогает отформатировать. как 35 гб, а на самом деле он объёмом 80 гб. я его снял и подсоединил к другому компу где файловая систама FAT 32 он его обнаружил и открывает как родного и файловую систему увидел старую NTFS. подскажите что делать а форматировать жалко много информации которую не хотелось бы потерять.

Автор вопроса: Тихонов Алексей Сергеевич (статус: Посетитель)
Дата и время отправки вопроса: 26.12.2006, 09:55
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

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

Здравствуйте, Тихонов Алексей Сергеевич!

Вопрос в тему и именно по программированию Delphi

2. [Отвечает: Новаковский Юрий Аврамович (статус: 4-ый класс), 26.12.2006, 11:51]:

Здравствуйте, Тихонов Алексей Сергеевич!
Вы попали не туда, но я Вам отвечу.

На винте есть перемычка Master-Slave-и еще положение ограничения емкости для старых Bios,
уменя есть похожий 80 Гиг винт, и на нем Slave - перемычки нет совсем, а перемычка во второй позиции - 35 Гиг.

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



Вопрос № 221

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

Подскажите где можно скачать программу для создания хранителей экрана желательно на русском языке. Заранее благодарен.

Moderated: вопрос не относится к тематике сайта.

Автор вопроса: Тихонов Алексей Сергеевич (статус: Посетитель)
Дата и время отправки вопроса: 26.12.2006, 09:57
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


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

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

Здравствуйте, Тихонов Алексей Сергеевич!

Непонятно какое отношение данный вопрос имеет к Delphi. Не скачивать это программу надо а создавать!!!

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

Ув. Тихонов Алексей Сергеевич.
Вы умеете писать обычные программы с графикой (скринсейверы обычно подразумевают графику)? Тогда проблема практически решена.
Скринсейвер от обычной проги отличается только в следующем.
1) Нужно сменить разрешение с exe на scr
2) Обеспечить разворачивание в полный экран и закрытие по дёрганиё мыши.
3) Для обеспечения всех возможностей скринсейвера, необходимо обрабатывать параметры, которые передаются в коммандной строке.
С первым я думаю просто.
Второе делаем так. В FormCreate добавляем код вида
Form1.BorderStyle:=bsNone;//для чего нам заголовок
Form1.WindowState:=wsmaximazed;
в mousemove добавляем close;
и третье.
Проверить параметры с которым был вызван хранитель и если это /c - показать окно настройки хранителя, а иначе (можно проверять на /s, а можно и не проверять) сам хранитель. /p - для отображения в окне установок хранителя экрана.
Узнать, с каким параметром запущена прога, можно с помощью ParamStr(1)

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



Вопрос № 222

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

Дброго времени суток.
Подскажите, как отобразить реальное время в статусбаре.
Заранее спосибо

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


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

1. [Отвечает: PaVeL-Ekt (статус: 1-ый класс), 26.12.2006, 15:33]:

Здравствуйте, Илья Бабаков!

Это делаеться очень просто:
добавляем таймер со вкладки system
св-во interval=1000
в событии onTimer пишем
StatusBar1.Panels.Items[индекс панели в которую необходимо выводить время (с 0)].Text:=timetostr(time);

Вот и все. Удачи

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

2. [Отвечает: Вадим К (статус: Средний уровень), 26.12.2006, 15:34]:

Очень просто. Ставим таймер на форму. Interval ставим равным где то 500. Больше не советую - время будет как бы отставать иногда на полсекунды.
Меньше нет смысла - загружать даром систему.
В обработчике OnTimer пишем что то виде
StatusBar1.Panels[1].text:=TimeTostr(now);
всё! Теперь время пойдёт. Можно конечно форматировать время под себя с помощю FormatDateTime
ну например так
StatusBar1.Panels[1].text:=FormatDateTime('hh:nn',now);
Будут часы и минуты

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

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

Здравствуйте, Илья Бабаков!

Я хочу Вам посоветвать библиотеку Jedy-vcl

На форму ложите TJvStatusBar, а на него TJvClock.

Все. Удачи Вам!

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



Вопрос № 223

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

Дброго времени суток. Подскажите, как отобразить реальную дату в статусбаре. Заранее спосибо

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


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

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

Читаем внимательно мой ответ на предыдущий вопрос.
(просто заменяем TimeToStr на DateToStr)

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

2. [Отвечает: Новаковский Юрий Аврамович (статус: 4-ый класс), 26.12.2006, 17:33]:

Здравствуйте, Илья Бабаков!
Смотрите мой предидущий ответ:
на TJvStatusBar положите TJvDatePickerEdit.
В инспекторе объектов поставте:
ReadOnly True
ShowButton False
Color cl3DLight

Все. Удачи Вам!

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



Вопрос № 224

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

Доброе время суток, господа программисты. У меня по нажатию кнопки очищается TreeView1, создаются в нем катологи и подкатологи. На по повторном нажатии этой кнопки вылетает ошибка
"Project Project1.exe raised exception class EAccessViolAtion with message 'Access violation at address 004288F8 inmodule 'Project1.exe'. Read of address 00000004'. Process stopped. Use Step or Run to continue." И выделяет стороку "if FolderExists(x,Memo2.Lines[v])=false then begin". Я английский не знаю. Что означает это ошибка и в чем я ошибся и что мне делать(После нажатия кнопки, событие обращаетя к некоторым функция, если это вам поможет). Заранее Благодарен.

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


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

1. [Отвечает: PaVeL-Ekt (статус: 1-ый класс), 27.12.2006, 06:38]:

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

А не могли-бы Вы привести более подробный код?

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

Если ты пользуешься моей функцией FolderExists(), которую я дал как ответ на вопрос №206, то не вызывай её, когда x = nil и после очистки дерева (не имеет смысла). Проверяй так (см. приложение):

Хотя я не знаю, как инициализируется переменная x: TTreeNode, но всё же...

Приложение:

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



Вопрос № 225

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

Здравствуйте!
Как сопоставить с EXE файлом программы, написаной на Delphi 6, иконку .ico ?

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


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

1. [Отвечает: PaVeL-Ekt (статус: 1-ый класс), 27.12.2006, 09:33]:

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

Если нужно чтобы у EXE была иконка, тогда:
Project -> options -> application -> load icon

затем компильнуть проект,
если у файлов открываемых этим проэктом, тогда:
Через RegEdit открываем ветьвь
HKEY_CLASSES_ROOT, находим интересующее расширение файла, ищете ветьвь записанную в значении по умолчанию, открываете, там есть DefaultIcon, меняйте значение.

Оценка за ответ: 5.
Комментарий: Спасибо! Не думал, что после нескольких лет работы на Delphi докачусь до таких вопросов)) По поводу RegEdit'а учту на будущее




Статьи  >>

Простейший AI на примере мини-игры (часть 1)

Автор: Ерёмин Андрей

Большинство компьютерных игр содержат содержат искусственный интеллект. Если брать во внимание все серьёзные игры (Action, RPG и т.п.), то они полностью "захвачены искусственным разумом". Другое дело - мини-игры. К примеру, общеизвестный Сапёр прекрасно живёт и без интеллекта, думать ему во время игры вообще не нужно... Да что говорить и самой игре, если в некоторых ситуациях мыслительный процесс самого игрока ни к чему не приведёт - бывают ситуации, когда нужно просто щёлкнуть наугад - тут уже вероятность 50% - либо попал на мину, либо не попал... :-)

Проблема искусственного интеллекта известна довольно давно. Противостояние игроку - одна из целей. Действительно, не интересно было бы играть, если бы монстры вместо того, чтобы нападать на вас, ходили бы в разные стороны только из-за того, что направление движения выбирается с помощью случайных чисел, а пойти с атакой на конкретную точку они не догадываются. Каждая конкретная игра требует своего интеллекта, который является уникальным. Интеллект в одной игре не применим в другой.

Сейчас мы попытаемся создать самый простой AI (Artificial Intelligence кстати) на примере небольшой игры.

Игра

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

Проектируем интерфейс

Сделаем игру на основе стандартных компонент. Не будем применять никакой графики, ибо речь совсем не об этом. Итак, пусть наши "герои" будут простыми... квадратами. А почему бы и нет? Нет у нас времени на рисование персонажей - всё будет абстрактно. Размещаем на форме 2 компонента TShape (вкладка Additional палитры компонент). Один сделаем красным, а другой синим. Цвет заливки задаётся свойством Brush - Color. Пусть наш герой будет синим, а враг - красным. С персонажами определились. Что нам ещё нужно? Наверное, кнопка для запуска игры. Поместите на форму кнопку, лучше в левый верхний угол. Ну и ещё разместим где-нибудь 3 текстовые метки (TLabel) - одна будет показывать время игры, другая - уровень сложности, а в третьей будет появляться информация о результатах.

Время игры

Чтобы участники могли сравнить свои результаты, игра будет выдавать итоговое время. Для начала объявляем глобальную переменную, в которой будем хранить количество секунд, в течение которых длится игра. В раздел var модуля добавляем: Time: Integer = 0; Теперь нам нужен способ отсчитывать секунды. Для этого используем TTimer (вкладка System). Interval пусть останется стандартным (1000 мс = 1 сек), а вот сам таймер мы изначально выключим: Enabled = False. Назовём этот таймер не Timer1, а просто Timer. Теперь пишем его обработчик события OnTimer:

procedure TForm1.TimerTimer(Sender: TObject);
begin
  Inc(Time);
  if Time < 60 then
    TimeLabel.Caption:=IntToStr(Time)+' сек.'
  else
    TimeLabel.Caption:=IntToStr(Time div 60)+' мин. '+IntToStr(Time mod 60)+' сек.';
end;

Что же здесь происходит? Сначала мы прибавляем секунду к текущему времени. Затем в одну из текстовых меток, которая называется TimeLabel, выводим текущее время игры. Проверяем: если ещё не прошло одной минуты, то выводим просто секунды, а иначе выводим и минуты и секунды. Записать это можно немного по-другому, но не суть важно. Время почти готово, только в обработчик нажатия кнопки "Старт" нужно добавить включение игрового таймера: GameTimer.Enabled:=True; Вот теперь время точно готово.

Управление персонажем

Сделаем управление мышью для нашего "персонажа". Создаём обработчик на событие OnMouseMove формы, где устанвливаем фигурку в положение курсора:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
  Player.Left:=X-Round(Player.Width/2);
  Player.Top:=Y-Round(Player.Height/2);
end;

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

Можно изменить курсор со стрелки на крестик - установить свойство Cursor в crCross для формы и для фигурки.

Ну вот, управление готово. Можно запустить программу и посмотреть, что получилось.

Интеллект

Для постоянной активности противника также будем использовать таймер. Назовём его GameTimer, зададим интервал в 0.1 с (Interval = 100) и выключим (Enabled = False). Назначение этого таймера в следующем: когда его событие будет активироваться, будет анализироваться положение врага и враг будет двигаться по направлению к игроку. Пусть Player - фигурка игрока, Enemy - фигурка противника. Для начала зададим шаг движения противника в виде количества точек, на которые будет смещаться фигурка. Объявляем глобальную переменную: Step: Byte = 10; Заодно заведём переменную и для текущего уровня сложности, который будет представлен цифрой: Level: Byte = 1;

Теперь разбираемся с интеллектом. Вот черновой вариант:

  if Enemy.Left+Enemy.Width <= Player.Left then
    Enemy.Left:=Enemy.Left+Step
  else if Enemy.Left >= Player.Left+Player.Width then
    Enemy.Left:=Enemy.Left-Step
  else if Enemy.Top+Enemy.Height <= Player.Top then
    Enemy.Top:=Enemy.Top+Step
  else if Enemy.Top >= Player.Top+Player.Height then
    Enemy.Top:=Enemy.Top-Step
  else
    Игрок пойман

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

Итак, по порядку:

- если противник расположен левее игрока, то сдвигаем противника вправо;
- если противник правее игрока, сдвигаем его влево;
- если противник выше игрока, то сдвигаем вниз;
- если противник ниже, то сдвигаем вверх.

Достаточно простой алгоритм, который будет работать. Добавим в обработчик кнопки "Старт" запуск таймера для движения противника: GameTimer.Interval:=100; и GameTimer.Enabled:=True; Также нужно указать что-либо для выполнения в том случае, если враг не сдвинулся с места, т.е. участник пойман и проиграл. Например, можно добавить сообщение: ShowMessage('Вы проиграли!'); Запускаем программу и смотрим. Работает? Работает. Однако движение противника слишком определено: сначала он движется по горизонтали до тех пор, пока не сравняется по вертикали с игроком, а затем догоняет его по вертикали. Да, не самый оптимальный и не самый короткий путь. Есть способы лучше.

Уровень сложности

Немного прервём разработку нашего интеллекта и запрограммируем изменение уровня сложности. Самое первое, что приходит в голову - ускорять движение противника в течение игры. Так и сделаем. Помещаем на форму ещё один таймер и называем его LevelTimer; выключаем его, а в качестве интервала задаём то время, через которое уровень должен изменяться. Например, зададим 10 секунд, т.е. изменим Interval на 10000. Кнопка старта игры должна включать и этот таймер: LevelTimer.Enabled:=True; В результате, обработчик нажатия кнопки получается примерно таким:

procedure TForm1.StartButtonClick(Sender: TObject);
begin
  Time:=0;
  Level:=1;
  GameTimer.Interval:=100;
  GameTimer.Enabled:=True;
  Timer.Enabled:=True;
  LevelTimer.Enabled:=True;
  StartButton.Enabled:=False;
end;

Ну и наконец, обработчик события OnTimer для LevelTimer:

procedure TForm1.LevelTimerTimer(Sender: TObject);
begin
  if GameTimer.Interval >= 15 then
  begin
    GameTimer.Interval:=GameTimer.Interval-10;
    Inc(Level);
    label1.Caption:='Уровень: '+IntToStr(Level);
  end
  else
    Игра выиграна
end;

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

Кстати, чтобы обеспечить более-менее равные условия для всех, имеет смысл жёстко задать размеры формы, иначе владельцы больших мониторов получат огромное пространство для бегства :-) BorderStyle формы устанавливаем в bsSingle, а из множества BorderIcons исключаем biMaximize, чтобы форму нельзя было развернуть. Размеры формы лучше задать в ClientWidth и ClientHeight.

Запустите программу - теперь играть стало сложнее. Наш алгоритм при начальном интервале противника в 100 мс и последовательном понижении его на 10 мс даёт 10 уровней сложности. Дойдёте до конца? Думаю, да. С таким интеллектом далеко не уйти... Действительно, выбирается самый длинный путь, если не считать пути в обход (только этого нам не хватало! ;-) ).

Повышаем уровень интеллекта

Во-первых, неплохо бы слегка оптимизировать наш код - в нём содержится множество обращений к одним и тем же свойствам двух объектов. Лучше завести переменные, значения которых высчитать один раз и впоследствии использовать именно их. Работаем с событием OnTimer объекта GameTimer. Для начала заводим две локальные переменные: Var dx,dy: Integer; Это у нас будут соответственно расстояния между игроком и противником по горизонтали и по вертикали. Для удобства организуем вычисления так, что эти переменные будут принимать как положительные, так и отрицательные значения. Представим 4 координатные четверти плоскости и соответствующим образом расставим знаки наших переменных. Вот вычисление этих расстояний:

  if Player.Left+Player.Width < Enemy.Left then
    dx:=Player.Left+Player.Width-Enemy.Left
  else if Enemy.Left+Enemy.Width < Player.Left then
    dx:=Player.Left-Enemy.Left-Enemy.Width
  else
    dx:=0;

  if Player.Top+Player.Height < Enemy.Top then
    dy:=Enemy.Top-Player.Top+Player.Height
  else if Enemy.Top+Enemy.Height < Player.Top then
    dy:=Enemy.Top-Enemy.Height-Player.Top
  else
    dy:=0;

dx < 0
dy > 0
dx > 0
dy > 0
dx < 0
dy < 0

dx > 0
dy < 0

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

  if (dx = 0) and (dy = 0) then
  begin
    GameTimer.Enabled:=False;
    Timer.Enabled:=False;
    LevelTimer.Enabled:=False;
    GameStatusLabel.Caption:='Вы проиграли!';
    Exit;
  end;

Ну а если игра всё ещё в процессе, то нужно догонять игрока. Вот тут-то мы и изменим наш алгоритм. Выберем путь короче: будем двигаться не только по горизонтали и вертикали, но и по диагонали. Отдадим приоритет горизонтальному направлению, т.е. сначала будем двигаться по горизонтали и только затем по вертикали и по диагонали. Причина - все экраны вытянуты горизонтально, а значит основной "пробег" будет именно по этому направлению. Итак, если по горизонтали дальше до цели, чем по вертикали, то сначала движемся по горизонтали, а когда расстояния сравняются, пойдём по диагонали под углом 45°. Вот и реализация:

  if (Abs(dx) >= Abs(dy)) and (dx <> 0) then
    if dx < 0 then
      Enemy.Left:=Enemy.Left-Step
    else if dx > 0 then
      Enemy.Left:=Enemy.Left+Step
  else else if (dy <> 0) then
    if dy < 0 then
      Enemy.Top:=Enemy.Top+Step
    else if dy > 0 then
      Enemy.Top:=Enemy.Top-Step;

И код короче, и движение эффективнее.

Заключение

Последний алгоритм тоже не оптимален. Это всего лишь один из этапов улучшения интеллекта. Есть ещё более короткие пути и их мы запрограммируем в следующий раз, а также усложним игру новыми способами. Несмотря на то, что данный алгоритм является всего лишь движением одной точки к другой, его тоже можно считать искусственным интеллектом. Он примитивен и очень прост, но он есть и создаёт игровые условия.

Исходники программы »

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


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

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

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

Название
Описание
Раздел
Объём
Ссылки
Aprop
Программа, переводящая число в сумму прописью (например, "456" в "четыреста пятьдесят шесть"). Поддерживаются разряды до квадриллиона включительно.
3 Кб
Calculator
Исходник простого калькулятора.
14 Кб
Clock
Программа, демонстрирующая аналоговые часы (изображение циферблата). Отрисовка выполняется с помощью Canvas.
53 Кб
Ship
Программа, изображающая плывущий по морю корабль (рисование на Canvas).
7 Кб
Image Button

Графическая кнопка (поддерживаемый формат файлов - *.bmp). Выглядит подобно кнопке выбора статуса в Skype.

174 Кб
SunTime

TSunTime - это невизуальный компонент для вычисления времени восхода и захода солнца для указанного места и конкретной даты.

66 Кб
exe2dpr

Если у вас потеряны исходники программы, написанной на Delphi, но есть скомпилированный exe-файл, данная утилита позволит восстановить часть исходников. Программа восстанавливает все формы проекта, его модули, а также свойства и события объектов. Полученные процедуры не имеют тела, а имеют лишь ссылку на адрес кода в исполняемом файле для данной процедуры, т.к. данная утилита не является декомпилятором. В большинстве случаев программа позволит сэкономить 50-90% времени по восстановлению проекта.

5 Кб
c2pas32

Утилита, работающая из командой строки. Назначение - перевод файлов C (*.h, *.c) в файлы Pascal. Программа читает C-файл и переводит около 80% содержания. К тому же, конечный код форматируется для лучшего восприятия (читаемости).

91 Кб
Игра "Догонялки"

Программа-исходник к статье "Простейший AI на примере мини-игры".

199 Кб
 
Всего новых файлов: 9  
0.61 Мб
 

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

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

Юмор

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

Опытный админ ищет работу народным целителем

1) Установлю и настрою астральный файервол.
2) Открою чакры 80 и 21 для коммуникации с астралом через http/ftp
3) Для активной репликации с астралом помогу открыть чакру 135.
4) Для духовных учителей спецпредложение - астральное прокси и чакра-паблишинг на базе Micrsoft Sacral Security and Acceleration Server 2004.
5) Чистка сосудов кармы с помощью приложений Kaspersky AntiMagic Pro/Symantec AntiMagic Personal.
6) Чистка реестра кармы вручную.
7) Отключение аккаунтов и удаление профилей энергитических сущностей (бесов)
8) Hастройка DNS и WINS для правильного разрешения имен астральных существ в адрес.

:))

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

В избранное