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

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

  Все выпуски  

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


Опрос
Полезные ссылки
Публикуете ли Вы свои программы в сети? Если да, то
к какому типу Вы относите их большую часть?

Нет, не публикую
Да, freeware
Да, shareware
Да, donateware
Не знаю
Сайт "Программирование на Delphi":
http://www.delphi.int.ru/
Система Delphi.int.ru Expert:
http://www.delphi.int.ru/expert/
Форум сайта:
http://www.delphi.int.ru/forum/
Программирование на DELPHI
Выпуск #50 (28 мая 2006 г.) 

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

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

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

В течение трёх недель система Delphi.int.ru Expert работала в тестовом режиме. Были найдены некоторые ошибки и они были исправлены. Также неблюдались случаи ошибочной доставки писем на некоторые почтовые сервера. Частично вопрос решён, но не до конца. Меры уже принимаются. В скором времени система обновится до новой версии. Появятся новые возможности для посетителей и экспертов, а также будут исправлены все недочёты и ошибки. А пока что встречайте первую девятку вопросов. Вопросы публикуются только после того, как истекло время их действия (1 неделя).

Обращение к экспертам системы:

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

Обращение к читателям:

- Задавая вопрос, максимально точно формулируйте содержание проблемы.
- Оценивайте ответы объективно! Если ответ не несёт полезной информации, незачем ставить за него оценку 5. Хочется видеть реальный, а не мнимый рейтинг. Если эксперт заслужил двойку - поставьте её :-)

Все пожелания по поводу системы отправляйте на expert@delphi.int.ru.

Ах да, чуть не забыл... Выпуск-то юбилейный! 50-ый как никак! :-)

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

Авторское слово
Delphi.int.ru Expert
Статья по Delphi
Файловый архив
Друзья
Юмор

Количество читателей рассылки: 5147.

Delphi.int.ru Expert

Задать вопрос экспертам >> Стать экспертом или уйти из состава экспертов >> Эксперты системы >>

Система Delphi.int.ru Expert является автоматизированный FAQ-системой. Использовать систему могут только зарегистрированные участники портала Delphi.int.ru. Общая схема работы системы такова:

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

Вопросы и ответы (#1 - #17)
Вопрос № 1

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

Здравствуйте, эксперты! Вопрос таков: Подскажите как можно инвертировать, вращать, устанавливать фоновый цвет изображения, загруженного в TImage?

Вопрос задал участник: Ситников Константин Евгеньевич
Дата и время отправки вопроса: 07.05.2006, 19:24
Всего ответов: 5
Страница данного вопроса >>


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

1. [Отвечает: Степанов Игорь Николаевич (статус: 6-ой класс), 07.05.2006, 20:31]:

Посмотри, возможно поможет:

Приложение:

2. [Отвечает: Матвеев Игорь Владимирович (статус: Практикант), 08.05.2006, 00:28]:

На счет вращения и инверсии все понятно - см. приложение, но что Вы имели ввиду под установкой фонового цвета? Может Вам нужно просто залить какую-то область нужным цветом - это функция FloodFill:
Canvas.FloodFill(10, 10, clBlack, fsBorder);

Приложение:

3. [Отвечает: bruder (статус: 4-ый класс), 08.05.2006, 15:40]:

Здравствуйте, Ситников Константин Евгеньевич!
Инвертировать - код в приложении. Удачи!

Приложение:

4. [Отвечает: Zeon . (статус: 8-ой класс), 09.05.2006, 19:20]:

Для вращения: (см. приложение)

А для заливки одним цветом лучше использовать:

procedureTForm1.Button1Click(Sender: TObject);
begin
PatBlt(Form1.Canvas.Handle,
0,
0,
Form1.ClientWidth,
Form1.ClientHeight,
WHITENESS);
end;

побыстрее работает.

Приложение:

5. [Отвечает: Вадим К (статус: Практикант), 10.05.2006, 12:22]:

В обычном изображении фоновый цвет никак не отличается от всех остальных. Определить его можно только "зрительно". Причём в разных людей это может быть разный цвет. К примеру, возмём изображение флага. Где там фон? (При условии, что всё изображение занимает флаг).
А теперь ответ На вопрос, как изменить фон.
Изменить фон - значит заменить пиксели с цветом, который мы признали фоном на новый цвет.
Компонент TImage, если ему выставить свойство Transparent, прозрачным считает левый нижний пиксель.



Вопрос № 2

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

Здраствуйте, подскажите пожалуйста, как с помощью Delphi создать физическую связь (не в коде) 1:М (Master/Detail)между 2-мя таблицами Paradox. Связь реализуется средствами Paradox, т.е. появляются файлы с расширением .VAL, которые отвечают за функционирование связи. Такую связь можно создать в утилите Database Desktop в разделе Referential Integrity при редактировании структуры таблицы. Как решить эту проблему средствами Delphi? (Необходимо сгенерировать пустую базу данных с таблицами и связями)

Вопрос задал участник: Мохов К. Н.
Дата и время отправки вопроса: 08.05.2006, 00:32
Всего ответов: 0
Страница данного вопроса >>


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

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



Вопрос № 3

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

Здравствуйте. У себя в отделе мы хотели в своём комплексе использовать технологию MSMQ для передачи данных. Программируем на Delphi 5. Можно ли кто нибудь помочь небольшим работающим примером для освоения этой технологии. Буду вам за это очень благодарен.

Вопрос задал участник: Хорт А.М.
Дата и время отправки вопроса: 08.05.2006, 09:09
Всего ответов: 0
Страница данного вопроса >>


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

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



Вопрос № 4

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

Уважаемые эксперты, может кто - то сталкивался с проблемой пойска файлов в скрытых папках? А точнее сначала необходимо найти скрытые папки, а затем осуществить в них поиск файлов! Использую рекурсивный поиск -

Приложение:

Вопрос задал участник: West
Дата и время отправки вопроса: 09.05.2006, 01:07
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: Dron (статус: Специалист), 09.05.2006, 08:52]:

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

