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

  Все выпуски  

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


Программирование на DELPHI
Выпуск #84 (18 июля 2008 г.)

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

Delphi.int.ru

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

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

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

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

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

Последние изменения на сайте:

1. В разделе "Статьи" создана страница "Список статей", где можно увидеть список всех статей, имеющихся на сайте и отсортировать этот список по нужному критерию.

2. Создана функция репутации участников, с помощью которой пользователи могут выражать своё отношение друг к другу. Делается это согласием (положительный отзыв, +1) или несогласием (отрицательный отзыв, -1) с сообщениями пользователя (заданные вопросы, ответы на вопросы, сообщения в мини-форуме). Подробнее.

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

Если Вы новичок и совсем недавно подписались на рассылку, рекомендуем зарегистрироваться на сайте. Регистрация предоставит Вам полный доступ к возможностям сайта. К примеру, без регистрации Вы не сможете задавать на сайте вопросы, оставлять комментарии к файлам и участвовать в опросах. Регистрация занимает всего пару минут.
Перейти к регистрации »
Задать вопрос »

В этом выпуске:

  • Обучение - урок 23: Множества - как работать в программе со множествами;
  • Статья: Synapse - библиотека для сетевой работы, аналог Indy по возможностям;
  • Файловый архив - новые исходники;
  • Юмор - Правила общения со Службой Технической Поддержки (на правах юмора).

Статистика Delphi.int.ru Expert на 18.07.2008, 18:00 (предыдущий подсчёт - 12.06.2008, 20:00):

Количество экспертов: 57 (+3).
Участниками задано вопросов: 1775 (+97).
Экспертами дано ответов: 2423 (+129).
Количество сообщений на мини-форумах: 3653 (+381).
Максимальное число разосланных в день писем (за всю историю): 809 (17.07.2007, +0).

До встречи в следующем выпуске!

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

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

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом.

Количество читателей рассылки (18.07.2008, 18:00):
5589+2106+479= 8174 (+209)

Связь по e-mail:

admin@delphi.int.ru
support@delphi.int.ru


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

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом
(текущая версия системы: 2.40; последнее обновление: 13.07.2008)

Последние новости

22 июня 2008: Создан новый тематический раздел - Публикация и распространение ПО. Раздел включает следующие 8 подразделов:
Подготовка ПО к публикации
Организация защиты ПО
Создание справочных руководств
Создание дистрибутивов ПО
Публикация продуктов в Web
Дела денежные
Лицензирование и авторские права
Распространение и продвижение ПО

9 июля 2008: Создан новый характеристический параметр для участников - репутация.
Каждый участник может изменить репутацию любого другого путём выставления положительной или отрицательной оценки за какое-либо сообщение этого участника. Сообщениями на данный момент считаются вопросы, ответы и сообщения в мини-форумах вопросов. Изменяя репутацию, Вы можете выразить своё отношение к тому или иному пользователю, а другие участники впоследствии смогут ориентироваться на репутацию пользователя (например, определить по репутации, насколько можно доверять эксперту, давшему ответ на поставленный вопрос). Для изменения репутации нужно, чтобы был выполнен вход на сайт (авторизация). Подробную информацию о репутации участника можно найти на странице его личной информации. Более детальное описание работы этой функции доступно здесь.

10 июля 2008: Теперь у Вас имеется возможность дать свою оценку каждому из вопросов, задаваемых на сайте. Вопрос может быть оценён по шкале от 1 до 5. Своим голосом Вы выражаете, насколько данный вопрос Вам понравился, интересен ли он, и может ли он быть полезным для других пользователей. Оценка "1" - вопрос неинтересный и/или бесполезный, "5" - хороший вопрос, заслуживающий внимания. Голосовать может каждый, независимо от статуса. Единственное условие - должен быть выполнен вход на сайт под своей учётной записью. Голосование производится очень просто, быстро и удобно. Просматривая вопрос, достаточно сделать всего один щелчок. В дальнейшем, возможно, данный рейтинг будет учитываться при выборе лучших вопросов и награжении их авторов.

В начале каждого месяца проходит голосование за лучший ответ месяца и самый интересный вопрос. Победителям вручаются почётные медали.
За май медали получили: Косолапов Дмитрий Юрьевич (лучший ответ) и Chilaveg (лучший вопрос).
За июнь медали получили: GAZ (лучший вопрос), за лучший ответ медали не получил никто.

 

Последние достижения:

7 июля 2008: Шичко Игорь повысил свой уровень и теперь имеет статус 3-ий класс (прежний статус: 2-ой класс).
1 июля 2008: Мережников Андрей повысил свой уровень и теперь имеет статус 3-ий класс (прежний статус: 2-ой класс).
23 июня 2008: Шичко Игорь повысил свой уровень и теперь имеет статус 2-ой класс (прежний статус: 1-ый класс).
19 июня 2008: Мережников Андрей повысил свой уровень и теперь имеет статус 2-ой класс (прежний статус: 1-ый класс).
17 июня 2008: iPharaon стал экспертом.

 

