Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Сентябрь 2007 → | ||||||
1
|
2
|
|||||
---|---|---|---|---|---|---|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
23
|
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
Статистика
-1 за неделю
Программирование на Delphi (выпуск 75)
Программирование на DELPHI
Выпуск #75 (22 сентября 2007 г.)
Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки.
Delphi.int.ru Expert Последние новости
Архив: вопросы и ответы В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 281 - 295. Вопросы, на которые не было дано ни одного ответа, не публикуются. Статистика по выпуску: Кол-во вопросов: 13 Вопрос # 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. Ответьте пожалуйста, как правильно записывать и считывать файл. С уважением, Сергей Анатольевич. Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель) 1. Отвечает эксперт: Виталий Лещенко Здравствуйте, Полушин Сергей Анатольевич! Ответ отправил: Виталий Лещенко (статус: 4-ый класс) 2. Отвечает эксперт: mvp Смотрите приложение (две кнопки на форме - обработчик button1 - создаёт типизированный файл, а button2 - читает). Сразу замечу, что record нужно объявлять со словом packed, т. к., если без него, то размер записи будет больше фактической из-за того, что среда будет выравнивать елементы записи по словам, например. Так что, если хотим файл по-меньше, то ставим packed. Во всех файловых ф-ях ещё можно дописать or fmShareDenyNone, чтобы файлы ещё кто-то мог смотреть во время выполнения. Приложение:
Ответ отправил: mvp (статус: 4-ый класс) Вопрос # 282 Раздел: Delphi » Оболочка Delphi, компилятор, версии среды и т.д. Здравствуйте. Скажите, а есть ли руссификатор Dtlphi7? Если есть, то где можно достать? Вопрос задала: Тамара (статус: Посетитель) 1. Отвечает эксперт: Виталий Лещенко Здравствуйте, Тамара! Ответ отправил: Виталий Лещенко (статус: 4-ый класс) 2. Отвечает эксперт: Knjazev Здравствуйте, Тамара! Ответ отправил: Knjazev (статус: 3-ий класс) 3. Отвечает эксперт: Вадим К Раньше я тоже искал русификатор (если быть точнее, я искал украинизатор, так как русский для меня неродной, как не странно.) Я даже перевёл на родной (тобышь украинский) Delphi 3. Но перевести справку оказалось практически невозможно - текста там очень много и автоматические переводчики тут очень плохо помогают. Учите английский. сотни другой слов хватает для того, что бы понимать интерфейс программ, не только Delphi. Ответ отправил: Вадим К (статус: Бакалавр) 4. Отвечает эксперт: min@y™ Не смотря на предыдущие ответы, которые я полностью поддерживаю, решил погуглить на предмет сабжа. Вот что я нашёл: http://softok.org/coding/delphi/4837dload.html Ответ отправил: min@y™ (статус: Студент) Вопрос # 283 Раздел: Delphi » Общие вопросы по программированию Всем Привет! Приложение: Вопрос задал: Vit2 (статус: Посетитель) 1. Отвечает эксперт: Вадим К не совсем понятно, что вы хотите. Если вы хотите, что бы диалог выпрыгивал в момент редактирования (вы удалили текст - диалог выскочил) тогда нужно внести это в обработчик OnKeyUp - этот обработчик сработает когда будет отпущена кнопка. Теперь проверяем на пустоту и выводим диалог. Как именно выводить я вижу вы знаете. Ответ отправил: Вадим К (статус: Бакалавр) 2. Отвечает эксперт: Alex Van Glukhman Я так поагаю что самый оптимальный вариант на событие OnEnter написать следующее Ответ отправил: Alex Van Glukhman (статус: 7-ой класс) Вопрос # 284 Подскажите где мне найти RXShell, со страницы скачал mailcheck.zip, а у меня он не компилируеться так как нет компонента RXShell, у меня делфи6 с rxlib275 Вопрос задал: Порядин Ю.Д. (статус: Посетитель) 1. Отвечает эксперт: min@y™ У меня тоже есть RxLib 2.75. Там в папке Units есть модуль RxShell.pas. В нём находится компонент TRxTrayIcon. Ответ отправил: min@y™ (статус: Студент) Вопрос # 285 Раздел: Delphi » Работа с устройствами и "железом" Доброе время суток,Эксперты! Может кто поможет... Мне очень нужно распознать тоновый сигнал (DTFM) поступающий на вход звуковай карты... помогите пожайлуста.. за ранее спасибо! Вопрос задал: Андрей Сергеевич (статус: Посетитель) 1. Отвечает эксперт: Вадим К Не скажу, что это сделать просто, но алгоритм прост и я думаю справитесь. Для начала нужно захватить звук с звуковой карты. Для этого можно кодить напрямую, а можно взять готовые компоненты, которые помогут "оцифровать" звук ACMPack.(брать тут http://www.torry.net/vcl/mmedia/audio/acmcomponents16.zip - всё бесплатно+исходнички.) Для начала рекомендую писать вначале в файл и разбирать потом с файла, а позже нучитесь и налету. Ответ отправил: Вадим К (статус: Бакалавр) Вопрос # 286 Раздел: Delphi » Взаимодействие с Windows Возможно ли встроить своё приложение в оболочку EXPLORER'а, чтобы получилось нечто вроде "Панели управления", "Принтеры и факсы" или "Сетевые подключения"? Вопрос задал: Иван (статус: Посетитель) 1. Отвечает эксперт: Вадим К Если хочеться на панель управления свою прогу "запхать", то здесь нет ничего сложно - делаем exe файл по определённым правилам. А расширение даём cpl и бросаем в Windows\System32. Конечно в борланде ребята постарались и сделали готовых мастеров для нас. Называется Control Panel Application. В демках есть пример. Если умеете запрограммировать свою идею, то проблем не будет. Ответ отправил: Вадим К (статус: Бакалавр) Вопрос # 287 подскажите кто-нибудь где взять компонент DelphiX для Delphi7 Вопрос задал: Dmitry Sergeevich (статус: Посетитель) 1. Отвечает эксперт: Вадим К Смотрим сюда и думаем Ответ отправил: Вадим К (статус: Бакалавр) Вопрос # 288 Здравствуйте, уважаемые эксперты! Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель) 1. Отвечает эксперт: Вадим К С OpenDialog'ом всё предельно просто. Перед его показом добавляем такие строки Ответ отправил: Вадим К (статус: Бакалавр) 2. Отвечает эксперт: Knjazev Здравствуйте, Полушин Сергей Анатольевич! Ответ отправил: Knjazev (статус: 3-ий класс) Вопрос # 289 Раздел: Delphi » Общие вопросы по программированию Уважаемые программисты, доброго времени суток. Вопрос задал: Илья Бабаков (статус: Посетитель) 1. Отвечает эксперт: min@y™ 1) В файле твой_проект.dpr напиши перед Application.Run: Ответ отправил: min@y™ (статус: Студент) Вопрос # 290 Раздел: Delphi » Алгоритмы, преобразования Добрый день, господа! Вопрос задал: Драганов Василий Михайлович (статус: Посетитель) 1. Отвечает эксперт: Иусов Сергей Ник. Здравствуйте, Драганов Василий Михайлович! Ответ отправил: Иусов Сергей Ник. (статус: 2-ой класс) 2. Отвечает эксперт: Вадим К Добавлю к предыдущему ответу слудующее. Ответ отправил: Вадим К (статус: Бакалавр) Вопрос # 291 Раздел: Delphi » Графика (2D и 3D) в приложениях Можно ли создать avi файл на delphi. Вопрос задал: Shamsnsurov Jamshid (статус: Посетитель) 1. Отвечает эксперт: Вадим К Так вопрос состоит в том, как создать bmp файл? Ответ отправил: Вадим К (статус: Бакалавр) Вопрос # 292 Раздел: Delphi » Работа с компонентами и библиотеками Здравствуйте. На заочном обечении был задан вопррос:Запишите выражение, которое обеспечит выборку при открытии диалога только требуемого типа файлов – текстового или на языке Object Pascal, я знаю что через Filter у OpenDialog1 это можно сделать, а что за выражение записать надо, я не понял. Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель) 1. Отвечает эксперт: Николай Рубан Выражение должно быть такого содержания: Ответ отправил: Николай Рубан (статус: 5-ый класс) Вопрос # 293 Раздел: Delphi » Работа с компонентами и библиотеками Здравствуйте. На форме присутствует компонент ComboBox1, мне задали такие вопросы: Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель) 1. Отвечает эксперт: Николай Рубан 1) ComboBox1.Style:=csOwnerDrawFixed; Ответ отправил: Николай Рубан (статус: 5-ый класс) 2. Отвечает эксперт: Вадим К По поводу второго вопроса. Возможно так Ответ отправил: Вадим К (статус: Бакалавр) » Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи". Последние 3 урока: Выбор (ветвления)
Предисловие Большинство примеров, которые были рассмотрены в предыдущих уроках, являлись программами с линейной структурой. Программы с линейной структурой являются простейшими и используются, как правило, для реализации обычных вычислений по формулам (или других аналогичных задач, назначение которых - последовательное выполнение некоторых команд). Основная характеристика линейных алгоритмов - инструкции выполняются последовательно, одна за другой. 1. Условный оператор Условный оператор, который называется IF (англ. "если") используется для выбора одного из двух направлений хода программы. Выбор последовательности инструкций осуществляется во время выполнения программы в зависимости от выполнения условия. Общий синтаксис условного оператора IF: if {условие} then
THEN - англ. "в таком случае, тогда". Таким образом, строка вполне переводима и на русский язык: "Если условие выполняется, тогда сделать что-то..." Здесь условие - выражение логического типа (логические выражения были рассмотрены нами ранее в уроке №10). Если выражение является истинным (True), т.е. условие выполняется, то выполняется последовательность команд, указанная после THEN. Если же условие не выполняется, данный блок пропускается. В случае, если команд, ассоциированных с условием, несколько, то они заключаются в BEGIN ... END: if {условие} then
Данную форму записи условного оператора можно назвать сокращённой. Есть и полная форма. Дело в том, что сокращённая форма позволяет выполнить блок команд при выполнении заданного условия, но при этом мы теряем из вида тот случай, когда условие не выполняется. Для нашего примера с делением чисел сокращённой формы недостаточно. Полная форма даёт возможность указать две последовательности команд: одну - для случая, если условие выполняется, а другую - если не выполняется. Третьего не дано... Синтаксис: if {условие} then
ELSE - англ. "иначе, в противном случае": "Если условие выполняется, то сделать что-то, а в противном случае сделать что-то другое". if {условие} then
Пример. В качестве примера создадим программу расчёта сопротивления электрической цепи, состоящей из двух сопротивлений. Предоставим возможность выбора типа соединения - последовательное или параллельное. Далее дважды щёлкаем по кнопке и пишем обработчик. procedure TForm1.Button1Click(Sender: TObject);
Комментарии и пояснения: 1) В качестве исходных данных имеются 2 сопротивления - R1 и R2. Результирующее сопротивление - R. Для всех трёх переменных указан вещественный тип данных (Real), т.к. значения сопротивлений могут быть дробными числами. uses
Запустим программу и проверим её работспособность. Примечание: в примерах, показанных в данном уроке, фигурные скобки ("{" и "}") указаны всего лишь для удобства обозначения, что в конкретном месте кода программы должно что-то находиться - переменная, набор команд и т.д. В коде реальной программы данных скобок быть не должно! 2. Оператор выбора Оператор выбора, который называется CASE, используется для выбора одного из нескольких направлений дальнейшего хода программы. Выбор последовательности инструкций осуществляется во время выполнения программы в зависимости от равенства значения переменной-селектора константе, указанной перед группой инструкций. В качестве переменной-селектора можно использовать переменную только перечислимого типа. Целое число (Integer) - перечислимый тип данных. Другим простым перечислимым типом данных является символьный тип (Char). Синтаксис оператора CASE: case {переменная-селектор} of
Работает оператор следующим образом: берётся значение переменной-селектора и последовательно сравнивается с каждой из констант. Если значения совпадают, то выполняются инструкции, указанные после данной константы. Если ни одна константа не совпала со значением переменной-селектора, но при этом указан блок else, то выполняются инструкции этого блока. Если блок else не указан, никаких команд выполнено не будет. case a of Пример программы с использованием оператора выбора. Создадим программу, которая будет запрашивать ввод числа от 1 до 12 и выводить название времени года, которому принадлежит месяц с указанным номером. Интерфейс прост: поле ввода (Edit1) и кнопка (Button1). Обработчик кнопки таков: procedure TForm1.Button1Click(Sender: TObject);
Результат работы: Данный пример довольно прост и в пояснениях, скорее всего, не нуждается. Заключение Условный оператор IF и оператор выбора CASE позволяют создавать ветвления в программах, т.е. выполнять различные действия в зависимости от заданного условия. Отличие их друг от друга состоит в том, что IF используется для единственного выбора, а CASE - для множественного. Очевидно, что данные операторы могут быть вложены друг в друга (например, в одном из блоков оператора CASE может быть использован IF). При написании какой-либо сравнительно сложной программы без ветвлений не обойтись. Оцените данный урок (1 - плохо, ..., 5 - отлично):
-1- -2- -3- -4- -5-. Комментарии в тексте письма приветствуются.
Самые популярные статьи на сайте: ∙ Создание непрямоугольных форм в Delphi О костылях Автор: Вадим К Вступление Часто бывает, что программу сдать нужно вчера, а вы нашли глюк и никак не можете справиться с ним. Мало того, вы не можете отследить зависимость, когда он появляется. Сегодня мы поговорим о том, как отлавливаются такие глюки, как бороться и побеждать их. Конечно, руководство не претендует на универсальное решение, но немного развеет боязнь. Итак. Исходные условия. Программа компилируется, и возможно не только запускается, а и делает то, что планировалось. Но выкидывает случайные ошибки. Или хуже, даже не запускается. Как узнать, где и почему? Способ первый. Лог файл. Этот способ древний как мир. Это наверно самый первый способ, который использовали программисты для отладки, но часто он актуальный и на данный момент. Для этого способа нам понадобится простая процедура, которую можно добавить в отдельный модуль и подключить к другим отлаживаемым приложениям. procedure AddToLog(s:string); Многие скажут, можно вынести создание и закрытие в отдельные процедуры и вызывать их в начале работы программы и в конце. И что код жуть неоптимальный… Всё это неверно. Код предельно выверен. Ведь присмотритесь, он открыл файл, записал строку, потом принудительно сбросил буфер на диск (процедура Flush, хоть она и немного игнорируется в современных системах, но даже если наше приложение завалится, то строка в файл попадёт, а это важно) и закрыть файл. Таким образом, хоть и медленно, но зато всё записывается. Ведь при поиске ошибки больше важно найти саму ошибку, чем скорость, с которой программа выполнит свой расчёт. Даже для конечного пользователя часто важна стабильность и корректность расчётов, чем скорость, с которой они выполняются. За время тестирования этой нехитрой процедуры я не заметил негативных сторон и оптимизировал только строку вывода, переделав её к виду: Writeln(f,DataTimeToStr(Now)); Теперь у меня в логе было ещё и время, когда произошло событие. Сколько нервов сохранила эта процедура мне… Что же писать в лог? Писать слишком много – плохо, не разберёшься потом с километрами логов. Писать мало – слишком расплывчато будет. Я делаю так. В начало каждой процедуры, которая хоть как-то может быть виноватой в неверной работе, добавляю вывод названия этой процедуры, и, по возможности параметры, которые ей были переданы, например так: procedure SameFoo(a:integer; b:double); Функция Format позволяет сделать код более компактным и не писать долгие IntToStr и FloatToStr. Теперь, просмотрев лог программы, по последней строке можно сделать вывод, где именно она падает. А так как «стек вызовов» тоже виден (то есть последовательность, кто кого вызывал) то можно и отследить, кто отослал неверный параметр. Один раз я наткнулся на то, что одна моя процедура время от времени выдавала ошибку, но принести отладчик мне было нереально (в силу многих независимых от меня причин), но к офису было близко :-) Параметры, которые передавались в процедуру, мне тоже ни о чём не говорили. Решение было простым. Через каждые две-три строки я вставил вызов записи в лог с указанием номера строки и некоторых параметров. После просмотра лога я уже видел строку, где происходит ошибка :-) Итого я потратил больше времени на компиляцию, чем на хождение. Но у этого способа есть два недостатка. Невозможно указать на автомате номер строки, где произошла ошибка, имя процедуры и тому подобное. А также, когда программа полностью отлажена, все отладочные вызовы убрать очень сложно. Второй недостаток убирается двумя способами. Или просто комментируется код самой процедуры вывода в лог (компилятор достаточно неплохо оптимизирует пустые вызовы) или использование директив условной компиляции, но наставлять их по коду очень долго, поэтому думать надо сначала об этом. Несмотря на предельную простоту приведённого кода, он будет работать практически везде. И не только в Delphi. Можно будет использовать полученный опыт и в других языках, только процедуру придётся перевести на соответствующий язык. Также эта процедура поможет в отладке сервисов, кода в dll. Есть только одно ограничение – она не может корректно работать в многопоточных приложениях. То есть нельзя вызывать из двух потоков одновременно. Но критические секции помогут. Достаточно добавить ещё пару строк и одну переменную типа TCriticalSection (объявлена в SyncObjs). Способ второй. Используем специальную API-функцию. Было бы удивительно, если бы разработчики ОС Windows не предусмотрели специальной функции для ведения лога. И такая есть! Главное уметь правильно ей пользоваться. Называется она OutputDebugString. Как понятно из названия, она выводит переданную ей строку в лог. Так как параметр имеет тип PAnsiChar, то просто так передать строку не получается. Ничего, напишем обёртку. procedure ODS(s:string); Или каждый раз придётся писать приведение типов. Вставим в код любой программы и запустим её. Процедура скомпилировалась и даже выполняется, но визуально никак не видно последствий её работы. В папке с проектом никаких новых файлов не появилось. Где же искать лог? Если вы запускаете программу из-под отладчика (коим 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, так что будьте готовы настраивать фильтры в программе). Сообщения можно сохранить в текстовый файл, который потом хорошо загружается Excel'ем как CSV файл. И, применив автофильтр, выбираем интересующие нас сообщения. Пищи для размышления программа выдает предостаточно, так что запасайтесь кофе :-) Способ три. Проверяться и проверяться. Во многих случаях вы знаете о допустимых диапазонах значений многих переменных. Для этого можно использовать так называемые утверждения. То есть в коде вы вставляете утверждение. Программа будет проверять их, и, если они неверны, то будет выведено сообщение с указанным вами текстом и сгенерировано исключение. Но большим преимуществом будет то, что кроме указанного вами сообщения будет также добавлено имя файла и номер строки, где произошло исключение. Согласитесь, это много. Применяем так. Пусть мы знаем, что x содержит делитель и не может по понятным причинам быть равным нулю. Вставим перед вычислением выражения строку вида: Assert(x<>0,'почему это x равен нулю?'); Если x действительно окажется равным нулю, то получим такое сообщение (если правильно текст сообщения написать, то даже классическая блондинка из анекдотов сможет вам по телефону объяснить, что там написано). Очень удобно то, что это сообщение перехватывается с помощью блока try .. except. А соединив наш первый способ с этим, получаем очень удобный инструмент. Произошло исключение – в файл его. Только помните, что во многих случаях, раз уж произошло сообщение, то нужно подумать, а стоит ли продолжать выполнять процедуру? Итак, улучшенный вариант использования нашей процедуры выглядит так var x:integer; Но оборачивать каждую процедуру в блок try ... except затруднительно, да и ошибки любят появляться там, где их не ждешь. А хотелось бы всё в файл, и централизованно. Для этого ставим на главную форму нашего приложения компонент ApplicationEvents, взятый с вкладки Additional. Свойств у этого компонента мало (имя и Tag), зато событий много. И все эти события связаны с приложением в целом. Нас интересует событие OnException. Его второй параметр содержит собственно само исключение и в простейшем случае обработка может быть сведена до AddToLog(e.Message); О бедных dll замолвите слово Часто приходится отлаживать код не только в основном приложении, но параллельно и в нескольких dll. И тут неискушённого программиста подстерегает множество неожиданностей. Первая и самая большая заключается в том, что если в обычном приложении все обработчики событий (нажатия на кнопку, к примеру) завёрнуты в невидимые try ... except и исключение, возникшее в процедуре, за её пределы не выходит, а вы получаете сообщение об ошибке, то в dll всё не так. Там никто таким образом вас не контролирует. Поэтому не ленитесь добавлять к коду обработку исключений. Подобное касается и потоков (TThread). Только в них всё еще интересней. Если происходит необработанное исключение, то поток умирает без каких-либо предупреждений. То есть, поделили нечаянно на ноль - и всё, поток умер. Об этом многие не знают и жалуются, что потоки мрут как мухи, процедура Terminate не выполняется и проконтролировать никак не могут… Альтернативное средство: Jedi Code Library Если у вас установлена эта чудесная библиотека, то можно сделать обработку ошибок более простой. Для этого нужно сделать следующее. Вначале подключить отладочную информация к выполнимому файлу. Для этого выбираем пункт Project - Insert JCL Debug data. Теперь нужно только создать окно для отображения ошибок. В последних версиях библиотеки была добавлена в репозитарий готовая форма, которую просто нужно создать (File – New – Delphi Files – Jcl Exception dialog for Delphi). В появившемся мастере заполняем параметры, и, вуаля, у нас есть даже отсылка сообщений на электронную почту! Самое удобное, что не нужно больше писать никакого кода. При возникновении ошибки появится диалог, в котором будет приведён стёк вызовов. Более подробно об особенностях использования этого диалога можно почитать здесь: http://rsdn.ru/article/Delphi/DelphiJCL.xml. Большими плюсами этого средства являются:
Недостаток – увеличение объема кода где-то на 30-50% за счёт включения отладочной инфомации. Альтернативное средство: MadException Это не просто эксперт или набор файлов. Это целая студия для отлова исключений. И хотя для коммерческого использования она платна, для себя её можно использовать свободно. На сайте данного средства (http://www.madshi.net/madExceptDescription.htm) есть даже видеоролики по его использованию, так что даже у неанглоязычных людей проблем почти не возникает. Вот такое окошко появляется, когда в приложении происходит исключение. Если нажать на «Show bug report», то можно увидеть столько информации, что некоторые пользователи, наверное, не разрешат её отправку. Тут собрана всё подноготная, начиная с вашего приложения (где находится выполнимый файл, сколько памяти потратил), и завершая подробностями операционной системы (список процессов, список текущего установленного оборудования). Всё очень гибко настраивается, так что особых проблем не должно возникнуть. К тому же, есть возможность писать плагины, так что если какая-то информация не попала в лог, можно поправить это дело. Основное преимущество, оно же и недостаток – слишком много информации собирает. Каждый делает свои выводы. Альтернативное средство: EurekaLog И ещё одно, на этот раз полностью платное решение. Оно также обладает широкими возможностями (не знаю, намного ли опережает MadException). Основная особенность, которую я заметил - это то, что когда вы видите трассировку стёка исключений, то сделав двойной клик, можно открыть данный файл в нужной строке. Но зачем на клиентской машине такая возможность? Также есть возможность контролировать утечки памяти (правда за счёт падения производительности в 5 раз), контролировать попытки модификации кода. Если заинтересовало - смотрим здесь. Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения Уважаемые читатели! Отправляйте полезные компоненты/модули, исходники, собственные программы/игры, документацию - книги, учебники и они будут размещены на сайте.
Ведущий раздела: Bruder Чайник, который закипел... Джордж Бадрейн Вообще-то я не тормоз, просто долго думаю..., когда особенно есть над чем, или о чем ? Вообщем есть у меня друган один - программист по каким-то Сям, иногда он себя обзывает сисадмином - это ж надо придумать! И уговорил он как -то купить меня компьютер под псевдонимом комп под другим псевдонимом пентиум третий или просто пень тройной, ну это его слова, я таких-то и не знаю даже. Ну значит купил я его. Все как надо мне друган сделал, окошки поставил 2000, сказал, что проблема 2000 решена и "проверено - вирусов нет". А я спросил, а проблема 10000 решена? Он сказал, что не доживешь. Но я все равно беспокоюсь маленько. Ну ладно, подключился я к паутине какой-то, картинки там интересные сайты называются. Все путем шло примерно месяц, как раз я всех вартоксов изничтожил , но с пацаном как-то неудобно получилось... Вообщем, проснулся я как-то с утра по-московскому, солнце светит, мужики на обед пошли, хорошо так стало, и включил свой пень. А он, подлец, вроде включился, но как -то не так. Верещит что-то не поймешь. Я в машинном языке не рублю. На экране картинок даже нет - чернота сплошная. Ай-яй-яй думаю, висит кажись. Ну жму как обычно красненькую кнопку, а оттуда вылазит что-то махонькое, наглое, и шмыг обратно. - Гремлины ! - подумал я как обычно матом. - Они во всем виноваты! Тут из щелки в компе вылез еще один гремлин. Он был толстый и смахивал на крупного таракана. - Фу, мерзость! Тут я понял, что гремлины это сказка, а лазят там вирусы компьютерные. Надо антивирус взять поновее - решил я. Антивирусы водились в сети, как кто-то мне сказал. Я думал, а комп что-то верещал и временами пикал, ругался наверное. Где ж взять сеть то? Е-мое! Сеть была у меня на кухне - конечно это была авоська, но попробовать стоило. Я сунул туда руку, запустил ее на поиск
и стал ждать коннекта. Коннект не заставил себя ждать и вывалил несколько объектов. Это были почему-то тараканья отрава, гнилой огурец и пустая литровая банка. Что сие значило наверное не догадался бы самый продвиннутый юзер - это зверь такой немного умный. Я решил действовать в режиме RND, режим выдал мне гнилой огурец. Антивирус - радостно подумал я - Касперского может быть. Я побежал к устало пищавшему компу и влямзил антивирус в дискодав (или дисковод?). Комп негодующе взревел и на экран выползла надп
ись: Boot sector on floppy failure... Кажись не тот антивирус - подумал я, - несовместимый. Осталась отрава и банка. Банка в дискодав не влезет, разве что виртуальная, а где ж ее взять? Осталась отрава "Машенька". Я трудолюбиво растер ее в мелкую труху и всыпал в щелку дискодава. Комп пикал , но не ревел. Процесс пошел - подумал я удовлетворенно. Через несколько минут (долго для третьего пентиума то!) вирусы посыпались из компа целым стадом. И все как один похожи на тараканов! Тут и банка сгодилась,
насобирал я их полный литр с горкой и плотно закрыл крышкой, хотя те и сопротивлялись. Ни хрена себе они размножились-то ! Давно антивирусы не апгрейдил. Я с чувством выполненного долга тыкнул красненькую кнопочку, и тут заметил, что клава (борда которая, а не шифер) не подключена к вертикально стоящему белому ящику, я это исправил. :)) Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они будут опубликованы в ближайших выпусках рассылки. WWW: http://www.delphi.int.ru/ E-mail: admin@delphi.int.ru; info@delphi.int.ru; expert@delphi.int.ru
Архив рассылки: http://subscribe.ru/archive/comp.soft.prog.delphifaq Ведущий рассылки: Ерёмин Андрей
|
В избранное | ||