Приложение:

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

2. [Отвечает: Вадим К (статус: Практикант), 10.05.2006, 12:36]:

Проблема скорее всего здесь.
faAnyFile+faHidden
Первое указывает любой файл, второе - скрытый. Первое уже включает второе+нескрытые файлы.
Наиболее простой способ - создать две процедуры, одна будет искать только скрытые папки и если нашла, то запускать другую процедуру, которая уже производит поиск файлов в заданой папке.
Можно конечно и одной процедурой обойтись и розрулить всё за счёт if'ов, но мороки будет много.

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



Вопрос № 5

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

При перемещении одной формы нужно чтобы вторая перемещалась вместе с ней.

Вопрос задал участник: bruder
Дата и время отправки вопроса: 11.05.2006, 12:34
Всего ответов: 4
Страница данного вопроса >>


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

1. [Отвечает: Вадим К (статус: Практикант), 11.05.2006, 13:40]:

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

Приложение:

Оценка за ответ: 4.
Комментарий: В следующий раз не ленись и пиши исходник полностью. Я это и сам знаю, что нужно обрабатывать WM_MOVE. Сама проблема в координатах... Авансом тебе 4! :P

2. [Отвечает: Матвеев Игорь Владимирович (статус: Практикант), 12.05.2006, 12:43]:

Вы должны обрабатывать сообщение WM_MOVE формы, оно происходит при изменении положения формы.

Приложение:

Оценка за ответ: 5.
Комментарий: Ну это так, "отписка". Главная цель достигнута - перемещение. А как же быть, если надо, чтобы вторая форма не сбоку плелась, а снизу? (и с других краёв и вообще не с краёв...) А вообще тема такая: вторая форма липнет к первой и при перемещении первой вторая, оставаясь прилипшей, движется за первой. Липкость уже готова, а вот с перемещением не очень... Получается так, что при резком перемещении вторая форма отлипляется и уже не перемещается :)

3. [Отвечает: Zeon . (статус: 8-ой класс), 12.05.2006, 17:39]:

Когда-то я делал нечто подобное.
Кинул на форму таймер(стандартный компонент) и в его основном событии писал нечто вроде:

if Form2.Left > (Form1.Left + Form1.Width + 1) then Form2.Left := Form2.Left - 1;

Тоже самое для движения на право, вверх и вниз. Посчитаешь сам. Я надеюсь, идея ясна.

Интервал таймера ставишь по вкусу. Таким образом, вторая форма красиво, плавно догоняет первую и прилипает к ней.

Оценка за ответ: 5.
Комментарий: Напрягает только фраза : "Посчитаешь сам." ;) Эт не есть гуд! Ну в общем с таймером - оригинально...

4. [Отвечает: mvp (статус: Студент), 18.05.2006, 12:33]:

Форма два прилипает к форме 1 справа и снизу, при движении формы. По исходникам можете доделать и до прилипания слева и
сверху.