Архив: вопросы и ответы

В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 421 - 435. Вопросы, на которые не было дано ни одного ответа, не публикуются.
Так как темп поступления вопросов от пользователей намного выше темпа их публикации, в рассылке публикуются вопросы, заданные довольно давно. Тем не менее, вопросы публикуются по порядку, без пропусков. Просмотреть любые вопросы и ответы Вы всегда можете на сайте.

Статистика по выпуску:

Кол-во вопросов: 14
Кол-ответов: 17
Баллы за ответы: 64
 

Вопрос # 421

Уважаемые Экперты Подскажите пожалуйста !
Как отпечатать print-ом то что печатается через LPT
и не печатается если Print подключен к USB
Исходник прилагается (скачан где то в примерах )

Приложение:

Вопрос задал: Алиев Шамсидин (статус: Посетитель)
Вопрос отправлен: 22 марта 2007, 10:20
Всего ответов: 2; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Вадим К

Print - это принтер?
Код вроде стандартный. МОжет драйвера неккоресктно настроены. Word и другие проги печатают?

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 22 марта 2007, 11:08
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, Алиев Шамсидин!
Надо понимать, что один и тотже принтер печатает, когда подключен к LPT, и не печатает когда подключен к USB?
Если так, то это ДВА РАЗНЫХ принтера, и должно быть два комплекта драйверов, хотя в сущности это один тотже драйвер, но настройки разные.
Наверное можно перестроить, но это искать на Ж...
приключений. А Delphi тут не причем.
Подключите принтер к USB и поставте драйвера.
Удачи Вам!

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Ответ отправлен: 22 марта 2007, 19:10
Оценка за ответ: 3


Вопрос # 422

Здравствуйте! Недавно дописывал класс и наткнулся на возможность использовать класс как список. Для удобства я прописал классу метод Assign. Теперь вопрос, почему в методе Assign допустима такая запись:

procedure TLine.Assign(Line: TLine);
begin
Self.FColor := Line.FColor; //???
...

Ведь поле FColor определено в секции private!, которая не должна быть доступна из вне класса.

Приложение:

Вопрос задал: SMaks (статус: 1-ый класс)
Вопрос отправлен: 22 марта 2007, 21:59
Всего ответов: 2; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, SMaks!
Потому что все типы классов, и private в том числе, доступны из того модуля, где этот класс описан. В доругом модуле, если вы подключите к нему этот, private методы будут закрыты.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Ответ отправлен: 22 марта 2007, 23:09
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Секция private конечно доступна в методе СВОЕГО КЛАССА, ёмаё!

procedure TLine.Assign(Line: TLine);

Ну ты даёшь!

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 23 марта 2007, 08:24
Оценка за ответ: 4
Комментарий: Вот именно своего, я же беру не свой класс ..Line: TLine.., точнее он должен быть закрытым для меня, но чудеса, я могу получать на прямую его поля из секции private, но только из методов этого же класса.


Вопрос # 423

Приветствую!!!Как в DBGrid-е колонки местами поменять.

Вопрос задал: KilkaMS (статус: Посетитель)
Вопрос отправлен: 23 марта 2007, 00:08
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Николай Рубан

Вам нужно описать такой тип:
type
THackAccess = class(TCustomGrid);

Далее в секции implementation написать таку процедуру:
procedure MoveDBGridColumns(DBGrid: TDBGrid; FromColumn, ToColumn: Integer);
begin
THackAccess(DBGrid).MoveColumn(FromColumn, ToColumn);
end;

А вот пример использования процедуры:

procedure TForm1.Button1Click(Sender: TObject);
var n,k:integer;
begin
MoveDBGridColumns(DBGrid1, k, n)
MoveDBGridColumns(DBGrid1, n-1, k);
end;


В процедуре меняются n-й и k-й столбцы DBGrid1. Пример взят и переработан с http://www.swissdelphicenter.ch/en/tipsindex.php

Good Luck!!!

Ответ отправил: Николай Рубан (статус: 9-ый класс)
Ответ отправлен: 23 марта 2007, 00:59
Оценка за ответ: 5


Вопрос # 424

Здравствуйте.Я записал свою программу на DVD диск. Как мне сделать так, чтобы вставив в дисковод диск, программа шла автозапуском.

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 23 марта 2007, 00:24
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Николай Рубан

Вообще этот вопрос к программированию идет о посредственно. Но сделать это можно так. В корневой каталог при записи нужно записать файл autorun.inf, а в нем прописать такие строки:
===========
[autorun]
ICON=autorun\Icon2.ico
OPEN=autorun\calc.exe
===========
(знаки равно не писать!!!)
Где прописано в каком каталоге (в примере это autorun) на диске и какой файл (например calc.exe) нужно запускать, а также какую иконку использовать для отображения ее как иконки CD.

Good Luck!!!

