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

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

  Все выпуски  

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


Программирование на DELPHI
Выпуск #75 (22 сентября 2007 г.)

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

Delphi.int.ru

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

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

Сервер: irc.dalnet.ru (либо irc.tic-tac.ru)
Порт: 6667
Канал: #delphiintru

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

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

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

1. Несколько выпусков назад был открыт опрос относительно способа общения типа "чат". К сожалению, число проголосовавших невелико и, можно сказать, "выборы не состоялись". Идея открытия Jabber-конференции пока что уходит на задний план. А вот IRC-канал развивается, но сравнительно медленно. Данные по подключению можно найти чуть левее данного текста. Канал открыт в рамках сети DalNet, но появилась мысль открыть канал и в других сетях (например, RusNet). Стоит ли это делать? Даст ли это приток пользователей? Выскажите своё мнение.

2. Введена в действие RSS-лента основных новостей сайта. Адрес ленты: http://www.delphi.int.ru/rss/site_news.rss. Для чтения можно использовать бесплатную программу FeedReader, либо любой другой клиент. К примеру, тем, кто использует браузер Opera, дополнительное ПО не понадобится - поддержка RSS встроена в этот браузер. Если Вы не знакомы с RSS, прочтите статью об RSS и всё станет понятно. Данная технология используется во всей мировой паутине и очень удобна - чтобы узнавать об обновлениях на сайте, не нужно периодически открывать сайт.

3. Экспертная система Delphi.int.ru Expert продолжает быть верным помощником как начинающим, так и опытным программистам. Более подробную информацию (последние новости, порцию вопросов и ответов) Вы найдёте в соответствующем разделе выпуска.

4. На сайте обновлён раздел F.A.Q. (частозадаваемые вопросы). Размещены ответы на вопросы, связанные с работой на сайте и управлением своей учётной записью. Поэтому, прежде чем отправлять свой вопрос по e-mail, посмотрите, нет ли на него ответа на этой странице.

5. Произведена общая оптимизация страниц сайта и выпусков рассылки. Это значит, что страницы сайта и выпуски рассылки стали "легче" в плане объёма и хорошо совместимы со многими почтовыми клиентами и браузерами.

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

Статистика Delphi.int.ru Expert на 22.09.2007, 12:00 (предыдущий подсчёт - 07.08.2007, 10:00):