Приложение:



Вопрос № 6

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

Уважаемые эксперты! Подскажите, пожалуйста, как узнать, установлен ли в системе хотя бы один принтер? Заранее благодарю за ответ.

Вопрос задал участник: Sunshine
Дата и время отправки вопроса: 11.05.2006, 15:39
Всего ответов: 3
Страница данного вопроса >>


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

1. [Отвечает: bruder (статус: 4-ый класс), 11.05.2006, 17:49]:

Есть много способов. Вот один из них - с помощью реестра. Кинь на форму кнопку и memo. В событие кнопки OnClick пиши код приложенный к ответу.

Приложение:

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

2. [Отвечает: Ершов Денис (статус: Студент), 13.05.2006, 00:56]:

Самое простое что приходит в голову подключить к проекту модуль Printers. После этого программе станет доступно свойство Printer.Printers:TStrings - список установленных в системе принтеров.

Оценка за ответ: 5.
Комментарий: Коротко и удобно!

3. [Отвечает: West (статус: 1-ый класс), 14.05.2006, 00:03]:

Мне известно два способа, один из них осветил bruder, второй:

Приложение:

Оценка за ответ: 3.
Комментарий: Во-первых, вы повторили ответ Ершова Дениса; во-вторых, перебор значений Printers делать не нужно - это ведь уже TStrings.



Вопрос № 7

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

Подскажите, плз, компонент (на torry.net ничего подходящего не нашёл), который бы позволял строить графики на основе ФИНАНСОВЫХ баров и/или свечей. Бар и свеча характеризуются 4 значениями: открытие (open), закрытие (close), максимум (high), минимум (min). Пример свечи: http://it-trade.ru/show_img.asp?id=7659 График из свечей: http://it-trade.ru/show_img.asp?id=7660 Пример бара: http://it-trade.ru/show_img.asp?id=7661 Пример графика из баров: http://it-trade.ru/show_img.asp?id=7663 (в зависимости от того, что больше - open или close, бар раскрашивается в разный цвет). P. S. Денег за компоненту давать не буду, поэтому желательно шароварную или бесплатную. Нужна для диплома, да и то - больше для красоты :) Спасибо

Вопрос задал участник: mvp
Дата и время отправки вопроса: 11.05.2006, 18:30
Всего ответов: 0
Страница данного вопроса >>


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

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



Вопрос № 8

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

Здравствуйте! Поясните пожалуйста принцип работы с ftp в Delphi... Интересует закачка и скачка файлов Заранее спасибо!

Вопрос задал участник: Ситников К.Е.
Дата и время отправки вопроса: 12.05.2006, 16:13
Всего ответов: 1
Страница данного вопроса >>


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

1. [Отвечает: Dron (статус: Специалист), 12.05.2006, 16:27]:

Работать с FTP удобно через компонент TidFTP (Indy-компонент, вкладка Indy Clients). В Host прописывается имя хоста (или IP-адрес соответственно), в Port - порт для соединения (21 по умолчанию), в Username и Password логин и пароль соответственно. Далее программная часть. Сначала соединяемся: IdFTP1.Connect(True); Загрузить файл на сервер можно с помощью функции Put('имя_локального_файла','имя_файла_на_сервере'). Аналогично можно загрузить файл с сервера на компьютер: Get('файл_на_сервере','файл_для_сохранения'). После завершения работы нужно разъединиться: IdFTP1.Disconnect; Кроме того, у этого компонента большое количество возможностей. Удачи!

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



Вопрос № 9

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

Здравствуйте, эсперты. Я использую компонент TJvDBGrid из библиотеки Jedi. Меня интересует каким образом можно отобразить в сетке текст из поля типа TMemoField. Используемая база данных Access. Буду благодарен за любую помощь.

Вопрос задал участник: Федоров Роман Сергеевич
Дата и время отправки вопроса: 14.05.2006, 18:50
Всего ответов: 0
Страница данного вопроса >>


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

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



Вопрос № 10

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

Подскажите пожалуйста универсальную библиотеку для распаковки архивов (разных типов - zip, rar, cab, arj и т.д.). Кроме ZipTV - с ней не понятно - не всегда правильно распаковывает, неправильно работает с русской кодировкай. Желательно бесплатную.

Вопрос задал участник: Матвеев Игорь Владимирович
Дата и время отправки вопроса: 15.05.2006, 15:04
Всего ответов: 1
Страница данного вопроса >>


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