Ответ отправил: Николай Рубан (статус: 9-ый класс)
Ответ отправлен: 23 марта 2007, 01:19
Оценка за ответ: 5


Вопрос # 425

Дополнение к вопросу 424. ICON=autorun\Icon2.ico Почему Icon2, то есть для чего индекс 2. Какую этот индекс несёт функцию.

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 23 марта 2007, 03:02
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Сергей Устинов

Здравствуйте, Толков Геннадий Викторович!

2 - это не индекс :)
Просто Icon2.ico - это файл иконки для диска, причем, судя по строке ICON=autorun\Icon2.ico этот файл лежит в директории autorun
Файл можете назвать как угодно, например gennady.ico
Тогда эта строка будет ICON=autorun\gennady.ico

Удачи!

Ответ отправил: Сергей Устинов (статус: 2-ой класс)
Ответ отправлен: 23 марта 2007, 03:21
Оценка за ответ: 5


Вопрос # 426

Уважаемые знатоки! Использую ADO для работы с БД формата mdb. На компьютере Access не установлен. Вопрос: как из программы написанной на Delphi выполнить сжатие БД?

Вопрос задал: ValKu (статус: Посетитель)
Вопрос отправлен: 23 марта 2007, 14:26
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Вадим К

http://delphiworld.narod.ru/base/compact_access_db.html
http://delphiworld.narod.ru/base/compact_access_db2.html

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 23 марта 2007, 14:42
Оценка за ответ: 5
Комментарий: Реализовал вариант с jro.JetEngine, всё работает. Внушительное спасибо за помощь.


Вопрос # 427

Доброго всем времени суток.
Вадим К писал..
Вы хотябы название поля привели, можно было бы предложить что то внятное. А так предположу, что это поле типа BLOB. Как эго расшифровать? А это зависит, что там. Там может быть обычный текст или картинка, тогда киньте на форму TDBMemo (TDBRichEdit) или TDBImage. Подключите их к этому полю. А там увидите. Но может быть, что там действительно зашифрованые данные. Тогда нужно смотреть - не телепат я, не знаю что там, а единстенно верного ответа нет здесь

В действительности я пробовал и DBMemo и DBImage. В этих компонентах отображается то-же самое (Bytes), а названия полей ничего недадут т.к. это спец. сокращения. Дело в том, что пишу диплом по теме, есть готовая прога, которая все это читает, а мне нужно прочитать и выделить только необходимую информацию. Судя по расширениям файлов это СУБД Paradox.

Вопрос задал: Мясников Сергей Владимирович (статус: Посетитель)
Вопрос отправлен: 23 марта 2007, 23:43
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

Ответ #1. Отвечает эксперт: Вадим К

>>названия полей ничего недадут т.к. это спец. сокращения
Ну здесь же люди не только со школьным образованием сидят:) Может быть и догадались бы. Или вы расшифровку привели бы.
Тогда нужно пробывать читать как последовательность байт и смотреть что там.
Почему вы боитесь привести название полей? Секретная база наверное:)

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 26 марта 2007, 11:35
Оценка за ответ: 3


Вопрос # 429

Приветствую!!Как String перевести в PAnsiChar??

Вопрос задал: KilkaMS (статус: Посетитель)
Вопрос отправлен: 23 марта 2007, 23:44
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Сергей Устинов

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

Очень просто: pс:=PAnsiChar(stroka);

Удачи!

Приложение:

Ответ отправил: Сергей Устинов (статус: 2-ой класс)
Ответ отправлен: 24 марта 2007, 00:02
Оценка за ответ: 5


Вопрос # 431

Как в чужом прилржении нажать кнопку ToolBar?

Вопрос задал: Андрей-858 (статус: Посетитель)
Вопрос отправлен: 24 марта 2007, 19:59
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Вадим К

ToolBar'ы бывают разные. Есть два варианта. Найти хендл тулбара и послать ему клик мышки с указание координат.
Вариант два - искать кнопку по имени

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 26 марта 2007, 11:28


Вопрос # 432

Здравствуйте. Если возможно, подскажите (может быть ссылки, статьи и т.д.) как написать драйвер мыши.Спасибо.

Вопрос задал: HotMan (статус: Посетитель)
Вопрос отправлен: 25 марта 2007, 15:02
Всего ответов: 2; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, HotMan!
На делфи это не получится. Писать нужно на ассемблере. Ищите KmdTut (набор статей) и KmdKit (набор исходников) на сайте www.wasm.ru, еще без DDK не обойтись, и нуден ядерный отладчик, вроде SoftICE - работать нужно будет на двух компах, соединенных нуль-модемным кабелем. Пишете драйвер устройства, регистрируете символьную ссылку устройство-драйвер и т.д.

Вы уверены, что Вам нужен именно драйвер? может Вы имели ввиду простой Hook с обработкой позиции миши?

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Ответ отправлен: 26 марта 2007, 05:41
Оценка за ответ: 3

Ответ #2. Отвечает эксперт: Вадим К