Количество экспертов: 58 (+1).
Участниками задано вопросов: 934 (+101).
Экспертами отправлено ответов: 1479 (+124).
Количество сообщений на мини-форумах: 1767 (+179).
Максимальное число разосланных в день писем (за сентябрь '07): 1271 (16.09.2007).
Максимальное число разосланных в день писем (за всю историю): 1820 (30.07.2007, +0).

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

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

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

Количество читателей рассылки (22.09.2007, 12:00):
5510+1383+422= 7315 (+115)

Связь по e-mail:

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


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

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

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

15.09.2007

Изменения в период с 12.09 по 15.09:
∙ Для экспертов добавлено оповещение на e-mail при переходе на более высокий статус;
∙ Усовершенствованы мини-форумы (добавлены образы участников, онлайн-индикаторы, и девизы в качестве подписи к сообщениям);
∙ В нижнюю часть страницы добавлена информация об участниках, находящихся в данный момент на сайте;
∙ Образы участников интегрированы на страницы вопросов.
 

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

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

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

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

 

Вопрос # 281

Раздел: Delphi » Общие вопросы по программированию

Пишу дополнение к вопросу №280, автором которого являюсь я же. Решил разобраться как же записывать этот файл *.dat. Связал переменную ff с физич.файлом, записал в него массив mas, никаких ошибок программа не выдала, всё записалось очень гладко, а когда начал считывать, то он не отображался в диалоге открытия, т.к. стоял фильтр на *.dat, тогда я к имени добавил расширение AssignFile(ff,'Список.dat'); Сохранилось снова прекрасно, а при чтении массива mas из этого файла программа выдаёт ошибку I/O error 103 или Project Proiect2.exe raided exception class EInOutError with message 'I/O error 103'. Process stopped. Use Step or Run to continue. Ответьте пожалуйста, как правильно записывать и считывать файл. С уважением, Сергей Анатольевич.

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 23 января 2007, 18:35
Всего ответов: 2; сообщений в мини-форуме вопроса: 5

 

1. Отвечает эксперт: Виталий Лещенко

Здравствуйте, Полушин Сергей Анатольевич!

1. Если необходимо открыть текстовый файл для чтения, то надо писать:
assignfile(ffile, 'name');
reset(ffile); // <- это важно!!!!

2. Если необходимо открыть текстовый файл для записи, то надо писать:
assignfile(ffile, 'name');
rewrite(ffile); // <- это важно!!!!

3. Если необходимо открыть текстовый файл для дозаписи, то надо писать:
assignfile(ffile, 'name');
append(ffile); // <- это важно!!!!

PS:
Не забывай закрывать файлы.
closefile(ffile);

Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Ответ отправлен: 23 января 2007, 19:19
Оценка за ответ: 1
Комментарий: мне нужно открыть файл *.dat

2. Отвечает эксперт: mvp

Смотрите приложение (две кнопки на форме - обработчик button1 - создаёт типизированный файл, а button2 - читает). Сразу замечу, что record нужно объявлять со словом packed, т. к., если без него, то размер записи будет больше фактической из-за того, что среда будет выравнивать елементы записи по словам, например. Так что, если хотим файл по-меньше, то ставим packed. Во всех файловых ф-ях ещё можно дописать or fmShareDenyNone, чтобы файлы ещё кто-то мог смотреть во время выполнения.
Если используется строка, то должно быть описано именно ShortString, т. к. все другие строки - скрытые указатели и процедуру записи и чтения нужно будет менять.

Пример абстрактный, если хоть немного знакомы с delphi - без труда переделаете под свои нужды

Приложение:

Ответ отправил: mvp (статус: 4-ый класс)
Ответ отправлен: 23 января 2007, 20:11
Оценка за ответ: 4


Вопрос # 282

Раздел: Delphi » Оболочка Delphi, компилятор, версии среды и т.д.

Здравствуйте. Скажите, а есть ли руссификатор Dtlphi7? Если есть, то где можно достать?

Вопрос задала: Тамара (статус: Посетитель)
Вопрос отправлен: 23 января 2007, 19:33
Всего ответов: 4

 

1. Отвечает эксперт: Виталий Лещенко

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

Нет ниодного достойного руссификатора.
Кроме того, лучше его и не искать... пользы от их 0. Лучше подучить английский...

Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Ответ отправлен: 23 января 2007, 20:10

2. Отвечает эксперт: Knjazev

Здравствуйте, Тамара!
Для оболочки D7 нет русификатора. Есть проги, переводящие меню на русский, но чтобы полностью - такого нет. Я лично уже привык к английскому.

Ответ отправил: Knjazev (статус: 3-ий класс)
Ответ отправлен: 23 января 2007, 20:19

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

Раньше я тоже искал русификатор (если быть точнее, я искал украинизатор, так как русский для меня неродной, как не странно.) Я даже перевёл на родной (тобышь украинский) Delphi 3. Но перевести справку оказалось практически невозможно - текста там очень много и автоматические переводчики тут очень плохо помогают. Учите английский. сотни другой слов хватает для того, что бы понимать интерфейс программ, не только Delphi.

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

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

Не смотря на предыдущие ответы, которые я полностью поддерживаю, решил погуглить на предмет сабжа. Вот что я нашёл: http://softok.org/coding/delphi/4837dload.html

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 24 января 2007, 08:26
Оценка за ответ: 5


Вопрос # 283

Раздел: Delphi » Общие вопросы по программированию

Всем Привет!
Скажите как сделать?
Мне надо так:Когда в Edit2 пусто выскакивал
InputBox, но когда Edit2 заполнен InputBox не выскакивал.Желательно пример на два Edit

Приложение:

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

 

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

не совсем понятно, что вы хотите. Если вы хотите, что бы диалог выпрыгивал в момент редактирования (вы удалили текст - диалог выскочил) тогда нужно внести это в обработчик OnKeyUp - этот обработчик сработает когда будет отпущена кнопка. Теперь проверяем на пустоту и выводим диалог. Как именно выводить я вижу вы знаете.

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

2. Отвечает эксперт: Alex Van Glukhman

Я так поагаю что самый оптимальный вариант на событие OnEnter написать следующее
if Edit1.Text='' then
Edit1.Text:=InputBox('Введите строку!','','');
Если иекст есть то вход в компонент не обрабатывается. Удачи!

Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Ответ отправлен: 24 января 2007, 00:23
Оценка за ответ: 5


Вопрос # 284

Раздел: Delphi » Прочее

Подскажите где мне найти RXShell, со страницы скачал mailcheck.zip, а у меня он не компилируеться так как нет компонента RXShell, у меня делфи6 с rxlib275

Вопрос задал: Порядин Ю.Д. (статус: Посетитель)
Вопрос отправлен: 24 января 2007, 09:57
Всего ответов: 1

 

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

У меня тоже есть RxLib 2.75. Там в папке Units есть модуль RxShell.pas. В нём находится компонент TRxTrayIcon.

А не компилится у тебя, наверное, потому, что ты не добавил путь RxLib\Units в список путей поиска модулей компилятором Environment Options/Library.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 25 января 2007, 08:17


Вопрос # 285

Раздел: Delphi » Работа с устройствами и "железом"

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

Вопрос задал: Андрей Сергеевич (статус: Посетитель)
Вопрос отправлен: 24 января 2007, 19:47
Всего ответов: 1

 

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

Не скажу, что это сделать просто, но алгоритм прост и я думаю справитесь. Для начала нужно захватить звук с звуковой карты. Для этого можно кодить напрямую, а можно взять готовые компоненты, которые помогут "оцифровать" звук ACMPack.(брать тут http://www.torry.net/vcl/mmedia/audio/acmcomponents16.zip - всё бесплатно+исходнички.) Для начала рекомендую писать вначале в файл и разбирать потом с файла, а позже нучитесь и налету.
Дальше нам нужно узнать, что такое прямое преобразование Фурье. Это вообщето в курсе математики учат, но нам достаточно знать, что это преобразование преобразует из временного преставления в спектральное. А вот в спектральном представлении DTFM выглядит красиво. DTFM - это комбинация двух частот, поэтому в спектре - это два отсчёта. Причём их положение зависит от частоты. Сами частоты берём отсюдова http://ru.wikipedia.org/wiki/DTMF

А теперь идея декодирования.
Зачитываем с буфера небольшой фрагмент (полсекунды - секунда - подбираем опытным путём)
Делаем преобразования фурье
Ищем пики на интересующих нас частотах (Полосок вы не получите, а будет что то похожее на "верблюда" + частота может немного уплывать, не забывайте об этом)
выписываем их. Если получили больше 2 частот - значит произошло переключение и мы на него попали. Эсли постоянно попадаем - уменьшаем интервал.
Всё, осталось только записать.

Ответ отправил: Вадим К (статус: Бакалавр)
Ответ отправлен: 24 января 2007, 20:15


Вопрос # 286

Раздел: Delphi » Взаимодействие с Windows

Возможно ли встроить своё приложение в оболочку EXPLORER'а, чтобы получилось нечто вроде "Панели управления", "Принтеры и факсы" или "Сетевые подключения"?

Вопрос задал: Иван (статус: Посетитель)
Вопрос отправлен: 27 января 2007, 22:41
Всего ответов: 1; сообщений в мини-форуме вопроса: 3

 

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

Если хочеться на панель управления свою прогу "запхать", то здесь нет ничего сложно - делаем exe файл по определённым правилам. А расширение даём cpl и бросаем в Windows\System32. Конечно в борланде ребята постарались и сделали готовых мастеров для нас. Называется Control Panel Application. В демках есть пример. Если умеете запрограммировать свою идею, то проблем не будет.

А вот если хотите сделать свою панель управления (так любят делать программы для работы с мобилками - предостваляют доступ к телефонной книге и сообщениям). Это тоже можно. Называется "расширения проводника". В данном случае нужно создание виртуального каталога, тобыш папки.
Об этом читаем здесь http://www.akzhan.midi.ru/devcorner/articles/Windows-Shell-Namespace-Extension.html. Но предупреждаю сразу, здесь не всё так просто

Ответ отправил: Вадим К (статус: Бакалавр)
Ответ отправлен: 28 января 2007, 01:42
Оценка за ответ: 4


Вопрос # 287

Раздел: Delphi » Прочее

подскажите кто-нибудь где взять компонент DelphiX для Delphi7

Вопрос задал: Dmitry Sergeevich (статус: Посетитель)
Вопрос отправлен: 28 января 2007, 14:20
Всего ответов: 1

 

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

Смотрим сюда и думаем
http://www.torry.net/quicksearchd.php?String=DelphiX&Title=Yes

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


Вопрос # 288

Раздел: Delphi » Прочее

Здравствуйте, уважаемые эксперты!
На форме присутствует компонент OpenDialog1, каким образом открывать только текущий каталог, в котором находиться ваша программа. И ещё, объясните различия в изображении вещественных чисел для типов преобразования(ffGeneral, ffExponent, ffFixed и ещё четвёртый, забыл что-то).
Заранее спасибо.

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 28 января 2007, 20:12
Всего ответов: 2

 

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

С OpenDialog'ом всё предельно просто. Перед его показом добавляем такие строки
//указываем, с какого каталога начать
OpenDialog1.InitialDir:=ExtractFileDir(Application.ExeName);
//должно запретить изменять текущий каталог
OpenDialog1.Options:=OpenDialog1.Options+[ofNoChangeDir];

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

Ответ отправил: Вадим К (статус: Бакалавр)
Ответ отправлен: 28 января 2007, 21:45
Оценка за ответ: 5

2. Отвечает эксперт: Knjazev

Здравствуйте, Полушин Сергей Анатольевич!
//будет открыт каталог
OpenDialog1.InitialDir:=ExtractFileDir(ParamStr(0));
//запрет изменения каталога
OpenDialog1.Options:=OpenDialog1.Options+[ofNoChangeDir];
По-поводу второй части вопроса см. Delphi-help. И вообще почаще заглядывай - пригодится

Ответ отправил: Knjazev (статус: 3-ий класс)
Ответ отправлен: 29 января 2007, 19:44
Оценка за ответ: 4


Вопрос # 289

Раздел: Delphi » Общие вопросы по программированию

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

Вопрос задал: Илья Бабаков (статус: Посетитель)
Вопрос отправлен: 29 января 2007, 06:03
Всего ответов: 1; сообщений в мини-форуме вопроса: 8

 

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

1) В файле твой_проект.dpr напиши перед Application.Run:
if InputBox('Пароль', 'Введи пароль', '') = Password
then Application.Run;

Примечание: лучше сделать своё окно вместо InputBox(), для ввода пароля юзать TEdit при его PasswordChar:= '*'.

2) Для изменения пароля делаешь форму, на ней 3 TEdit: для старого пароля, нового пароля и его подтвержения, все при PasswordChar:= '*'; Для вызова этого диалога надо предусмотреть, например, соответствующий пунтк меню.