1. [Отвечает: bruder (статус: 4-ый класс), 15.05.2006, 16:45]:

Ну канешна... универсальный, бесплатный, русский, да ещё с исходниками, да ещё без глюков и чтоб работал :)) НЕТ такого в природе ;)

ZIP Master
Бесплатный компонент ZIP Master - паковщик/pаспаковщик ZIP. Очень
удобный интеpфейс, фоpмат PkZip v2.04g. Не поддеpживает некотоpые сеpвисные
возможности типа шифpовки, pезки аpхива на кусочки - а кого это волнует ?
Зато дает возможность отследить progress для каждого файла. Скачал,
кажется, с www.delphiexchange.com.

http://www.aidaim.com - дают много платного и бесплатный ZipForge. Cжимает похуже WinZip'ов и WinRar'ов, но пользоваться легко и возможностей немало.

http://aravilsoft.tripod.com/ - компоненты для работы с cab-файлами. cabinet.dll в любой винде есть, с собой таскать ненадо. Вроде все легально - лицензию в мелкософт получать не надо Минус - жмет слабо.

Вот всё чё нашёл (время мало), если чё получше найду, дам знать...

Оценка за ответ: 2.
Комментарий: Я же говорю - мне нужна библиотека для универсальной обработки архивов разных форматов. Наверное все-таки прийдется остановиться на ZipTV.



Вопрос № 11

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

У меня такой вопрос: допустим у меня есть некий фаил "C:\index.html", как мне написать такую прогу, чтобы она во время запуска открывала этот фаил и показывала его (как браузер)?

Вопрос задал участник: Жучков С. В.
Дата и время отправки вопроса: 16.05.2006, 14:12
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: Dron (статус: Специалист), 16.05.2006, 15:31]:

Всё просто. Помещаете на форму компонент TWebBrowser (страница Internet) и дальше программно загружаете в него нужную страницу:
WebBrowser1.Navigate('C:\index.html');

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

2. [Отвечает: Darya Ermakova (статус: Специалист), 18.05.2006, 16:10]:

Для этого на закладке Internet есть компонент TWebBrowser. Нужно только поставить его на форму и на создание формы задать в методе Navigate адрес документа (можно и интернетовский).
Для вашего примера:
WebBrowser1.Navigate(C:\index.html');

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



Вопрос № 12

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

Ещё один вопрос: как на форме сделать ссылку на мыло или адрес в инете (то есть при нажатии на Deeetyru@xasder.ru или на www.feerut.sk открывалась соответственно почтовая программа или браузер), причём адресс в браузере или поле "Кому" было заполнено этим мылом или адресом?

Вопрос задал участник: Жучков С. В.
Дата и время отправки вопроса: 16.05.2006, 14:15
Всего ответов: 3
Страница данного вопроса >>


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

1. [Отвечает: Dron (статус: Специалист), 16.05.2006, 15:34]:

Пропишите вот такой обработчик:
ShellExecute(0,'open',PChar('mailto:Deeetyru@xasder.ru'),'','',SW_SHOWNORMAL);
Или такой соответственно:
ShellExecute(0,'open',PChar('http://www.feerut.sk'),'','',SW_SHOWNORMAL);
Не забудьте добавить в uses модуль ShellAPI.

Оценка за ответ: 5.
Комментарий: Единственный кто упомянул что нужно прописать в uses модуль ShellAPI.

2. [Отвечает: Darya Ermakova (статус: Специалист), 16.05.2006, 16:12]:

Все это делает функция ShellExecute. Как видно в примере, адрес берем из Edit-а, почтовый адрес определяем наличием символа @ и добавляем к нему 'mailto:' для запуска почтовой программы, иначе запускается браузер.

Приложение:

Оценка за ответ: 4.
Комментарий: нет упоминания о добавлении в uses модуля ShellAPI.

3. [Отвечает: bruder (статус: 4-ый класс), 16.05.2006, 18:01]:

Здравствуйте Жучков С. В.!
Я бы хотел дополнить ответы экспертов, думаю, это Вам будет полезно. В приведённом коде показан пример отправки письма с заполненой темой и текстом сообщения.
Используййте %0d для символа перевода строки (LF), %20 для пробела.
Список возможных параметров:
CC=Carbon copy (дополнительные получатели)
BCC=Blind carbon copy (дополнительные получатели, адреса которых не показываются остальным получателям)
SUBJECT=Subject text (тема)
BODY=Body text (текст)

Приложение:

Оценка за ответ: 5.
Комментарий: описаны дополнительные функции типа заполнения поле тема т.д., хотя нет упоминания о добавлении в uses модуля ShellAPI.



Вопрос № 13

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

Добрый день! По ходу изучения компонента IdPOP3 (вкладка Indy Clients) возник вопрос: можно ли получить тему письма и адрес отправителя не скачивая его (письмо) на комп? И как получить размер письма?

Вопрос задал участник: Жучков С. В.
Дата и время отправки вопроса: 17.05.2006, 14:58
Всего ответов: 1
Страница данного вопроса >>


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

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

Конечно можно!
Соединяемся с сервером, потом
- для получения темы и отправителя:
[b]IdPOP31.RetrieveHeader(k,idmessage1)[/b], [i]где k - номер письма на сервере, а idmessage1 - это компонент, в который будет вноситься информация[/i]

- для получения размера письма:
[b]size:=IdPOP31.RetrieveMsgSize(k)[/b], [i]где size - это переменная под размер, а k - номер письма на сервере. Размер приходит в байтах[/i]

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



Вопрос № 14

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

Компонент для отображения баров (свеч) мне никто не помог найти, следовательно прийдётся писать самому. Вопрос такой: как можно определить свой вид точки в TSeries (Tchart)? Напомню, что, например, свеча характеризуется 4-мя значениями: открытие, максимум, минимум, закрытие. На графике отображается в виде цельной фигуры: горизонтальные чёрточки(открытие, закрытие) к вертикальной черте (разница между максимумом и минимумом). Неужели придётся создавать 2 TSeries c разным типом точек и потом их просто совмещать? Спасибо

Вопрос задал участник: mvp
Дата и время отправки вопроса: 17.05.2006, 17:43
Всего ответов: 1
Страница данного вопроса >>


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

1. [Отвечает: Вадим К (статус: Практикант), 18.05.2006, 10:55]:

А не проще будет компонент написать?
Если сделать ряд допущений, то нарисовать будет не так и сложно. А с TChart'ом кажеться не получиться.

Оценка за ответ: 3.
Комментарий: Компонент писать - не один день - очень много подводных камней (например, растяжение графика в run-time и т. п.) Лучше от чего-то отталкиваться.



Вопрос № 15

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

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

Вопрос задал участник: Ситников К.Е.
Дата и время отправки вопроса: 19.05.2006, 19:25
Всего ответов: 6
Страница данного вопроса >>


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

1. [Отвечает: Евгений В (статус: 1-ый класс), 19.05.2006, 19:47]:

function MyFunktion:integer;
var
//переменные
begin
//Выражение
end;
Если я правильно Вас понял...

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

2. [Отвечает: Мартемьянов А.Б. (статус: 4-ый класс), 19.05.2006, 22:21]:

Ясли я правильно понял вопрос, ты хочешь получить функцию наподобие Inc(), в которой может быть 1 или 2 параметра(для данного примера) (например, inc(i,2) или inc(i)).
Такие функции поддерживаются кажется начиная с Delphi 5. Называются они то-ли переопределяемые, то ли перегружаемые, точно не помню. Их суть такова:
Ты пишешь 2 или более одноименные функции(см.приложение). Далее при вызове ф-и increment если ты передаешь в нее 1 параметр- то выполняется первая функция, если передаешь 2 переметра- то выполняется вторая. Таким образом ты как бы получаешь функцию с необязательным (вторым) параметром

Приложение:

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

3. [Отвечает: Евгений Козаченко (статус: 2-ой класс), 19.05.2006, 19:56]:

Эти параметры называются парамеирами по умолчанию. Они должны быть расположены в конце списка параметров в таком виде:
<параметр>:<тип параметра>=значение по умолчанию
Например:

Приложение:

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

4. [Отвечает: Матвеев Игорь Владимирович (статус: Практикант), 20.05.2006, 04:26]:

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

Тебе нужно просто указать значение аргумента по-умолчанию, смотри приложение - параметр param2 можно не указывать - тогда в функции оно будет False.

Приложение:

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

5. [Отвечает: Вадим К (статус: Практикант), 22.05.2006, 11:32]:

Есть один важный момент в этих способах задания функций. Нужно писать так, что бы компилятор всегда мог "угадать", какую функцию вызвать.
К примеру я могу объявить две функции вида
function xxx(a:byte=1;b:real=3):boolean;overload;
function xxx(a:integer=1):boolean;overload;
Если вызвать функцию без параметров, то компилятор будет ругаться.overload - ето указание компилятору, что я создаю перегруженую функцию.
И второй важный момент, параметры по умолчанию должны быть справа в объявлении функции.
тоесть, приведённое ниже - недопустимо
function d(a:integer=1;b:real):boolean;

6. [Отвечает: Darya Ermakova (статус: Специалист), 22.05.2006, 12:26]:

Нужно задать этим параметрам значение при объявлении функции. Например так:
procedure MessageShow(s2: string; s1: string = 'Hello');
begin
ShowMessage(s1+s2);
end;

Тогда при вызове процедуры можно задать значение только s2:
MessageShow(' there');



Вопрос № 16

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

Добрый день. Случилась следующая проблемка. Разрабатываю адаптивную систему тестирования знаний. БД на Access, интерфейс на Delphi6(естественно). БД состоит из нескольких таблиц (основные сущности и таблицы справочного характера). Имеется 4 пользовательских представления: администратор, экзаменатор, эксперт и студент. Админ регистрирует экспертов и экзаменаторов; эксперт составляет тесты по предметам посредством имеющихся шаблонов; экзаменатор регистрирует студентов и распечатывает протоколы; студент проходит тестирование по выбранной теме и в конце получает протокол с результатами. Трагедия происходит именно при написании "студенческой" части. Не понимаю в какой последовательности нужно производить запись в протокол и в базу ответы студента. Какими компанентами пользоваться. Если загружаю в какой нибудь DBMemo вопросы из Базы Вопросов, то не получается вывести ответы для выбора (пробовала DBLookupComboBox-ом, DBRadioGroup-ом и др.)Неговоря уже о сравнении выбранных студентом ответах и верными, и о подсчете результатов). К тому же так как это адаптивное тестирование, то при верном/неверном ответе на конкретный вопрос уровень сложности следующего должен повышаться/понижаться. Вобщем, хоть вешайся........... Если что, заранее спасибо!!!