Не соглашусь с предудыущим экспертом. На Делфи это можно, но очень очень сложно, да и то, только на 3делфи и с большим бубном. Проще на VS C++ = он для этого предназначен. Ссылки о том, как написать простейший драйвер на делфи ищите на том же wasm.ru

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 26 марта 2007, 11:25
Оценка за ответ: 3


Вопрос # 433

Тут у меня собеседование намечается. На вопрос, что будут спрашивать, сказали: Delphi, SQL, JavaScript. Так вот и вопрос: причём к Delphi JavaScript? Или я что-то упустил? (не люблю просто web-программирование, хотя уже с JavaScript ознакомился)
Актуально до 21:00 (gmt+02) 25.III.2007
Спасибо

Вопрос задал: mvp (статус: 4-ый класс)
Вопрос отправлен: 25 марта 2007, 18:07
Всего ответов: 1

 

Ответ #1. Отвечает эксперт: Николай Рубан

JavaScript к Delphi может носить весьма прямое отношение при написании CGI-скриптов, т.е. скриптов которые в дальнейшем прикрепляються к некому WEB-приложению.
Почитать об этом можно по такой ссылке: http://vitaeauct.narod.ru/301/002/420.htm
Удачи!!!

Ответ отправил: Николай Рубан (статус: 9-ый класс)
Ответ отправлен: 25 марта 2007, 22:49
Оценка за ответ: 5
Комментарий: Спасибо, почитаю. Собеседование прошёл - на работу взяли :) Так что ещё раз спасибо :)


Вопрос # 434

Всем Привет!
Не могу разобраться почему не качает.
Помогите

Приложение:

Вопрос задал: Vit2 (статус: Посетитель)
Вопрос отправлен: 25 марта 2007, 21:55
Всего ответов: 2; сообщений в мини-форуме вопроса: 28

 

Ответ #1. Отвечает эксперт: min@y™

C компонентами Indy я не работал, поэтому здесь помочь не могу. Однако, я, давно ещё, ради развлечения и убийства времени написал простенькую программку по закачиванию свежих креативов с udaff.com :). Вот ссылки:
EXE-файл: http://sourceviewer.narod.ru/downloads/udaff32.7z
Исходиники на Delphi:
http://sourceviewer.narod.ru/downloads/udaff32_src.7z

Посмотри, может поможет.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 26 марта 2007, 09:29

Ответ #2. Отвечает эксперт: Вадим К

Если вы с https начали качать, то может и не качать. Там ещё один компонент бросать надо.
А так, код вроде жизнеспособный, поэтому, приведите урл, откудова качаете, может он мёртвый или требует кукисов или сесии. во вторых, проверте, а файл действетельно может создастся. Каталог dir должен существовать.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 26 марта 2007, 11:23
Оценка за ответ: 5


Вопрос # 435

Здравствуйте! Много раз видел в векторных редакторах такую вещь: если накидать на канву много линий и выделить их все, то появиться область Rect, которую можно растягивать и сужать и т.п. Вопрос, что происходить с линиями, в момент когда тянещь за сторону выделенной области(Rect)??

Вопрос задал: SMaks (статус: 1-ый класс)
Вопрос отправлен: 26 марта 2007, 01:55
Всего ответов: 1; сообщений в мини-форуме вопроса: 2

 

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, SMaks!
Просто определяются координаты прямоугольника, описанного вокруг выделенных объектов. Когда меняются размеры прямоугольника выделения оригинальные координаты точек домножаются на коэффициент изменения прямоугольника выделения (оригинальные / новые, по ширине и высоте). Аналогично и с поворотом.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Ответ отправлен: 26 марта 2007, 05:48
Оценка за ответ: 4
Комментарий: Допустим я получил этот прямоугольник, и взяв за левый край, уменьшаю его(с Rect0 до Rect1), то как должны измениться координаты точек внутри области?


Обучение Delphi

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

20. Подпрограммы (часть 2)
21. Подпрограммы (часть 3)
22. Простые типы данных

Множества

Автор:
© Ерёмин А.А., 2008
Если бы не память, жизнь была бы невозможна; если бы не забывание, жизнь была бы невыносима.
Номер урока:
23

Введение

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

Математическое понятие множества

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

Множества в Delphi

Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, ...}

Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.

Перейдём ближе к делу. Множество может быть построено на основе перечислимого типа данных (кто забыл - открываем предыдущий урок). Например, на основе символьного типа Char. По-английски множество называется set (набор) и именно этим словом описывается в Delphi:

var A: set of Char;

В данном примере мы объявили множество A на основе символьного типа Char.

Запомните: множество не может состоять более чем из 255 элементов!

Например, следующее описание:

var N: set of Integer;

приведёт к ошибке "Set base type out of range".

Задание множеств

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

Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так:

A:=['A','B','C','D'];

Теперь множество A содержит 4 элемента.

Если вспомнить, что тип данных Char упорядочен, то данную запись можно сократить следующим образом:

A:=['A'..'D'];

Мы просто указали диапазон значений, который должен находиться во множестве. Результаты одинаковый, но вторая запись короче и красивее. Допустимы, конечно же, комбинации диапазонов и отдельных значений:

A:=['A','B','K'..'N','R','X'..'Z'];

Помните, что множество - это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox), но само множество "в чистом виде" вывести нельзя.

Операции над множествами

В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.

Находится ли элемент во множестве?

Самая простая операция, для понятия смысла которой даже не нужно задумываться. Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in. Слева от него указывается элемент, справа - множество. Результатом, как несложно догадаться, является логичное значение - истина или ложь. True - элемент принадлежит множеству, False - не принадлежит:

var A: set of Char;
{...}
A:=['A'..'E','X'];
if 'D' in A then ShowMessage('Элемент В находится во множестве A.');

Несложно проверить, что сообщение в данном случае появится на экране.

Объединение множеств

Если есть два множества, определённые на одном и том же типе данных, то их можно объединить и получить таким образом новое множество.

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

Объединение множеств

В словесном описании операция объединения - результирующее множество содержит все те элементы, которые есть хотя бы в одном из двух исходных множеств.

Объединение записывается знаком плюс "+". Пример:

var A,B,C: set of Char;
{...}
A:=['A','B','C'];
B:=['X','Y','Z'];
C:=A+B;
//C = ['A','B','C','X','Y','Z']

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

Пересечение множеств

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

Пересечение множеств

Пересечение обозначается звёздочкой "*". Пример:

var X,Y,Z: set of Byte;
{...}
X:=[1,2,3,4,5];
Y:=[4,5,6,7,8];
Z:=X*Y;
//Z = [4,5]

Разность множеств

Операция вычитания удаляет из первого множества те элементы, которые есть во втором множестве:

Разность множеств

Пример:

var X,Y,Z: set of Char;
{...}
X:=['A'..'D'];
Y:=['D'..'F'];
Z:=X-Y;
//Z = ['A'..'C']

Следует обратить внимание, что порядок множеств в данном случае важен, т.е. X-Y и Y-X - это разные множества.

Применение множеств

Множества находят широкое применение. С помощью множеств удобно задавать набор опций, каждая из которых либо включена, либо выключена. К примеру, поместите на форму кнопку (TButton), перейдите в инспектор объектов, разверните свойство Font (шрифт) и найдите свойство Style. Вот это свойство как раз и реализовано множеством. Во множестве 4 элемента: fsBold, fsItalic, fsUnderline и fsStrikeOut, каждый из которых отвечает за стиль шрифта. Принадлежность элементов ко множеству задаётся указанием значения True или False для каждого из этих пунктов. В строке "Style" находится описание данного множества. Попробуйте изменять стиль и посмотреть, как меняется описание множества Style.

А теперь давайте сделаем простенький интерфейс для доступа к этому свойству. Пусть будет меняться стиль шрифта у этой кнопки (Button1). Поместим на форму 4 TCheckBox - для доступа ко всем значениям и дадим им соответствующие имена. Изменение стиля будем делать при нажатии на саму эту кнопку. Пример реализации:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Font.Style:=[]; //Сделали множество пустым
  //Теперь смотрим состояния флажков и добавляем нужные стили
  if CheckBox1.Checked then Button1.Font.Style:=Button1.Font.Style+[fsBold];
  if CheckBox2.Checked then Button1.Font.Style:=Button1.Font.Style+[fsItalic];
  if CheckBox3.Checked then Button1.Font.Style:=Button1.Font.Style+[fsUnderline];
  if CheckBox4.Checked then Button1.Font.Style:=Button1.Font.Style+[fsStrikeOut];
end;

Чтобы не повторять везде одно и то же "Button1.Font.", эту часть кода можно, что называется, вынести за скобку при помощи специального оператора with. Ранее речь о нём не шла, однако этот оператор очень удобен. Смысл его прост: то, что вынесено вперёд, автоматически применяется ко всему, что находится внутри данного блока. В нашем случае будет так:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Button1.Font do
  begin
    Style:=[]; //Сделали множество пустым
    //Теперь смотрим состояния флажков и добавляем нужные стили
    if CheckBox1.Checked then Style:=Style+[fsBold];
    if CheckBox2.Checked then Style:=Style+[fsItalic];
    if CheckBox3.Checked then Style:=Style+[fsUnderline];
    if CheckBox4.Checked then Style:=Style+[fsStrikeOut];
  end
end;

Согласитесь, так гораздо удобнее. Используйте оператор with как можно чаще - с его помощью и код по объёму становится меньше и скорость работы увеличивается.

Изменение стиля шрифта на кнопке во время работы программы

Свойство Options у TOpenDialog - множество

У большинства компонент среди свойств можно найти множества. Например, у диалога открытия файла TOpenDialog (вкладка Dialogs) множеством представлено свойство Options, которое содержит приличное число элементов:

 