3) Где хранить и как шифровать пароли - выбирай сам, вариантов много.

4) Могу написать простенький пример.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 29 января 2007, 08:36
Оценка за ответ: 4


Вопрос # 290

Раздел: Delphi » Алгоритмы, преобразования

Добрый день, господа!
Уже однажды получив помощь от экспертов, хочу попросить помощь по такому вопросу. Для работы загружаю данные из Excel-таблиц (аж 18 штук!) в соответствующие StringGrid'ы.
Не придумав другого, для удобства обращения в дальнейшем, пересохраняю все содержимое в многомерный массив (5-ти мерный). Как мне теперь освободиться в памяти от таблиц и можно ли убрать StringGrid'ы из программы? Заранее благодарен всем, кто откликнется в этот ранний час.

Вопрос задал: Драганов Василий Михайлович (статус: Посетитель)
Вопрос отправлен: 01 февраля 2007, 07:35
Всего ответов: 2; сообщений в мини-форуме вопроса: 4

 

1. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, Драганов Василий Михайлович!
Непонятно как вы загружаете данные из Excel.
Я представил себе это так:
1. Создаем экземпляр Excel.
2. Открываем нужный файл
3. Перегружаем данные в StringGrid
4. Перегружаем данные в массив.

А почему бы не выбросить пункт 3 и грузить данные прямо в массив из Excel? От этого, ИХМО, не изменяется конечный результат, но от StringGrid'ов избавляемся полностью.
И добавим пару пунктиков
5. Закрываем файл в Excel
6. Уничтожаем экземпляр Excel.

Это при подходе с использованием массива. Но я бы порекоммендовал грузить данные не в массив, а в простейшую базу данных. Но это, как говорится, совсем другая история ;)

Ответ отправил: Иусов Сергей Ник. (статус: 2-ой класс)
Ответ отправлен: 1 февраля 2007, 07:47
Оценка за ответ: 5
Комментарий: Большое спасибо!

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