Приложение:

Вопрос задал участник: Иванова Параска Федоровна
Дата и время отправки вопроса: 20.05.2006, 19:38
Всего ответов: 1
Страница данного вопроса >>


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

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

Насколько я понимаю Вам надо выбрать случайным образом первый вопрос, предполагая, что его сложность средняя (предположим 3 по 5-бальной шкале). Запрос такой: select * from question where level=3; Какими компонентами - Ваш выбор. Чтоб не таскать за собой BDE посоветовал бы ADO-компоненты. Дальше - каким-нибудь random'ом выбрать случайную запись. Потом - выбрать варианты ответов на этот вопрос. Потом - принять ответ студента, например через DBRadioGroup или через DBLookupComboBox. Следующий шаг - проверить был ли выбран правильный вариант, если да - поднять уровень сложности, если нет - снизить. Дальше - все сначала, только с новым уровнем сложности.



Вопрос № 17

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

Здравствуйте! Подскажите пожалуйста такую вещь: как средствами Delphi отслеживать сетевой трафик (ADSL, если это имеет значение)? За ранее, спасибо!

Вопрос задал участник: Евгений В
Дата и время отправки вопроса: 20.05.2006, 19:52
Всего ответов: 2
Страница данного вопроса >>


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

1. [Отвечает: mvp (статус: Студент), 20.05.2006, 20:07]:

Скачайте програмку с исходниками на delphi, которая считает трафик:

http://www.delphi.int.ru/files/sources/sources_n/nettrafmonitor.zip

Оценка за ответ: 5.
Комментарий: &#1057;&#1087;&#1072;&#1089;&#1080;&#1073;&#1086;!

2. [Отвечает: Степанов Игорь Николаевич (статус: 6-ой класс), 21.05.2006, 15:10]:

Что бы отследить трафик, нужно написать снифер. Посмотри в инете исходники.

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




Статьи  >>

Создание COM-сервера

Автор: Iron Monk

Всем привет!

Чем отличается программист от другого типа человека разумного?
Я думаю, постоянным желанием подшутить над братом меньшим - Человеком нормальным, благо способов для этого - великое множество. В реестре Windows неограниченное количество мест для автоматического запуска программ - сейчас нас интересует расширение оболочки - контекстное меню Эксплорера. Займемся созданием +СОМ-сервера который будет запускаться при вызове контекстного меню.
Сразу оговорюсь - на компе потенциального испытуемого должна стоять звуковая карта и, желательно, антивирус Касперского, чтобы испытуемому был хорошо известен вопль AVP при обнаружении вируса.

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