Вы спросите - а что это за названия элементов у множеств? Ответ прост - это специально объявленный перечислимый тип данных, на основе которого и создано множество. Если немного покопать, то можно найти описание этого типа:

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly,
  ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect,
  ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt,
  ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate, ofNoNetworkButton,
  ofNoLongNames, ofOldStyleDialog, ofNoDereferenceLinks, ofEnableIncludeNotify,
  ofEnableSizing, ofDontAddToRecent, ofForceShowHidden);
TOpenOptions = set of TOpenOption;
Как видите, ничего сверхестественного здесь нет - вам всё уже знакомо.

Заключение

Сегодня мы познакомились с множествами - наборами элементов. С помощью множеств реализованы свойства многих компонент. Множества не дают возможности хранить какие-либо значения - они просто позволяют создавать наборы из значений перечислимых типов данных. Но во многих случаях использование множеств - лучший и самый быстрый способ хранения некоторого набора параметров.


Оцените данный урок (1 - плохо, ..., 5 - отлично): -1- -2- -3- -4- -5-. Комментарии в тексте письма приветствуются.
 

Статьи

Самые популярные статьи на сайте:

Как можно из Delphi отслеживать все события Windows?
Создание непрямоугольных форм в Delphi
Работа с приложениями Microsoft Office. Excel
Работа с реестром и INI-файлами в Delphi
Как прочитать ID3-Tag'и из MP3-файла?
Конвертирование графических форматов
Работа с приложениями Microsoft Office. Word
Написание инсталлятора на Delphi
Работа со строковыми типами данных
Работа с HTML-справкой в программах

Synapse

Автор: Вадим К

Содержание

Вступление

Часто, чтобы раскритиковать программистов на Delphi, используют простой и дешёвый трюк. Мол, мы, истинные программисты пишем весь код ручками, а вы, делфисты, набросали компонентов и всё.

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

Но доказывать это им бессмысленно – всё равно будут сопротивляться (чтобы они согласились?). Мы пойдём другим путём – будем использовать самую что не наесть библиотеку - и пусть медитируют себе.