Добавлю к предыдущему ответу слудующее.
База - это класно, но если данные постоянно обновляются и меняются, то смысла писать в базу не вижу. Хотя, если человек хорошо с sql дружит, то в это случае скорость разработки программы возрастает в разы.

И второе. С Excel'я можно импортировать как поячеечно, так и сразу целым массивом (тобыш весь лист сразу в массив). Так вот, запрос одной ячейки чуточку быстрее, чем сразу всего массива. Если вы запрашиваете 10 ячеек, то запрос "массивом" будет работать с такой же скоростью, как и запрос одной ячейки, а поячеечный - в 10 раз медленее. Возможно, вы скажете, если я буду захватывать прямоугольны массив, то там будет несколько ячеек, которые я не использую - ничего, десяток лишних неиспользуемых байт в нашем случае лучше, чем медленая работа.

Ответ отправил: Вадим К (статус: Бакалавр)
Ответ отправлен: 1 февраля 2007, 11:47
Оценка за ответ: 4


Вопрос # 291

Раздел: Delphi » Графика (2D и 3D) в приложениях

Можно ли создать avi файл на delphi.
Слышал что можно конвертировать bmp файл на avi. А как можно создать bmp файл.

Вопрос задал: Shamsnsurov Jamshid (статус: Посетитель)
Вопрос отправлен: 01 февраля 2007, 09:07
Всего ответов: 1

 

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

Так вопрос состоит в том, как создать bmp файл?
Это придельно просто
var bmp:TBitmap;
....
bmp:=TBitmap.create;
bmp.width:=100;
bmp.height:=100;
bmp.canvas.moveto(0,0);
bmp.canvas.lineto(99,99);
bmp.SaveToFile('x.bmp');
bmp.free;

Можно ли создать avi файл - конечно можно. Ведь avi файл - это последовательность (определённая, конечно) байт. А кто нам мешает её сгенерить? Только незнание самой последовательности. Но для этого есть стандарты и сторонные библиотеки. Хорошо на этом поприще поработала наша "любимая" Microsoft. Она создала в рамках DirectX несколько функций (ну не совсем функций :) ) для этого.
Перейдя по ссылкам ниже, вы найдёте, как сделать обратное, а там уже и до прямого недалеко.
http://www.delphiworld.narod.ru/base\get_avi_frame.html
http://www.delphiworld.narod.ru/base\sound_files_info.html
http://www.delphiworld.narod.ru/base\avi_info2.html

Ответ отправил: Вадим К (статус: Бакалавр)
Ответ отправлен: 1 февраля 2007, 12:00


Вопрос # 292

Раздел: Delphi » Работа с компонентами и библиотеками

Здравствуйте. На заочном обечении был задан вопррос:Запишите выражение, которое обеспечит выборку при открытии диалога только требуемого типа файлов – текстового или на языке Object Pascal, я знаю что через Filter у OpenDialog1 это можно сделать, а что за выражение записать надо, я не понял.

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 01 февраля 2007, 17:47
Всего ответов: 1

 

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

Выражение должно быть такого содержания:

OpenDialog1.Filter:='Text files (*.txt)|*.txt|Object Pascal files (*.pas)|*.pas';

Таким образом у Вас будет создано два фильтра (*.txt и *.pas).

Как видно из примера что подпись к фильтру и маска фильтра разделены вертикальной чертой "|".

Чтобы задать номер фильтра по умолчанию нужно выполнить такую команду:

OpenDialog1.FilterIndex:=2;

Тоесть если задать фильтр из предыдущего примера, то текущим будет фильтр с номером 2 (*.pas) (нумерация начинается с единицы).

Good Luck!!!

Ответ отправил: Николай Рубан (статус: 5-ый класс)
Ответ отправлен: 1 февраля 2007, 18:28
Оценка за ответ: 5


Вопрос # 293

Раздел: Delphi » Работа с компонентами и библиотеками

Здравствуйте. На форме присутствует компонент ComboBox1, мне задали такие вопросы:
1)Найдите свойство для этого компонента, которое позволяет при нажатии на кнопку компонента увидеть весь список слов и выбрать нужное слово;
2)У компонента ТComboBox есть кнопка. Найдите свойство компонента, которое позволит сделать высоту кнопки равной высоте окна компонента;
3)Найдите свойство у компонента, которое сохраняет количество значений в списке;
4)Для решения задачи вам нужно будет уметь определять выбранное вами слово. Какое свойство компонента содержит номер выбранного слова и каково начальное значение этого свойства?

И ещё вопрос, связанный с OpenDialog1, как можно вывести каталог анализируемого файла в, скажем, в Edit1.

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 01 февраля 2007, 17:52
Всего ответов: 2

 

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

1) ComboBox1.Style:=csOwnerDrawFixed;
2) не совсем понятно задание........
3) ShowMessage(inttostr(ComboBox1.Items.Count)); - выводит диалоговое окно в котором написано количество элементов, соответственно нужное свойство это: ComboBox1.Items.Count;
4) ComboBox1.ItemIndex - номер выбранного, начальное значение этого свойства равно "-1";

Последние:
Edit1.Text:=OpenDialog1.FileName;

Good Luck!!!

Ответ отправил: Николай Рубан (статус: 5-ый класс)
Ответ отправлен: 1 февраля 2007, 18:15
Оценка за ответ: 4

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

По поводу второго вопроса. Возможно так
Button1.height:=Combobox1.height;
Обычнымы методами высота (Combobox1.height) не меняется. Для этого нужно установить свойство style="csOwnerDrawFixed," но прийдётся написать обработку прориствки каждого элемента самостоятельно
Послееднее решается так
Edit1.text:=ExtractFileDir(OpenDialog1.filename);