MYWAVE RCData C:\Temp\Infected.wav

(вместо C:\Temp\Infected.wav пишете реальный путь к *.wav файлу)
Сохраняем файл с именем WAVE.RC. Далее выполняем команду:

brcc32.exe C:\Temp\Wave.rc

(вместо C:\Temp\Wave.rc пишете реальный путь к Wave.rc файлу)
У нас получился файл ресурсов Wave.res который мы будем использовать дальше.

В примерах Delphi есть почти все, что нам нужно:
..:\Program Files\Borland\Delphi7\Demos\ActiveX\ShellExt\ContextM.pas

Немножко редактируем этот файл (в смысле выбрасываем ненужное - добавляем нужное) и получаем примерно это:

unit Unit1;

interface

uses
  Windows, ActiveX, ComObj, Classes,
  Dialogs, StdCtrls,
  ShlObj;

type
  TInitWormHook = class(TComObject, IShellExtInit, IContextMenu)
  protected
    { IShellExtInit }
    function IShellExtInit.Initialize = SEIInitialize;
    function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
      hKeyProgID: HKEY): HResult; stdcall;
    { IContextMenu }
    function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
      uFlags: UINT): HResult; stdcall;
    function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
    function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
      pszName: LPSTR; cchMax: UINT): HResult; stdcall;
  end;

  function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult; stdcall;
  function DllCanUnloadNow: HResult; stdcall;

const
  Class_ContextMenu: TGUID = '{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}';

implementation

uses ComServ, SysUtils, ShellApi, Registry, Graphics, mmSystem;

//Цепляем наш ресурс
{$R wave.res}

function TInitWormHook.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
  hKeyProgID: HKEY): HResult;
begin
  Result := NOERROR;
end;

function TInitWormHook.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
          idCmdLast, uFlags: UINT): HResult;
begin
  Result := 0;
end;

function TInitWormHook.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
begin
  Result := NOERROR;
end;

function TInitWormHook.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
  pszName: LPSTR; cchMax: UINT): HRESULT;
begin
  Result := NOERROR;
end;

type
  TInitWormHookFactory = class(TComObjectFactory)
  public
    procedure UpdateRegistry(Register: Boolean); override;
  end;
  
//А это - наша процедура по извлечению звука из файла ресурса
procedure RUNWAV;
var
WaveHandle: THandle;
  WavePointer: pointer;
  begin
  WaveHandle:= FindResource(hInstance, 'MYWAVE', RT_RCDATA);
  if WaveHandle <> 0 then
    begin
      WaveHandle := LoadResource(hInstance, WaveHandle);
      if WaveHandle <> 0 then
        begin;
          WavePointer:= LockResource(WaveHandle);
          sndPlaySound(WavePointer, snd_Memory or SND_ASYNC);
          UnlockResource(WaveHandle);
          FreeResource(WaveHandle);
        end;
    end;
end;

procedure TInitWormHookFactory.UpdateRegistry(Register: Boolean);
var
  ClassID: string;
begin
  if Register then begin
    inherited UpdateRegistry(Register);
    ClassID := GUIDToString(Class_ContextMenu);
    CreateRegKey('Directory\shellex\ContextMenuHandlers\WAV', '', ClassID);
    if (Win32Platform = VER_PLATFORM_WIN32_NT) then
      with TRegistry.Create do
        try
          RootKey := HKEY_LOCAL_MACHINE;
          OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True);
          OpenKey('Approved', True);
          WriteString(ClassID, 'FTP simple client');
        finally
          Free;
        end;
  end
  else begin
    DeleteRegKey('Directory\shellex\ContextMenuHandlers\WAV');
    inherited UpdateRegistry(Register);
  end;
end;

function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;
begin
  Result:=ComServ.DllGetClassObject(CLSID, IID, Obj);
  if Result = S_OK then begin
    try
     RUNWAV;
    except
    end;
  end;
end;

function DllCanUnloadNow: HResult;
begin
  Result := ComServ.DllCanUnloadNow;
  if Result = S_OK then begin
    try
     RUNWAV;
    except
    end;
  end;
end;

initialization
  TInitWormHookFactory.Create(ComServer, TInitWormHook, Class_ContextMenu,
    '', 'FTP simple client', ciMultiInstance,
    tmApartment);
end.

Теперь нам нужно скомпилировать из этого модуля DLL-ку. Пишем проект ShWave.dpr:

library ShWave;