В качестве примера я представляю библиотеку Synapse (http://synapse.ararat.cz/doku.php). По возможностям эта библиотека соответствует популярным Indy, только стабильность у неё получше. К примеру, почту с вложениями отправлять/принимать или файлы по https качать на ней проще простого. А вот с Indy нужно хорошо помучаться.

И главный плюс этой библиотеки – полностью бесплатна с удобной BSD лицензией - можно использовать в своих приложениях - как бесплатных, так и в коммерческих, без каких-то отчислений. Но автор абсолютно не против, если вы подкинете ему пару копеек.

Установка библиотеки

Для начала нужно скачать библиотеку с сайта. Или просто взять в прилагаемом к статье архиве. Теперь распакуем куда-нибудь во временный каталог. Создадим папку, где будет располагаться сама библиотека – у меня это обычно каталог C:\Program Files\CodeGear\Components\Synapse. То есть, я, не стесняясь, создаю каталог в каталоге Delphi, и ставлю туда свои библиотеки/компоненты. Хотя некоторые сочтут это идеологически неверным – можно создать каталог для библиотек и в любом другом месте, главное, чтобы его потом не удалили. Второе условие – чтобы путь содержал только латинские символы. Иначе бывают проблемы с некоторыми компонентами. Один из посетителей сайта www.delphi.int.ru делает оригинально - он хранит всё это прямо на рабочем столе. А потом ругается, мол, ничего не работает.

Скопируем в новосозданную папку содержимое папки source\lib из распакованного архива.

Остался последний шаг – объяснить Delphi, что у нас есть новая библиотека. Для этого просто нужно прописать каталоги для поиска.

В случае с Delphi 2006-2007 это делается так:

  • File -> Close All. При надобности сохраните текущий проект (это страховочное действие, не помешает).
  • Tools -> Options. В появившемся диалоге в дереве слева находим Environment options -> Delphi Options -> Library – Win32.
  • Ищем поле Browsing path. Жмём кнопку […] справа от него.
  • В появившемся окне ищем снова кнопку […] и, нажав её, выбираем каталог, куда сохранили содержимое библиотеки и жмём ОК.
  • Теперь Add и ОК для закрытия окна.
  • Повторяем предыдущие три действия, только для поля Library Path.

Если же у вас Delphi 7 или младше, то нужно в меню Tools найти пункт Environment Options, а потом вкладку Library. Всё остальное - очень похоже.

Сделай это по-простому

Так, библиотека установлена, пора написать что-то простенькое. Например, научимся скачивать страничку из интернета и отображать в Memo. Создаём новый проект, Ставим на форму Memo, растянем нормально и включим полосы прокрутки установкой свойства ScrollBars = ssBoth. Ставим на форму кнопку, кликая дважды по ней, создаём обработчик. Но перед написанием обработчика, надо добавить один юнит в список uses, а именно – httpsend.

А теперь сам обработчик. Приготовились увидеть сверхсложный код? Вот он – одна строчка:

HttpGetText('http://вашсайт.нет', Memo1.Lines);

Не правда ли просто? Но на самом деле, лучше написать немного сложнее:

if not HttpGetText('http://вашсайт.нет', Memo1.Lines) then
  ShowMessage('Не получилось скачать:('); 

Этот код нужен только для контроля ошибок, но это часто важно. Интересно, что если страничку не удастся скачать, то никаких ошибок не будет, просто функция возвратит false. Иногда очень удобно, особенно в потоках.

Замечателен и следующий факт. Так как библиотека является лёгкой обёрткой над обычными сокетами, то это сказывается на размере выполняемого файла. Этот же пример, переписанный с использованием Indy весит на 30% больше – а это весомый аргумент (если быть точнее, то в цифрах два исполнимых файла у меня весили 404 и 530 кбайт).

А посерьёзнее?

А теперь усложним задачку. Предположим, надо скачать файл/страницу с ресурса, использующего SSL. В случае с Indy это сделать очень сложно. Точнее, написать приложение-то просто, но вот чтобы оно работало... Оно или требует библиотеки OpenSSL, или говорит, что найденные библиотеки не подходят. Решается проблема скачиванием "правильных версий библиотек". Но даже имея их, всё равно проблемы. Если какое-то приложение использовало "неверные библиотеки", то до перезагрузки компьютера работать ничего не будет. Или то грузится, то нет. Почему так – предположения есть, но не хочется разбираться. Есть дела поважней.

Итак, что надо сделать для решения нашей "сложной" задачи? Первым долгом убедиться, что в системном каталоге есть файлы ssleay32.dll и libeay32.dll. (для тех, кто не нашёл, я в архиве приложил их). Рекомендуемая версия – не меньше 0.9.7. В архиве – 0.9.8.2. Если "загрязнять" системный каталог (C:\Windows\System32) не хотите, то можно просто рядом с приложением положить эти файлы.

А теперь осталось сделать в нашей миниатюрной программе одно изменение – добавить в список uses файл ssl_openssl. И всё. Теперь можно скачивать как с http, так и с https. Библиотека сама разберётся со всем!

Хочу пример сложнее!

В качестве рабочего приложения хочу представить маленькую программу для получения whois информации. Whois сервер – это сервер, который по ip или имени домена выдаёт некоторую информацию о его принадлежности. Например, владельца, город/страну, где расположен сервер. Но для "повышения секретности" мы будем использовать сайт https://www.nic.ru/whois/, который может предоставлять эту информацию по SSL.

Сам код смотрите в приложенном архиве.

В этот раз я даже не использовал потоки – я не хотел усложнять пример. В коде интересны два момента. Первое – это "очистка" полученного результата от ненужного текста и "русификация". То есть, вместо непонятных английских слов подставлены русские.

Второй момент – это выделение из содержимого скачанной странички нужной информации. В этот раз я обошёлся без регулярных выражений, хотя можно было и с ними.

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

Заключение

Помните, что когда решение задачи начинает слишком усложняться – значит вы выбрали неверный способ решения, не более. Один мой знакомый, пытаясь скачать страничку по https, и промучавшись несколько дней, на моё предложение использовать Synapse, сказал: "Нет, хватит с меня, ещё одно. Лучше я напишу на чистых сокетах. Надоели эти поделки. Моё будет работать". Кстати, пишет он уже несколько недель :-) и ругает кривой Windows, который ему постоянно мешает. Но мы-то знаем, где правда.

Файлы к статье »

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

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

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

Название
Описание
Раздел
Объём
Ссылки
Файлы к статье "Synapse"
1.16 Мб
Disable close form
Всего лишь несколькими строками кода можно запретить закрытие окна кнопкой "X" в правом верхнем углу. Данная программа демонстрирует блокировку этой кнопки.
7 Кб
Splasher
Данная программа демонстрирует отображение Splash-картинок для приложений Windows. Особенность данного способа в следующем. Мы создаём очень маленькую программу, назначение которой - отобразить картинку и запустить необходимое приложение Windows. Запускаемая программа не обязательно должна иметь расширение .exe. Для отвлечения внимания пользователя, основной выполняемый файл переименовать во что угодно (например: project1.exe -> project1.dll).
11 Кб
MDI-child from DLL

Пример показывает, как загрузить форму MDI-Child из внешней DLL.

305 Кб

Explode effect
"Взрывное" появление и исчезновение формы.

2 Кб

Transparent Form
Программа, демонстрирующая создание прозрачной формы (компоненты при этом остаются видны). Ответ на частозадаваемый вопрос.

2 Кб

Big Res
Пример, показывающий, как упаковать разные данные в exe-файл программы (курсоры, звуки, изображения, тексты).

226 Кб

Read Icon List
Программа, извлекающая из файлов ICO и CUR все изображения (16x16, 32x32, 64x64 и т.д.) во всех цветовых форматах (2, 16, 256, 24 бит и т.д.)