Ответ отправил: Вадим К (статус: Бакалавр)
Ответ отправлен: 1 февраля 2007, 23:37
Оценка за ответ: 4


Обучение Delphi

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

11. События
12. Функции и процедуры. Математические вычисления. Случайные числа
13. Ввод и вывод

Выбор (ветвления)

Автор:
© Ерёмин А.А., 2007
Машинная программа выполняет то, что вы ей приказали делать, а не то, что бы вы хотели, чтобы она делала.
Номер урока:
14
 

Предисловие

Большинство примеров, которые были рассмотрены в предыдущих уроках, являлись программами с линейной структурой. Программы с линейной структурой являются простейшими и используются, как правило, для реализации обычных вычислений по формулам (или других аналогичных задач, назначение которых - последовательное выполнение некоторых команд). Основная характеристика линейных алгоритмов - инструкции выполняются последовательно, одна за другой.
Но линейных алгоритмов, как правило, недостаточно для реализации какой-то более сложной задачи. К примеру, требуется программа, запрашивающая у пользователя 2 числа и вычисляющая их частное (т.е. выполняющая деление одного числа на другое). Всё бы ничего, но если второе число будет нулём? В результате выполнения деления возникнет ошибка и программа экстренно закончит свою работу. Как же быть? В этом случае нужен другой алгоритм - алгоритм с ветвлениями.
Ветвления (выбор) используются для выбора одного из нескольких направлений дальнейшего хода программы. Для нашего примера перед делением будет выбор из двух направлений - если исходные данные верны (т.е. второе число - не 0), то выполняется деление и выдаётся результат; но если второе число - 0, то деление выполнено не будет, а взамен, к примеру, пользователю будет выдано сообщение об ошибке.
Мы рассмотрим два типа ветвления - с помощью условного оператора и оператора выбора.

1. Условный оператор

Условный оператор, который называется IF (англ. "если") используется для выбора одного из двух направлений хода программы. Выбор последовательности инструкций осуществляется во время выполнения программы в зависимости от выполнения условия.

Общий синтаксис условного оператора IF:

if {условие} then
  {последовательность команд}

THEN - англ. "в таком случае, тогда". Таким образом, строка вполне переводима и на русский язык: "Если условие выполняется, тогда сделать что-то..."

Здесь условие - выражение логического типа (логические выражения были рассмотрены нами ранее в уроке №10). Если выражение является истинным (True), т.е. условие выполняется, то выполняется последовательность команд, указанная после THEN. Если же условие не выполняется, данный блок пропускается. В случае, если команд, ассоциированных с условием, несколько, то они заключаются в BEGIN ... END:

if {условие} then
begin
  Команда 1;
  Команда 2;
  Команда 3
end;

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

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

if {условие} then
  {команды, если условие выполняется}
else
  {команды, если условие не выполняется}

ELSE - англ. "иначе, в противном случае": "Если условие выполняется, то сделать что-то, а в противном случае сделать что-то другое".
Аналогично, если требуется выполнить несколько команд, они заключаются в BEGIN ... END:

if {условие} then
begin
  {...}
  {команды, если условие выполняется}
  {...}
else
begin
  {...}
  {команды, если условие не выполняется}
  {...}
end;

Пример.

В качестве примера создадим программу расчёта сопротивления электрической цепи, состоящей из двух сопротивлений. Предоставим возможность выбора типа соединения - последовательное или параллельное.
Для начала создадим интерфейс. Разместим на форме 2 поля TEdit для ввода величин сопротивлений (Edit1, Edit2). Для выбора типа соединения разместим 2 TRadioButton с соответствующими надписями (RadioButton1, RadioButton2). Результат будем выводить в TLabel (Label1), а вычисления будем производить при нажатии на кнопку TButton (Button1). Получиться должно примерно следующее:

Интерфейс программы для расчёта сопротивления цепи

Далее дважды щёлкаем по кнопке и пишем обработчик.

procedure TForm1.Button1Click(Sender: TObject);
var R1,R2,R: Real;
begin
  R1:=StrToFloat(Edit1.Text);
  R2:=StrToFloat(Edit2.Text);
  if RadioButton1.Checked then
    R:=R1+R2
  else
    R:=(R1*R2)/(R1+R2);
  Label1.Caption:='Сопротивление цепи: '+FloatToStr(RoundTo(R,-2))+' Ом';
end;

Комментарии и пояснения:

1) В качестве исходных данных имеются 2 сопротивления - R1 и R2. Результирующее сопротивление - R. Для всех трёх переменных указан вещественный тип данных (Real), т.к. значения сопротивлений могут быть дробными числами.
2) Сначала мы заносим в переменные R1 и R2 числа, введённые в Edit1 и Edit2.
3) Далее мы применяем условный оператор, чтобы узнать, какой из двух TRadioButton выделен. Если выделен первый, то применяем формулу последовательного сопротивления (сумму): R = R1 + R2. Проверять, выделен ли второй, смысла нет, так как их всего 2 - если не выделен первый, значит выделен второй. Для параллельного сопротивления формула следующая: R = (R1 * R2) / (R1 + R2). Таким образом, в зависимости от выбранного типа соединения значение переменной R будет вычислено по соответстующей формуле.
4) Наконец, выполняется вывод результата в Label1. В приведённом коде использована функция RoundTo(). Эта функция округляет вещественное число до указанного знака после запятой. В данном случае округление ведётся до двух цифр. Это сделано для того, чтобы в Label1 не попал весь длинный ряд чисел после запятой, а попали все первые две цифры. Функция RoundTo() описана в модуле Math, с которым мы однажды работали. Этот модуль необходимо подключить, добавив его имя в uses (см. в самом начале модуля в редакторе кода):

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

Запустим программу и проверим её работспособность.