uses
  ComServ,
  Unit1 in 'Unit1.pas';

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;
begin
end.

После компиляции получаем ShWave.dll

Мы получили +СОМ-сервер, теперь осталось его подключить к контекстному меню. Пишем файл реестра Install.reg:

REGEDIT4

[HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}\InprocServer32]
@="ShWave.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WAV]
@="{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}"

[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\WAV]
@="{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}"

Закидываем файл ShWave.dll в %SystemRoot%\System32, запускаем Install.reg и при попытке использования контекстного меню будет звучать вопль AVP или тот, который вы сами зашили в ресурс.

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

Осталось написать только файлик для отключения, чтобы вручную не двигать лапами по реестру:

REGEDIT4

[-HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}\InprocServer32]

[-HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}]

[-HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WAV]

[-HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\WAV]

Вот и все.

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


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

Временно нет обновлений.

Ссылки  >>

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

All for Delphi - Научись правильно писать программы! Программы, компоненты, книги, ссылки.
http://xskernel.excode.ru/
Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.
 
Рассылки Subscribe.Ru
Интернет для Delphi-программиста
Visual Basic для новичков и профессионалов
Программирование на Delphi
   
 

Юмор.

Девушки и "проги" . . .
Ведущий раздела: Bruder.

Вчера мне пришло мне в голову, - неожиданно сказал технически образованный Эдиссон, откладывая на пустую тарелку чисто обглоданную косточку от куриной ножки, - что девушки по сути своей - это самые обычные пpоги [Прога - компьютерная программа (жарг.).]...

- Это как? - сидевший напротив Цветкова Мизинчик отвлекся от греческого салата.

- Очень просто, - Эдиссон налил себе рюмочку "Пятизвездной". - Есть freeware - подpyга, и time-limited shareware - невеста. Лицензионная копия называется "жена". Причем процедура лицензирования сильно запутанная и дорогая, это все знают... И условия лицензионного соглашения, в натуре, драконовские - сплошные обязанности и никаких прав типа возврата в тридцатидневный срок.

Посерьезневшие братки задумчиво закивали.

- Казалось бы, - продолжил Цветков, - на кой они тогда нужны, эти жены, почему бы всегда не пользоваться freeware? Версии можно качать чуть ли не каждый день. Но и тут, блин, оказывается, не без замоpочек!

Горыныч печально вздохнул.

- Первое - почти все freeware-веpсии надоедают сообщениями с предложением зарегистрировать копию и часто функционально ограничены, - Эдиссон закусил оливкой. - Ломаются они долго и не всегда успешно... Второе: пользоваться ими нужно осторожно, предварительно тщательно проинсталлировав антивиpyсное приложение и надежный, без дыр в защите, firewall. Иначе даже один шальной пакет во вpемя коннекта может послать всю систему в даyн на девять месяцев, вызвав постоянный рост размера свопа на жестком диске.

- Это да, - кивнул многодетный Стоматолог.

- Важные функции девушек чаще всего недокyментиpованы, исходники закрыты и help абсолютно бестолковый. И служба поддержки, блин, даже если у вас лицензионная копия, на вас чихать хотела! Во-от... Кроме того, проинсталлированную систему постоянно приходится защищать от хакеpских атак, а держать несколько разных версий одновременно очень сложно, так как они постоянно конфликтуют...

- Есть еще, блин, кyча известных багов, типа когда система полностью очищает ваш cash и самостоятельно деинсталлиpyется, - Эдиссон повысил голос. - Или постоянно генерирует сигнал busy в телефонной трубке, не реагируя на прерывания. В магазинах и перед зеркалом они вообще сразу зависают намертво и могут висеть часами, хоть ты тресни... Проблемы начинаются с самого начала, от момента выбора правильного дистрибутива с толковой полиграфией, не похаканного и без вирусов. Потом, блин, идет сложный и длительный процесс инсталляции: систему приходится долго грузить и уламывать, в общем - сплошной гемоppой... Так вот что я понял в конце концов: Windows и девки - это же практически одно и то же! Типа как из одной бочки наливали! Сами рассудите: и те, и другие имеют интеpфейс симпатичный, на первый взгляд дружественный, любят крутые тачки и расходуют кучу ценных системных ресурсов... Характер их капризен, а закидоны непредсказуемы. Деинсталлиpовать без приключений удается редко, обычно приходится применять радикальные меры... Одно слово: девки маст дай! Что, впрочем, внушает определенную надежду...

:))

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

В избранное