176 Кб

Set date and time
Изменение даты и времени часов в системе.

215 Кб

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

176 Кб

Системное меню и диалог "О программе"
Пример изменения системного меню окна (добавление, удаление и изменение пунктов) и показа окна "О программе" с помощью функции ShellAbout.

2 Кб

 
Всего новых файлов: 11  
2.28 Мб
 
 

Юмор

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

Правила общения со Службой Технической Поддержки (на правах юмора)

1. Если техник сказал, что придет прямо сейчас, выйдите из сети и отправляйтесь пить кофе. Для нас не проблема запомнить 2700 сетевых паролей.

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

3. Если вы получили от техника е-мейл особой важности, немедленно его удалите! Мы просто тестируем систему.

4. Ести техник ест на своем рабочем месте, выложите ему все свои проблемы и ждите немедленного ответа. Мы существуем только чтобы служить другим и всегда готовы подумать о починке компьютеров.

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

6. Посылайте срочную почту ЗАГЛАВHЫМИ БУКВАМИ. Hаш почтовый сервер ее распознает и отправит быстрее всего!

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

8. Если не работает ксерокс, вызывайте техника. Это ведь электронный прибор, разве нет?

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

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

11. Если техник по телефону говорит вам какие кнопки надо нажимать, почитайте газету. Hа самом деле я не хочу, чтобы вы что-то делали. Мне просто нравится звук моего голоса.

12. Если мы собираемся вас инструктировать перед обновлением операционной системы, не беспокойтесь. Мы ведь никуда не денемся, когда это закончится!

13. Если ваш принтер не печатает, повторите попытку как минимум 20 раз. Задания на печать часто улетают прямо в космос.

14. Если после 20 попыток принтер все-же не печатает, отправьте это задание на остальные 68 принтеров по всему зданию. Один из них обязательно должен его напечатать!

15. Hикогда не пользуйтесь встроенными подсказками, они для дураков.

16. Если вы занимаетесь на вечерних компьютерных курсах, замените сетевые драйвера на своем и всех соседских компьютерах. Мы любим работать до 2:30 ночи, исправляя это.

17. Если техник чинит ваш компьютер около 13:00, обедайте прямо перед ним. Мы лучше работаем, когда у нас кружится голова.

18. Hикогда нас не благодарите. Мы любим это и нам за это платят!

19. Если техник спрашивает, не устанавливали вы новые программы на компьютер, - солгите. Это не его дело, что вы храните у себя!

20. Если провод мышки стукает по портрету вашей любимой собачки, приподнимите корпус компьютера с монитором и засуньте провод туда. Мышиный провод разрабатывался с учетом нагрузки в 2 тонны.

21. Если на клавиатуре не работает пробел, виновата новая почтовая программа. Клавиатура работает гораздо лучше, если под клавишами находится примерно пол-кило хлебных крошек, обрезанных ногтей и больших липких пятен от Кока-Колы.

22. Если вы увидели сообщение «Are you sure?» нажмите «Yes» как можно быстрее! Черт побери, если бы вы не были уверены, вы бы не делали этого, не так ли?

23. Спокойно произносите фразы типа «Я ничего не понимаю в этом компьютерном дерьме». Hас совершенно не волнует, что кто-то называет область нашей профессиональной деятельности дерьмом.

24. Если вам надо заменить катридж с тонером, вызывайте техника. Замена катриджа это черезвычайно сложная задача, и Хьюлетт-Паккард рекомендует, чтобы ее выполнял профессиональный инженер с ученой степенью доктора наук в области ядерной физики.

25. Если что-то с вашим компьютером, попросите секретаршу позвонить нам. Hам нравится разговаривать с третьими лицами, не имеющими о проблеме ни малейшего представления.

26. Если вы получили видеоролик размеров в 30 Мб, немедленно разошлите его каждому работнику фирмы. У нас полно места и процессорной мощности на почтовом сервере.

27. Даже не думайте разбивать большое печатное задание на части. Господь не даст кому-то еще втиснуться в очередь на печать.

28. Если вы столкнулись с техником в выходной день в гастрономе, задайте ему компьютерный вопрос. Мы работаем 24 часа в сутки 7 дней в неделю, даже в гастрономе в выходной день.

29. Если выш сын изучает компьютеры, пустите его в офис на выходные поработать на вашем компьютере. Мы будем на месте, когда из-за его пиратской копии Visual Basic 6.0 навернется ваша база в Access.

30. Если вы принесли ваш домашний no-name компьютер к нам для бесплатного ремонта, скажите насколько немедленно мы должны его исправить, чтобы ваши дети могли снова играть в DOOM. Мы займемся им в первую очередь. Ведь все знают, что все что мы делаем - это весь день бесцельно бродим по Интернету!

Источник: bayanov.net

:))

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




Ведущий рассылки: Ерёмин Андрей


В избранное