Примечание: в примерах, показанных в данном уроке, фигурные скобки ("{" и "}") указаны всего лишь для удобства обозначения, что в конкретном месте кода программы должно что-то находиться - переменная, набор команд и т.д. В коде реальной программы данных скобок быть не должно!

2. Оператор выбора

Оператор выбора, который называется CASE, используется для выбора одного из нескольких направлений дальнейшего хода программы. Выбор последовательности инструкций осуществляется во время выполнения программы в зависимости от равенства значения переменной-селектора константе, указанной перед группой инструкций. В качестве переменной-селектора можно использовать переменную только перечислимого типа. Целое число (Integer) - перечислимый тип данных. Другим простым перечислимым типом данных является символьный тип (Char). Синтаксис оператора CASE:

case {переменная-селектор} of
  {константа_1}: {инструкции 1}
  {константа_2}: {инструкции 2}
  {...}
  else {инструкции, если ни одна константа не подошла}
end;

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

case a of
  1,2,3,4,5: {...}
  else {...}
end;

case a of
  1..5: {...}
  else {...}
end;

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

Пример программы с использованием оператора выбора.

Создадим программу, которая будет запрашивать ввод числа от 1 до 12 и выводить название времени года, которому принадлежит месяц с указанным номером.

Интерфейс прост: поле ввода (Edit1) и кнопка (Button1).

Обработчик кнопки таков:

procedure TForm1.Button1Click(Sender: TObject);
var Month: Integer;
begin
  Month:=StrToInt(Edit1.Text);
  case Month of
    1,2,12: ShowMessage('Зима');
    3..5: ShowMessage('Весна');
    6..8: ShowMessage('Лето');
    9..11: ShowMessage('Осень')
    else ShowMessage('Число должно быть от 1 до 12.')
  end
end;

Результат работы:

Результат работы программы

Данный пример довольно прост и в пояснениях, скорее всего, не нуждается.

Заключение

Условный оператор IF и оператор выбора CASE позволяют создавать ветвления в программах, т.е. выполнять различные действия в зависимости от заданного условия. Отличие их друг от друга состоит в том, что IF используется для единственного выбора, а CASE - для множественного. Очевидно, что данные операторы могут быть вложены друг в друга (например, в одном из блоков оператора CASE может быть использован IF). При написании какой-либо сравнительно сложной программы без ветвлений не обойтись.


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

Статьи

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

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

О костылях

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

Вступление

Часто бывает, что программу сдать нужно вчера, а вы нашли глюк и никак не можете справиться с ним. Мало того, вы не можете отследить зависимость, когда он появляется. Сегодня мы поговорим о том, как отлавливаются такие глюки, как бороться и побеждать их. Конечно, руководство не претендует на универсальное решение, но немного развеет боязнь.

Итак. Исходные условия. Программа компилируется, и возможно не только запускается, а и делает то, что планировалось. Но выкидывает случайные ошибки. Или хуже, даже не запускается. Как узнать, где и почему?

Способ первый. Лог файл.

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

procedure AddToLog(s:string);
var
fn:string;
F:TextFile;
begin
  Fn:=ExtractFilePath(ParamStr(0))+'log.txt';
  assignFile(f,fn);
if FileExists(fn) then Append(f) else Rewrite(f);
  Writeln(f,s);
  Flush(f);
  Closefile(f);
end;

Многие скажут, можно вынести создание и закрытие в отдельные процедуры и вызывать их в начале работы программы и в конце. И что код жуть неоптимальный…

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

Writeln(f,DataTimeToStr(Now));
Writeln(f,s);

Теперь у меня в логе было ещё и время, когда произошло событие. Сколько нервов сохранила эта процедура мне…

Что же писать в лог? Писать слишком много – плохо, не разберёшься потом с километрами логов. Писать мало – слишком расплывчато будет.

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

procedure SameFoo(a:integer; b:double);
begin
AddToLog(format(‘unit1,sameFoo, a=%d, b=%f’,[a,b]));

Функция Format позволяет сделать код более компактным и не писать долгие IntToStr и FloatToStr. Теперь, просмотрев лог программы, по последней строке можно сделать вывод, где именно она падает. А так как «стек вызовов» тоже виден (то есть последовательность, кто кого вызывал) то можно и отследить, кто отослал неверный параметр.

Один раз я наткнулся на то, что одна моя процедура время от времени выдавала ошибку, но принести отладчик мне было нереально (в силу многих независимых от меня причин), но к офису было близко :-) Параметры, которые передавались в процедуру, мне тоже ни о чём не говорили. Решение было простым. Через каждые две-три строки я вставил вызов записи в лог с указанием номера строки и некоторых параметров. После просмотра лога я уже видел строку, где происходит ошибка :-) Итого я потратил больше времени на компиляцию, чем на хождение.

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

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

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

Также эта процедура поможет в отладке сервисов, кода в dll. Есть только одно ограничение – она не может корректно работать в многопоточных приложениях. То есть нельзя вызывать из двух потоков одновременно. Но критические секции помогут. Достаточно добавить ещё пару строк и одну переменную типа TCriticalSection (объявлена в SyncObjs).

Способ второй. Используем специальную API-функцию.

Было бы удивительно, если бы разработчики ОС Windows не предусмотрели специальной функции для ведения лога. И такая есть! Главное уметь правильно ей пользоваться.

Называется она OutputDebugString. Как понятно из названия, она выводит переданную ей строку в лог. Так как параметр имеет тип PAnsiChar, то просто так передать строку не получается. Ничего, напишем обёртку.

procedure ODS(s:string);
begin
OutputDebugString(PAnsiChar(s));
end;

Или каждый раз придётся писать приведение типов.

Вставим в код любой программы и запустим её. Процедура скомпилировалась и даже выполняется, но визуально никак не видно последствий её работы. В папке с проектом никаких новых файлов не появилось. Где же искать лог? Если вы запускаете программу из-под отладчика (коим Delphi тоже является), то она самостоятельно перехватывает это сообщение. Посмотреть вывод можно, вызвав соответствующее окно среды (View -> Debug Window -> Event log, Ctrl+Alt+V). Delphi старается и туда попадают дополнительные сообщения о загруженных библиотеках и многое другое? и всё это можно настроить в соответствующем окне (для Delphi 7: Tools->Debugger options - > EventLog, Для 2005 и старше: Tools-> Options). В дереве слева выбираем Debugger options – Event log. А там уже играемся галочками. Скажу только что галочку Windows Message нужно ставить в исключительных случаях, иначе лог будет завален информацией о сообщениях Windows, и разобраться в тысячах строк будет очень сложно.

Ок. Это хорошо. Без отладчика ничего не видно, да и производительность вроде не страдает. А что делать, если у заказчика начали происходить странности в поведении программы, а нести к нему Delphi невозможно (заказчик может быть за сотни километров от вас)?

Тут нас спасёт утилита от Руссиновича. Качаем её с его сайта, который после покупки его компании переехал на сайт Microsoft. Последний раз её видели здесь: http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx :-) Утилита маленькая (301 Кб в архиве), предельно простая и бесплатная. Запускается без инсталляции. Будучи запущенной, начинает перехватывать сообщения от нашей программы (и не только от неё). Замечено, что многие программы пользуются этой возможностью, например Emule, так что будьте готовы настраивать фильтры в программе).

Окно DebugView

Сообщения можно сохранить в текстовый файл, который потом хорошо загружается Excel'ем как CSV файл. И, применив автофильтр, выбираем интересующие нас сообщения. Пищи для размышления программа выдает предостаточно, так что запасайтесь кофе :-)

Способ три. Проверяться и проверяться.

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

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

Assert(x<>0,'почему это x равен нулю?');

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

Использование утверждений

Очень удобно то, что это сообщение перехватывается с помощью блока try .. except. А соединив наш первый способ с этим, получаем очень удобный инструмент. Произошло исключение – в файл его. Только помните, что во многих случаях, раз уж произошло сообщение, то нужно подумать, а стоит ли продолжать выполнять процедуру? Итак, улучшенный вариант использования нашей процедуры выглядит так

var x:integer;
  begin
x :=0;
try
Assert(x <> 0,'Почему это x равен нулю?');
  except
    on E:Exception do AddToLog(e.Message);
  end;
end;

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

Для этого ставим на главную форму нашего приложения компонент ApplicationEvents, взятый с вкладки Additional. Свойств у этого компонента мало (имя и Tag), зато событий много. И все эти события связаны с приложением в целом. Нас интересует событие OnException. Его второй параметр содержит собственно само исключение и в простейшем случае обработка может быть сведена до AddToLog(e.Message);

О бедных dll замолвите слово

Часто приходится отлаживать код не только в основном приложении, но параллельно и в нескольких dll. И тут неискушённого программиста подстерегает множество неожиданностей. Первая и самая большая заключается в том, что если в обычном приложении все обработчики событий (нажатия на кнопку, к примеру) завёрнуты в невидимые try ... except и исключение, возникшее в процедуре, за её пределы не выходит, а вы получаете сообщение об ошибке, то в dll всё не так. Там никто таким образом вас не контролирует. Поэтому не ленитесь добавлять к коду обработку исключений. Подобное касается и потоков (TThread). Только в них всё еще интересней. Если происходит необработанное исключение, то поток умирает без каких-либо предупреждений. То есть, поделили нечаянно на ноль - и всё, поток умер. Об этом многие не знают и жалуются, что потоки мрут как мухи, процедура Terminate не выполняется и проконтролировать никак не могут…

Альтернативное средство: Jedi Code Library

Если у вас установлена эта чудесная библиотека, то можно сделать обработку ошибок более простой. Для этого нужно сделать следующее. Вначале подключить отладочную информация к выполнимому файлу. Для этого выбираем пункт Project - Insert JCL Debug data.

Jedi Code Library в меню

Теперь нужно только создать окно для отображения ошибок. В последних версиях библиотеки была добавлена в репозитарий готовая форма, которую просто нужно создать (File – New – Delphi Files – Jcl Exception dialog for Delphi). В появившемся мастере заполняем параметры, и, вуаля, у нас есть даже отсылка сообщений на электронную почту!

Самое удобное, что не нужно больше писать никакого кода. При возникновении ошибки появится диалог, в котором будет приведён стёк вызовов. Более подробно об особенностях использования этого диалога можно почитать здесь: http://rsdn.ru/article/Delphi/DelphiJCL.xml.

Большими плюсами этого средства являются:

  • Бесплатность и открытость;
  • Возможность изменять поведение в больших пределах;
  • Сам Borland/CodeGear пользуется этим средством в BDS 2006 и BDS 2007.

Недостаток – увеличение объема кода где-то на 30-50% за счёт включения отладочной инфомации.

Альтернативное средство: MadException

Это не просто эксперт или набор файлов. Это целая студия для отлова исключений. И хотя для коммерческого использования она платна, для себя её можно использовать свободно. На сайте данного средства (http://www.madshi.net/madExceptDescription.htm) есть даже видеоролики по его использованию, так что даже у неанглоязычных людей проблем почти не возникает.

Вот такое окошко появляется, когда в приложении происходит исключение.

MadException

Если нажать на «Show bug report», то можно увидеть столько информации, что некоторые пользователи, наверное, не разрешат её отправку. Тут собрана всё подноготная, начиная с вашего приложения (где находится выполнимый файл, сколько памяти потратил), и завершая подробностями операционной системы (список процессов, список текущего установленного оборудования). Всё очень гибко настраивается, так что особых проблем не должно возникнуть. К тому же, есть возможность писать плагины, так что если какая-то информация не попала в лог, можно поправить это дело.

Основное преимущество, оно же и недостаток – слишком много информации собирает. Каждый делает свои выводы.

Альтернативное средство: EurekaLog

И ещё одно, на этот раз полностью платное решение. Оно также обладает широкими возможностями (не знаю, намного ли опережает MadException). Основная особенность, которую я заметил - это то, что когда вы видите трассировку стёка исключений, то сделав двойной клик, можно открыть данный файл в нужной строке. Но зачем на клиентской машине такая возможность?

Также есть возможность контролировать утечки памяти (правда за счёт падения производительности в 5 раз), контролировать попытки модификации кода. Если заинтересовало - смотрим здесь.

EurekaLog

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

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

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

Название
Описание
Раздел
Объём
Ссылки
Blink Component
Компоненты WinControl с мигающей рамкой вокруг.
247 Кб
Adjustor
Наверняка вы когда-либо использовали элемент TUpDown в связке с текстовым полем, чтобы создать поле с изменяющимся числовым значением... TAdjustor - более хороший вариант. Имеются два варианта изменения счётчика - "грубые" переходы и точное указание значения. Иными словами, этот компонент более удобный, чем TUpDown.
235 Кб
WideStrings
Класс, аналогичный TStrings, но позволяющий хранить строки типа WideString.
2 Кб
HardDiskDetect
Пример, показывающий, как определить информацию о жёстких дисках (без использования GetVolumeInformation). Данный код позволяет определить:
- Номер модели;
- Серийный номер диска;
- Информацию о контроллере;
- Размер буфера контроллера;
- Тип диска;
- Физическую информацию (цилиндры, головки, сектора).
14 Кб
TRecList
Класс TRecList предназначен для быстрой и удобной работы со списками.
9 Кб
Звёздный час
Игра, написанная по сценарию телепередачи ОРТ "Звездный час". Программа написана на Delphi 3.0.
131 Кб
 
Всего новых файлов: 6  
0.62 Мб
 
 

Юмор

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

Чайник, который закипел...

Джордж Бадрейн

Вообще-то я не тормоз, просто долго думаю..., когда особенно есть над чем, или о чем ? Вообщем есть у меня друган один - программист по каким-то Сям, иногда он себя обзывает сисадмином - это ж надо придумать! И уговорил он как -то купить меня компьютер под псевдонимом комп под другим псевдонимом пентиум третий или просто пень тройной, ну это его слова, я таких-то и не знаю даже. Ну значит купил я его. Все как надо мне друган сделал, окошки поставил 2000, сказал, что проблема 2000 решена и "проверено - вирусов нет". А я спросил, а проблема 10000 решена? Он сказал, что не доживешь. Но я все равно беспокоюсь маленько. Ну ладно, подключился я к паутине какой-то, картинки там интересные сайты называются. Все путем шло примерно месяц, как раз я всех вартоксов изничтожил , но с пацаном как-то неудобно получилось... Вообщем, проснулся я как-то с утра по-московскому, солнце светит, мужики на обед пошли, хорошо так стало, и включил свой пень. А он, подлец, вроде включился, но как -то не так. Верещит что-то не поймешь. Я в машинном языке не рублю. На экране картинок даже нет - чернота сплошная. Ай-яй-яй думаю, висит кажись. Ну жму как обычно красненькую кнопку, а оттуда вылазит что-то махонькое, наглое, и шмыг обратно. - Гремлины ! - подумал я как обычно матом. - Они во всем виноваты!

Тут из щелки в компе вылез еще один гремлин. Он был толстый и смахивал на крупного таракана. - Фу, мерзость! Тут я понял, что гремлины это сказка, а лазят там вирусы компьютерные. Надо антивирус взять поновее - решил я. Антивирусы водились в сети, как кто-то мне сказал. Я думал, а комп что-то верещал и временами пикал, ругался наверное. Где ж взять сеть то? Е-мое! Сеть была у меня на кухне - конечно это была авоська, но попробовать стоило. Я сунул туда руку, запустил ее на поиск и стал ждать коннекта. Коннект не заставил себя ждать и вывалил несколько объектов. Это были почему-то тараканья отрава, гнилой огурец и пустая литровая банка. Что сие значило наверное не догадался бы самый продвиннутый юзер - это зверь такой немного умный. Я решил действовать в режиме RND, режим выдал мне гнилой огурец. Антивирус - радостно подумал я - Касперского может быть. Я побежал к устало пищавшему компу и влямзил антивирус в дискодав (или дисковод?). Комп негодующе взревел и на экран выползла надп ись: Boot sector on floppy failure... Кажись не тот антивирус - подумал я, - несовместимый. Осталась отрава и банка. Банка в дискодав не влезет, разве что виртуальная, а где ж ее взять? Осталась отрава "Машенька". Я трудолюбиво растер ее в мелкую труху и всыпал в щелку дискодава. Комп пикал , но не ревел. Процесс пошел - подумал я удовлетворенно. Через несколько минут (долго для третьего пентиума то!) вирусы посыпались из компа целым стадом. И все как один похожи на тараканов! Тут и банка сгодилась, насобирал я их полный литр с горкой и плотно закрыл крышкой, хотя те и сопротивлялись. Ни хрена себе они размножились-то ! Давно антивирусы не апгрейдил. Я с чувством выполненного долга тыкнул красненькую кнопочку, и тут заметил, что клава (борда которая, а не шифер) не подключена к вертикально стоящему белому ящику, я это исправил.
Вообщем излечил я свой компьютер , самостоятельно причем, от очень наверное опасных вирусов, завтра другану банку покажу, пусть их декомпильнет. То-то он обрадуется ! А еще чайником называл...

:))

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




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


В избранное