Выполнение длительных операций в приложениях на delphi


Содержание

Компиляция и выполнение проекта Delphi

В процессе компиляции проекта создается готовый к использованию файл, которым может быть приложение (ЕХЕ) или динамически загружаемая библиотека (DLL). Далее будем рассматривать только файл-приложение. Имя приложения, получаемого в результате компиляции, совпадает с именем файла проекта, а само приложение является автономным и не требует для своей работы дополнительных файлов Delphi.

Запуск процесса компиляции выполняется по команде Project | Compile

(Проект | Компилировать ) или нажатием комбинации клавиш + . В этой команде содержится имя проекта, разработка которого выполняется в настоящий момент, первоначально это Projectl. При сохранении проекта под другим именем соответственно должно измениться имя проекта в команде меню.

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

При компиляции проекта выполняются следующие действия:

1) компилируются файлы всех модулей, содержимое которых изменилось со времени последней компиляции. В результате для каждого файла с исходным текстом модуля создается файл с расширением DCU. Если исходный текст модуля по каким-либо причинам недоступен компилятору, то он не перекомпилируется;

2) если в модуль были внесены изменения, то перекомпилируется не только этот модуль, но и использующие его с помощью директивы uses модули;

3) перекомпиляция модуля происходит также при изменениях объектного файла или подключаемого файла (INC), используемых данным модулем;

4) после компиляции всех модулей проекта компилируется файл проекта и создается исполняемый файл приложения с именем файла проекта.

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

Запустить проект на выполнение можно из среды Delphi и из среды Windows. Выполнение проекта из среды Delphi осуществляется командой Run | Run (Выполнение | Выполнить) или нажатием клавиши . При этом созданное приложение начинает свою работу. Если в файлы проекта вносились изменения, то предварительно выполняется компиляция проекта. Запущенное приложение работает так же, как и запущенное вне среды Delphi, однако имеются некоторые особенности:

· нельзя запустить вторую копию приложения;

· продолжить разработку проекта можно только после завершения работы приложения;

При зацикливании (зависании) приложения его завершение необходимо выполнять средствами Delphiс помощью команды Run | Program Reset (Выполнение | Остановить программу) или комбинации клавиш + .

Для отладки приложений в среде Delphi можно использовать средства отладчика.

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

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Для студентов недели бывают четные, нечетные и зачетные. 9438 — | 7438 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

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

Гавриленко Сергей Алексеевич

Умнее название темы не придумал собственно. Так вот, господа, будьте так любезны, подскажите, можно ли узнать занята ли в текущий момент моя программа или нет?Поясню для чего это нужно:База данных в настоящий момент разбухла довольно сильно и на запросы пользователей(на выборку) реагирует уже не так быстро, в момент ожидания от отправки запроса до получения набора данных может пройти от 0 до 18 секунд, в зависимости от размера возвращаемого НД, в момент этого самого ожидания хотел бы показать окно типа: «подождите идет обработка данных» или что то в этом духе. но есть один нюанс, этот обработчик надо сделать глобальным, чтобы на малейшее «подвисание» системы показывалось данное окно, кто нибудь сталкивался с этим?

Полезные компоненты для пользователей Delphi и С++Builder: Delphi VCL Extensions (RX) Lib v 2.50

Библиотека компонентов Delphi VCL Extensions (RX) Library, разработанная Федором Кожевниковым, Сергеем Королевым и Игорем Павлюком, представляет собой бесплатный свободно распространяемый (freeware) продукт, уже в течение трех лет пользующийся заслуженной популярностью как в нашей стране, так и за рубежом. По мнению наиболее квалифицированных разработчиков, анализировавших исходные тексты RX Library, компоненты и классы этой библиотеки практически не содержат ошибок.

Версия 2.50 этой библиотеки содержит более 60 визуальных и невизуальных компонентов, а также набор полезных классов и функций, включая исходные тексты всех модулей. В настоящее время она доступна по адресу http://www.torry.ru/vcl/packs/rxlib.zip. Там же можно найти дополнения к этой версии (http://www.torry.ru/vcl/packs/rxfix.zip).

Данная версия этой библиотеки может быть использована со всеми имеющимися на сегодняшний день версиями Delphi (начиная с версии 1.0 и заканчивая версией 4.0) и С++Builder (версии 1.0 и 3.0). Библиотека содержит также файлы ресурсов для 15 языков (помимо русского и английского). Файл справки доступен на русском языке (по мнению зарубежных разработчиков, отсутствие англоязычной справки — самый серьезный недостаток данной библиотеки, но российские разработчики, я надеюсь, не очень пострадают от ее отсутствия).

После установки библиотеки в соответствии с прилагаемыми к ней инструкциями в палитре компонентов появятся три дополнительные страницы: RX Controls (управляющие элементы, рис. 1a), RX Tools (разнообразные полезные компоненты, в основном невизуальные, рис.1b) и RX DBAware (компоненты доступа к данным и отображения данных, рис. 1c). Рассмотрим эти компоненты более подробно.

Страница RX Controls

На странице RX Controls содержатся разнообразные управляющие элементы, по большой части представляющие собой расширения стандартных интерфейсных элементов, способные украсить приложение и улучшить его пользовательский интерфейс. В частности, она содержит несколько любопытных расширений обычного поля редактирования, например компонент для ввода даты TDateEdit; поле редактирования, в которое можно поместить результат расчета на всплывающем калькуляторе TСalcEdit; компоненты для ввода имен файлов и каталогов, позволяющие как непосредственно ввести их, так и выбрать с помощью стандартного диалога Windows; специальный компонент для ввода денежных величин и некоторые другие полезные компоненты, представляющие вариации на тему однострочного редактора текста. Следует заметить, что применение большинства из них может быть весьма полезным, например, в финансовых и бухгалтерских приложениях (рис. 2).

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

Помимо перечисленных компонентов, на странице RX Controls содержатся компоненты, которые наверное пригодятся разработчикам игр: компонент TAnimatedImage для отображения последовательно меняющихся графических изображений, будильник с меняющимся стилем и даже игральная кость (рис. 4).

Страница RX Tools

Страница компонентов RX Tools содержит различные полезные компоненты, способные упростить создание пользовательских интерфейсов. Среди них следует особо отметить невизуальный компонент TPageManager, позволяющий создавать серии сменяющих друг друга форм, наподобие используемых серий форм в некоторых экспертах Delphi и C++Builder (рис. 5).

Еще один полезный компонент страницы RX Tools — TSpeedBar — настраиваемая инструментальная панель, позволяющая пользователю с помощью операции drag-and-drop перетаскивать кнопки из предусмотренного разработчиком набора, отображаемого в интуитивно понятном диалоге, на инструментальную панель (рис. 6).

Весьма интересен также компонент TClipboardViewer, предназначенный для просмотра содержимого буфера обмена, независимо от типа содержащихся в нем данных. Отметим, что весьма полезная утилита просмотра содержимого буфера, существовавшая в Windows 3.1 и куда-то исчезнувшая в Windows 95/98/NT, может быть создана с использованием этого компонента буквально за минуту (рис. 7).

Весьма интересен также компонент TDualListDialog — двойной список с перемещаемыми элементами (подобные диалоговые панели нередко используются в средах разработки Delphi и C++Builder, рис. 8).

Из других компонентов отметим также TFormPlacement и TFormStorage — невизуальные компоненты, которые позволяют хранить сведения о состоянии и размере содержащей их формы, а также сведения о текущих значениях свойств компонентов, находящихся на ней, во внешнем ini-файле; TPicClip — массив битовых изображений; TSecretPanel — панель, позволяющую разместить, помимо обычных визуальных элементов, скрытое изображение или текст, причем последний может циклически прокручиваться (рис. 9).

Отметим также невизуальный компонент TMRUManager, предназначенный для работы со списками последних использованных элементов, таких как последние открытые (закрытые) файлы, таблицы баз данных и т.д. Этот компонент позволяет автоматически создавать подменю со списком таких элементов или добавлять их к существующему меню.

Еще один невизуальный компонент — TAppEvents — предназначен для создания в режиме дизайна формы обработчиков событий TApplication и задания значения некоторых свойств TApplication.

Весьма интересны также TRxMainMenu и TRxPopupMenu — аналоги обычных компонентов для отображения меню, используемых в Delphi и C++Builder, и позволяющих добавлять к пунктам меню графические изображения. Пользователям Delphi 4 они могут показаться не представляющими интереса, однако напомним, что и эти, и другие компоненты работоспособны во всех версиях Delphi и C++Builder, начиная с первой версии Delphi, а рынок приложений, нетребовательных к ресурсам рабочих станций, в том числе 16-разрядных, в нашей стране пока еще достаточно велик.

Страница RX DBAware

Эта страница содержит компоненты доступа к данным и отображения данных, расширяющие возможности, предоставляемые обычными компонентами Data Access и Data Controls.

Из невизуальных компонентов следует отметить компонент TRxQuery, являющийся наследником TQuery и обладающий дополнительным свойством Macros, которое позволяет изменять текст запроса во время выполнения, — например, заменить предложение WHERE или ORDER BY, что практически невозможно сделать, используя стандартные параметризованные запросы, генерируемые компонентом TQuery (рис. 10).

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

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

Компонент TQBEQuery позволяет работать с запросами формата QBE, используемого в Database Desktop и Corel Paradox.

Компонент TRxDBFilter реализует возможность наложения фильтров на курсор (набор данных, передаваемый на рабочую станцию) без применения дополнительных запросов. Преимущество фильтров заключается в их быстродействии и отсутствии доплнительных обращений к серверу баз данных, что может оказаться необходимым в тех случаях, когда требуется многократно динамически изменять условия отбора записей. Фильтр может накладываться на любой набор данных — как TTable, так и TQuery или TQBEQuery; при этом наличие индексов для полей, на которые накладываются условия, не требуется (рис. 11).

Компонент TDBSecurity предоставляет два диалога, которые являются общепринятыми в приложениях, работающих с базами данных: диалог регистрации пользователя и диалог смены пароля пользователя. Он также может заблокировать приложение, минимизировав его, и потребовать от пользователя пароль для его разблокировки.

Еще три компонента позволяют осуществить доступ к объектам доступных баз данных. Компонент TBDEItems предоставляет доступ к спискам всех доступных баз данных (включая псевдонимы), драйверов баз данных или языковых драйверов (в зависимости от значения свойства ItemType), доступ к которому осуществляется как к обычной таблице. Компонент TDatabaseItems предоставляет доступ к спискам объектов (таблиц, файлов или хранимых процедур) базы данных в виде набора данных, доступ к которому осуществляется как к обычной таблице. Компонент TTableItems предоставляет доступ к списку элементов (полей, индексов, правил ссылочной целостности и т.д.) в виде набора данных, доступ к которому также осуществляется как к обычной таблице.

Компонент TDBProgress иcпользует Callback-функции IDAPI для сообщения о ходе выполнения длительных операций с базами данных.

Из визуальных компонентов следует отметить компонент TRxDBGrid — наследник TDBGrid, позволяющий отображать BLOB-поля базы данных в виде пиктограмм, изменять цвет шрифта и фона любой ячейки таблицы (либо любой ее строки или столбца) в зависимости от значения поля или имени поля набора данных, сохранять и восстанавливать порядок и ширину столбцов в INI-файле или в реестре, а также выбирать несколько записей. Заголовки колонок этого компонента могут быть использованы как кнопки, например, для изменения порядка сортировки отображаемых данных. Можно также зафиксировать в компоненте TRxDBGrid несколько первых колонок (рис. 12).

Илон Маск рекомендует:  Point - Функция Delphi

Компонент TDBStatusLabel, изображенный на этом же рисунке, позволяет отобразить состояние набора данных, а также число записей и номер текущей записи.

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

Компонент TRxDBLookupCombo почти полностью аналогичен компоненту TDBLookupCombo, но позволяет использовать в качестве свойства LookupSource любой источник данных — как TTable, так и Tquery; при этом свойство LookupField не обязательно должно быть индексированным полем. Кроме того, компонент позволяет производить поиск нужной записи при наборе первых нескольких символов, а также задавать изображения для рисования в левой части каждой строки списка, в зависимости от содержимого полей базы данных (рис. 13).

Помимо рассмотренных визуальных компонентов для отображения данных библиотека содержит также разнообразные поля редактирования, в некоторых случаях аналогичные компонентам со страницы RX Controls (TRxDBCalcEdit, TDBDateEdit и др.).

Некоторые полезные функции и классы

Класс TOleController реализует контроллер автоматизации, иногда удобный тем, что позволяет вызывать методы сервера автоматизации, имена которых заканчиваются символом “$”.

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

TGIFImage позволяет читать и записывать графические данные в формате GIF. Свойства класса TGIFImage предоставляют доступ к характеристикам изображения. Класс TGIFImage поддерживает изображения, содержащие до 256 цветов, форматов GIF 87a и GIF 89a, включая графические расширения, такие как анимированное изображение, прозрачность и т.д. Имеется возможность рисовать изображения и отдельные кадры из анимированных изображений.

Для иллюстрации работы этих двух классов в комплекте поставки библиотеки имеется пример RX GIF Animator, позволяющий создавать анимированные изображения и напоминающий по функциональности Microsoft GIF Animator (рис. 14).

Функция GetFormulaValue вычисляет результат математического выражения, заданного параметром Formula. Для вычислений используется объект класса TRxMathParser. Класс TRxMathParser, в свою очередь, представляет анализатор арифметических выражений, предоставляемых в виде строки.

Большое количество полезных функций имеется в модуле AppUtils, BDEUtils, FileUtil, MaxMin, VCLUtils. Перечислять их здесь не имеет смысла, так как все они подробно описаны в файле справки, поставляемой с библиотекой.

Некоторые полезные примеры

С библиотекой RX Library поставляется несколько примеров, иллюстрирующих применение компонентов и классов, входящих в ее состав.

Пример RX Library Demo Program иллюстрирует работу большинства компонентов (рисунки 2-11 данной статьи сделаны с использованием этого примера). Эта демонстрационная программа существует также в версии для C++Builder.

Пример RX GIF Animator позволяет создавать анимированные изображения в формате GIF и предназначен для иллюстрации классов, предназначенных для работы с этим форматом.

Особый интерес представляет утилита Database Explorer (имеющаяся в 16- и 32-разрядном вариантах, а также в варианте для C++Builder). Некоторые ее функциональные возможности имеются в SQL Explorer, но по сравнению с ним имеются и другие полезные возможности, например, трассировка SQL-предложений, экспорт и импорт данных и др. (рис. 15).

Таким образом, библиотека RX Library предоставляет разработчикам набор весьма полезных компонентов, классов и функций, способных улучшить функциональность и пользовательский интерфейс приложений самого разнообразного назначения — от игр до сложных корпоративных приложений, созданных с помощью всех версий Delphi и C++Builder.

Отладка программ в среде Delphi

Читайте также:

  1. COM программы.
  2. XI. Системное программное обеспечение ЭВМ
  3. XIII. Инструментальное программное обеспечение ЭВМ
  4. Алгоритм, записанный на языке программирования называется программой.
  5. АЛГОРИТМЫ ВЫПОЛНЕНИЯ МИКРООПЕРАЦИЙ.МИКРОПРОГРАММЫ.
  6. АЛГОРИТМЫ, АЛГОРИТМИЗАЦИЯ, ПРОГРАММИРОВАНИЕ
  7. Алфавит языка, лексика, структура программы.
  8. Анализ программы.
  9. Анализ. Первый программный пример строка за строкой
  10. Антивирусные программы
  11. Антивирусные программы
  12. Антивирусные программы

(для программирующих в Delphi)

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

(1)Точки контрольного останова

Точка контрольного остановаопределяет оператор в программе, перед выполнением которого программа прервет свою работу, и управление будет передано среде Delphi. Точка останова задается с помощью опции View|Debug windows|Breakponts.

Окно точек остановасодержит список всех установленных в проекте точек, перед выполнением которых происходит прекращение работы программы и управление получает среда Delphi.

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

FileName – определяет имя файла;

Line number – номер строки от начала файла (в момент появления окна оно содержит файл и строку с текстовым курсором);

Condition – можно указать условие останова в виде логического выражения (например, MyValue = МахValue-12);

Pass count – количество проходов программы через контрольную точку без прерывания вычислений.

Окно точек останова (слева) и окно добавления новой точки (справа)

(2)Окно наблюдения

Наблюдать за состоянием переменной или выражения можно с помощью специального окна, вызываемого опцией View|Debug windows|Watches.

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

Для добавления нового выражения следует щелкнуть по окну правой кнопкой мыши и выбрать опцию New Watch. В строке Expression ввести выражение. Окно Repeat count определяет количество показываемых элементов массивов данных; окно Digits указывает количество значащих цифр для отображения вещественных данных; переключатель Enabled разрешает или запрещает вычисление выражения. Остальные элементы определяют вид представления значения.

Значения переменных можно также посмотреть во время останова программы, наведя курсор мыши на переменную в тексте кода.

Окно наблюдения и окно добавления в него нового выражения

(3)Принудительное прерывание работы программы

Если программа запущена из среды Delphi, ее работу можно прервать в любой момент с помощью клавиш Ctrl+F2, кнопки ESC, опцией Run|Program Pause или, наконец, установив точку контрольного останова в той части программы, которая выполняется в данный момент или будет выполнена.

(4)Трассировка программы

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

Теперь программист может прослеживать работу программы по шагам с помощью клавиш F7 и F8 или инструментальных кнопок. При нажатии клавиши F8 будут выполнены запрограммированные в текущей строке действия, и работа программы прервется перед выполнением следующей строки текста программы.

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

Фрагмент окна редактора в режиме отладки

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

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

После трассировки нужного фрагмента программы можно продолжить нормальную ее работу, нажав клавишу F9.

(5)Действия в точках прерывания

В Delphi с любой точкой можно связать одно или несколько действий. Для этого нужно активизировать окно точек останова, вызвать его локальное меню (щелчок правой кнопкой) и выбрать продолжение Properties. В появившемся окне свойств щелкнуть по кнопке Advanced.

В нижней части окна имеется панель Actions, с помощью которой и определяются действия для точки останова, указанной в верхней части окна:

· Break – останов перед выполнением помеченного оператора;

· Ignore subsequent exceptions – если переключатель установлен, игнорируются все возможные последующие исключения в текущем отладочном сеансе до очередной точки останова, в которой, возможно, это действие будет отменено;

· Handle subsequent exceptions – после установки этого переключателя отменяется действие предыдущего переключателя и возобновляется обработка возможных исключений;

· Log message –можно указать произвольное сообщение, связанное с точкой останова;

· Eval expression – можно вычислить некоторое выражение и поместить его результат в это сообщение.

Окно свойств точек останова

(6)Группировка точек прерывания

В Delphi имеется возможность объединения точек останова в группы. Для этого используется все то же окно (рис. 7.4): в строке Group следует указать имя группы, к которой принадлежит точка, а в строках Enable group и Disable group соответственно разрешить или запретить действие всех точек останова, относящихся к соответствующей группе.

(7)Вычисление выражений и изменение значений

С помощью окна Evaluate/Modify опции Run можно узнать значение любого выражения или установить в переменную другое значение. Это окно вызывается в режиме отладки после нажатия Ctrl+F7.

Окно просмотра изменения значений

В строке Expression можно написать имя переменной или интересующее вас выражение. После щелчка по кнопке Evaluate в поле Result появится текущее значение переменной (выражения). Если в Expression содержится имя переменной, одновременно становится доступной кнопка Modify, а в строке New value повторяется текущее значение переменной. Если изменить эту строку и нажать Modify, в переменную будет помещено новое значение, которое и будет использоваться при дальнейшем прогоне программы (если определяется значение выражения, кнопка Modify и строка New value будут недоступны).

Можно использовать дополнительные кнопки этого окна Watch и Inspect. Если щелкнуть по первой из них, выражение (переменная) из окна Evaluate будет перенесено в окно наблюдений Watch, щелчок по второй отображает выражение (переменную) в специальном окне Inspect.

(8)Ведение протокола работы программы

В ряде случаев бывает неудобно или невозможно пользоваться пошаговой отладкой программ. В таких ситуациях могут помочь контрольные точки, которые не прерывают работу программы, а лишь помещают некоторую информацию в специальный файл трассировки. Для реализации такой точки следует раскрыть окно Run|Add Breakpoint|Source Breakpoint (рис. 7.1), убрать флажок в переключателе Break и написать сообщение в строке Log message. Можно также в строке Eval expression указать выражение, которое будет вычислено и вместе с сообщением помещено в протокол работы программы. Этот протокол можно просмотреть в любой момент (в том числе и после завершения прогона программы) с помощью опции View|Debug Windows|Event Log.

Глава 2. Лекция 6

Дата добавления: 2014-01-06 ; Просмотров: 3595 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Delphi: как измерить точное время выполнения операции?

Точное время измерения выполнения операции в Delphi может пригодится во многих случаях, начиная от самого простого — показать пользователю время, затраченное на выполнение длительной операции (здесь, кстати, высокая точность нужна редко) и, заканчивая, ситуациями, когда в целях оптимизации программы нам необходимо выявить в программе наиболее «узкие» места в которых программа «застревает» на длительный промежуток времени. В основном, последняя ситуация характерна при разработке программ, использующих и обрабатывающих большие массивы данных, когда скорость выполнения операций выходит, если не на первое, то на одно из первых мест в требованиях к приложению.
Есть несколько способов узнать время выполнения операций в Delphi и все эти способы, в принципе, рассмотрены как в Сети, так и моем блоге. Поэтому представленная ниже статья — это лишь объединение всех возможных способов измерения времени в Delphi и опытный Delphi-программист здесь врядли встретит что-то новое для себя.

Способ №1 — самый простой. Используем функцию Now()

Самый простейший и наименее точный способ измерить время, затраченное на выполнение какой-либо операции в Delphi — воспользоваться функцией Now() из модуля System.SysUtils.

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

Вполне вероятно, что у вас может возникнуть резонный вопрос: почему я использовал в примере SecondsBetween(), а не, например, MilliSecondsBetween() для большей точности? Сделал я это, опираясь исключительно, на описание функции Now() в официальной справке по Delphi, которая гласит следующее: «Несмотря на то, что в TDateTime могут передаваться миллисекунды, Now() имеет точность до ближайшей секунды«. То есть, если использовать Now(), то определять интервал времени с точностью до миллисекунд — не имеет смысла.

Способ №2 — используем Windows API. Функция GetTickCount().

Функция GetTickCount() не имеет параметров и возвращает количество миллисекунд, прошедших с момента запуска системы. Судя по официальной справке Microsoft, р азрешение функции GetTickCount() ограничено разрешением системного таймера, которое обычно находится в диапазоне от 10 до 16 миллисекунд. При этом, счётчик миллисекунд будет обнулен, если система запущена более 49,7 дней.
В принципе, пример использования этой функции похож на предыдущий:

Так, используя функцию GetTickCount() мы можем засечь время выполнения операции в Delphi с точностью до миллисекунды. Если и такая точность Вам не подходит и необходимо измерить интервал времени ещё точнее, то следующий способ — для вас.

Способ №3 — продолжаем использовать Windows API. Функции QueryPerformanceCounter и QueryPerformanceFrequency

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

QueryPerformanceCounter — извлекает текущее значение счетчика производительности, которое представляет собой метку времени с высоким разрешением ( TStopwatch использует функциональные возможности, зависящие от операционной системы, для получения доступа к таймерам с высоким разрешением, если они доступны. Если таймеры с высоким разрешением в ОС недоступны, то используются обычные таймеры.

Илон Маск рекомендует:  Что такое код asp serverip

Несмотря на то, что TStopwatch — это запись, для корректного использования всё же необходимо вызывать метод Create или StartNew.

Описание TStopwatch следующее:

  • Свойство IsHighResolution указывает, основан ли таймер на счетчике производительности с высоким разрешением.
  • Метод Start() начинает измерять прошедшее время.
  • Метод Stop() останавливает измерение прошедшего времени.
  • Свойство ElapsedMilliseconds получает общее истекшее время в миллисекундах.
  • Свойство Elapsed получает истекшее время в виде TTimeSpan.

Воспользоваться возможностями TStopwatch также достаточно просто, например, так:

В представленном выше примере мы воспользовались TStopwatch и вывели количество минут (с дробной частью), пошедших на выполнение какой-то операции. В целом же, используя возможность TStopwatch.Elapsed можно выводить любые значения, ограниченные лишь возможностями TTimeSpan (см. справку).

Подведем итог

Итак, чтобы измерить точное время выполнения операции в Delphi, необходимо, прежде всего определиться с тем какая точность Вас устроит? Если достаточно, чтобы интервал времени определялся с точностью до секунды, то достаточно воспользоваться обычной, давно известной функцией Now(). Да, точность самая низкая, но, зато — просто.

Если ваше требование к точности измерения времени ограничивается миллисекундой — используйте GetTickCount(): просто, достаточно надежно (только, если вы не планируете измерять интервал времени больше 49,7 дней).

Библиотека OmniThreadLibrary — простая многопоточность в среде Delphi

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

Затронутая в заголовке тема очень обширна. Все, что будет написано ниже, — это даже не верхушка айсберга, это скорее полет на высоте 10000 метров над океаном, в котором эти айсберги плавают. Зачем писать такую статью? Скорее для того, чтобы обратить внимание на широкие возможности, которые уже давно доступны, но которых почему-то многие побаиваются и сторонятся.

Почему Delphi?

Я программирую на Delphi очень давно и не перестаю наслаждаться. Это во многих отношениях замечательный язык. Его уникальность в том, что он одновременно позволяет создавать код сколь угодно высокого уровня, при этом оставаясь «близким к железу», т.к. на выходе мы получаем native-приложение, а не код для виртуальной машины Java или .Net. И при этом язык Delphi очень прост и лаконичен, код на нем приятно читать и в нем достаточно легко разобраться, чего не могу сказать о коде на C или C++ (при всем моем великом уважении к разработчикам на C, хотя кто-то скажет, что это лишь дело привычки).
В настоящий момент Delphi утратил былую популярность. Вероятно, произошло это из-за того, что в 2000-х годах данный продукт был на несколько лет практически заброшен разработчиками, в результате чего он на какое-то время выпал из конкурентной гонки сред разработки. Действительно, после Delphi 7, выпущенного фирмой Borland в 2002-м году, более менее стабильный продукт появился лишь в 2007-м. Это был CodeGear Delphi 2007, выпущенный фирмой CodeGear, являющейся дочерней компанией Borland. Все версии между Delphi 7 и Delphi 2007 были практически непригодны к использованию. В 2008-м Borland продала подразделение CodeGear фирме Embarcadero Technologies, которая (за что ей особое спасибо!) незамедлительно начала превращать то, что ей досталось, в современную качественную среду разработки. Актуальной версией Delphi на момент написания статьи является Embarcadero Delphi XE2, выпущенная в сентябре 2011 года. Благодаря достаточно высокому качеству последних версий Delphi, данная среда разработки постепенно отыгрывает утраченные позиции.

Зачем нам многопоточность?

Люди хотели выполнять на компьютере несколько задач одновременно. Это называют многозадачностью. Реализуется многозадачность средствами операционной системы. Но если ОС умеет выполнять одновременно несколько приложений, почему бы и одному приложению внутри себя тоже не выполнять сразу несколько задач. Например, при архивации большого списка файлов архиватор может одновременно читать следующий файл, в это время в памяти архивировать текущий прочитанный и записывать результат в выходной файл на диске. Т.е. вместо того, чтобы в одном потоке выполнять над каждым файлом последовательно действия «прочитать» -> «заархивировать» -> «записать результат на диск», можно запустить 3 потока, один из которых будет читать файлы в память, второй поток — архивировать, а третий — сохранять на диск. Другим примером является выполнение в фоне какой-то малоприоритетной задачи — например, фоновое сохранение резервной копии файла, открытого в текстовом редакторе.
Если бы процессоры продолжали увеличивать свою тактовую частоту теми же темпами, как это происходило в 90-х и начале 2000-х годов, можно было бы не заморачиваться с многопоточностью и продолжать писать классический однопоточный код. Однако в последние годы процессоры перестали активно увеличивать скорость одного ядра, но зато начали наращивать количество самих этих ядер. Чтобы использовать потенциал современных процессоров на 100% без многопоточности просто не обойтись.

Почему сложно писать многопоточный код?

1) Легко допустить ошибку.
Когда на компьютере выполняется одновременно несколько приложений, адресное пространство (память) каждого процесса надежно изолировано от других процессов операционной системой и влезть в чужое адресное пространство довольно сложно. С потоками внутри одного процесса наоборот — все они работают с общим адресным пространством процесса и могут изменять его произвольным образом. Поэтому в многопоточном приложении приходится самостоятельно реализовывать защиту памяти и синхронизацию потоков, что приводит к необходимости написания относительно сложного, но при этом не несущего полезной нагрузки кода. Такой код называют «boilerplate» (сковородка), потому что сковородку надо сначала приготовить перед тем, как начнешь на ней что-то жарить. Именно необходимость написания «нестандартного» boilerplate-кода сдерживает развитие многопоточных вычислений. Для синхронизации потоков предусмотрено множество специальных механизмов: потокозащищенные (interlocked) команды процессора, объекты синхронизации операционной системы (критические секции, мьютексы, семаформы, события и т.п.), spin locks и т.д.
2) Код многопоточного приложения сложно анализировать.
Одна из сложностей многопоточного приложения состоит в том, что просматривая код многопоточного приложения визуально не понятно, может ли какой-то конкретный метод вызываться (и вызывается ли) из разных потоков. Т.е. вам придется держать в голове, какие методы могут вызываться из разных потоков, а какие нет. Поскольку делать абсолютно все методы потокозащищенными — это не вариант, всегда есть шанс нарваться на ошибку, вызвав из нескольких потоков метод, не являющийся потокозащищенным.
3) Многопоточное приложение сложно отлаживать.
В многопоточном приложении множество ошибок может возникать при определенном состоянии параллельно выполняющихся потоков (как правило, при последовательности команд, выполненных в разных потоках). Интересный пример описан тут (http://www.thedelphigeek.com/2011/08/multithreading-is-hard.html). Воссоздать такую ситуацию искусственно зачастую очень сложно, практически нереально. К тому же в Delphi инструментов для отладки многопоточных приложений не очень много, Visual Studio в этом плане явный лидер.
4) В многопоточном приложении сложно обрабатывать ошибки.
Если приложение имеет графический интерфейс пользователя, то взаимодействовать с пользователем может только один поток. Обычно, когда в приложении происходит какая-то ошибка, мы либо обрабатываем ее внутри приложения, либо показываем сообщение пользователю. Если же ошибка происходит в дополнительном потоке, он не может ничего сказать пользователю «немедленно». Соответственно, приходится сохранять ошибку, произошедшую в дополнительном потоке, до момента его синхронизации с основным потоком и лишь потом выдавать пользователю. Это может приводить к относительно сложной и запутанной структуре кода.

Есть ли способ хоть немного упростить себе жизнь?

Представляю вашему вниманию OmniThreadLibrary (сокращенно OTL). OmniThreadLibrary — это библиотека для создания многопоточных приложений в Delphi. Ее автор — Primoz Gabrijelcic из Словении — непревзойденный профессионал с многолетним стажем разработки приложений на Delphi. OmniThreadLibrary — это абсолютно бесплатная библиотека с открытыми исходными кодами. В настоящий момент библиотека находится уже в достаточно зрелой стадии и вполне пригодна для использования в серьезных проектах.


Где найти информацию по OTL?

  • На этом форуме.
  • В блоге автора библиотеки.
  • На странице проекта в GoogleCode.

Также автор библиотеки сейчас занимается наполнением wiki-книги про OmniThreadLibrary и многопоточность, уже готовы статьи про большинство высокоуровневых примитивов OTL.

Какие возможности предоставляет OTL?

Данная библиотека содержит в себе низкоуровневые и высокоуровневые классы, позволяющие упрощенно управлять многопоточностью, не вдаваясь в подробности процессов создания/освобождения/синхронизации потоков на уровне WinAPI.
Особенный интерес представляют высокоуровневые примитивы для упрощенного управления многопточностью. Они примечательны тем, что их сравнительно легко интегрировать в готовое однопоточное приложение, практически не меняя структуры исходного кода. Данные примитивы позволяют создавать многопоточные приложения, концентрируясь на полезном коде приложения, а не на вспомогательном коде для управления многопоточностью.
К основным высокоуровневым примитивам относятся Future (асинхронная функция), Pipeline (конвейер), Join (параллельный вызов нескольких методов), ForkJoin (рекурсия с параллелизмом), Async (асинхронный метод), ForEach (параллельный цикл).
На мой взгляд, самыми интересными и полезными примитивами являются Future и Pipeline, т.к. для их использования имеющиеся код почти не нужно переписывать.

Future

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

Обратите внимание, что именно обращение к vFuture.Value является моментом синхронизации основного потока с дополнительным, т.е. до тех пор, пока мы не обратимся к Value мы вообще ничего не знаем о состоянии другого потока. Как только мы вызвали Value, основной поток приостанавливается до момента завершения расчета в дополнительном потоке.

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

Таким образом, примитив Future позволяет асинхронно выполнить какую-то задачу и вернуть результат в основной поток именно в тот момент, в который он там потребуется.

Pipeline

Pipeline (конвейер) — это гораздо более мощный примитив по сравнению с Future.
Представьте, что некий алгоритм выполняется в цикле для множества элементов. Например, производится какая-то обработка файлов в каталоге. Однопоточная программа будет брать очередной файл, прочитывать его, выполнять какие-то действия и сохранять измененный файл на диск. Имея конвейер можно исходный алгоритм разделить на этапы (чтение, обработка, сохранение) и запустить эти этапы в параллельных потоках. В самом начале запустится лишь самый первый этап и прочитает первый файл. Как только чтение завершится, запустится второй этап и начнет обработку прочитанного файла или его порции (если первый этап читает файлы не целиком а порциями). В это время первый этап уже начнет читать второй файл. Как только второй этап обработает первый файл, подключится третий этап и начнет сохранение. В этот момент мы получим состояние, при котором все три этапа работают параллельно.
Пример для Pipeline, близкий к реальной жизни, слишком загрузил бы статью, поэтому для иллюстрации использования Pipeline ограничиваюсь копией абсолютно синтетического примера из OtlBook (чур сильно не бить!):

В данном примере первый этап генерирует миллион чисел, передавая их по одному на следующий этап. Второй этап умножает каждое число на 3 и передает на третий этап. Третий этап суммирует результаты и возвращает одно число. Каждый Stage выполняется в своем потоке. Более того, Otl позволяет указать, какое число потоков для каждого Stage’а использовать (если одного мало) за счет простого модификатора .NumTasks(N). Возможности OTL действительно очень широки.

Базовым классом для поддержки обмена данными между этапами конвейера является класс потокозащищенной очереди — TOmniBlockingCollection. Данный класс позволяет нескольким потокам одновременно добавлять и считывать элементы. Высокая скорость работы коллекции достигается за счет хитрого управления памятью и применения блокировок на основе потокозащищенных инструкций процессора вместо блокировок на основе объектов синхронизации ОС. О подробностях реализации класса TOmniBlockingCollection можно почитать тут, тут и тут.

Заключение

Кто-то посмотрев на приведенные примеры скажет «да я все это уже видел». Действительно, в Task Parallel Library для .Net Framework 4 присутствуют примерно такие же классы. При этом существует ряд различий между тем, как исполняются потоки внутри машины .Net и как потоки исполняются на реальном процессоре. Рассмотрение данных различий — за пределами этой статьи. Я лишь хотел акцентировать внимание на замечательной библиотеке, и тех широких возможностях которые она предоставляет Delphi разработчикам. Хочу отметить, что библиотека снабжена большим количеством примеров, иллюстрирующих использование как низкоуровневых, так и высокоуровневых классов.

Чтобы развеять опасения по поводу зрелости и надежности данной библиотеки, скажу лишь, что за счет использования Pipeline в сложном коммерческом многопользовательском приложении (не web) удалось сократить время выполнения операции над группой файлов на клиенте почти в два раза за счет разнесения по отдельным потокам обработку файлов на клиенте и их передачу на сервер. Использовать ли связку Delphi + OmniThreadLibrary в ваших проектах — решать вам ;)

Delphi

Наши проекты

Взято с Vingrad.ru

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

Иерархия TObject – TPersistent – TComponent

В каждом приложении автоматически создается объект Application типа TApplication – приложение. Application имеет ряд свойств, методов, событий, характеризующих приложение в целом.

Собственные свойства класса TApplication.

Свойство возвращает значение true, если текущее приложение активно. При переходе к другому приложению или при завершении работы, свойство получает значение false. (Ro)

Свойство представляет информацию для IDE и может использоваться только самим приложением.

Илон Маск рекомендует:  Что такое код strupr

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

Свойство содержит указание на место размещения приложения при его выполнении в ближневосточных версиях Windows.

Свойство содержит имя текущего файла помощи, имеющего расширение .hlp. (Ro)

Свойство обеспечивает доступ к механизму создания окон диалога, не использующих библиотеку VCL. Это свойство содержит дескриптор окна диалога, созваемого с помощью функции API CreateDialog.

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

Свойство содержит дескриптор программы, который используется операционной системой Windows.

Свойство содержит имя справочного файла, который используется по умолчанию, например, при отсутствии всей информации о справочном файле, указанном в свойстве CurrentHelpFile.

Свойство содержит строковое выражение, определяющее текст всплывающей подсказки.

Свойство содержит значение цвета всплывающей подсказки.

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

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

Свойство позволяет отображать во всплывающей подсказке «быстрые клаыиши». Если свойство имеет значение true, то комбинация клавиш отображается, если false – нет.

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

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

Свойство определяет главную форму приложения.

Свойство содержит название раскладки клавиатуры, которая должна использоваться, если текст читается слева направо. (Ro)

Свойство определяет возможность появления всплывающих подсказок. Если свойство имеет значение true, то всплывающие подсказки появляются, если false – нет.

Свойство определяет возможность отображения главной формы. Если свойство имеет значение true, то главной является форма, которая была главной при разработке. Если главной должна быть другая форма, то этому свойству необходимо присвоить значение false, а свойству MainForm – имя новой главной формы. Свойству Visible формы, которая была главной, необходимо присвоить значение false.

Свойство указывает на завершение работы приложения. Этому свойству присваивается значение true, если Windows посылает ему сообщение WM_QUIT, означающее, что приложение должно завершить работу. (Ro)

Свойство содержит строковое выражение, являющееся заголовком приложения. Этот заголовок, например, отображается на кнопке панели задач Windows.

Свойство указыва5ет на возможность автоматического изменения формата при пользовательском изменении конфигурации опеарционной системы. Если свойство имеет значение true, то изменение выполняется автоматически.

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

Метод позволяет отобразить всплывающую подсказку в заданной точке CursorPos.

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

Метод позволяет убрать всплывающую подсказку.

Метод предназначен для внутреннего использования и вызывается автоматически объектом типа TControl.

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

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

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

function HelpCommand (Command: Word; Data: LongInt): Boolean;

Метод позволяет выполнить быстрый доступ к любой из справочных команд в WinHelp API. Перед отправкой команды Command метод HelpCommand генерирует исключение OnHelp для активной формы или объекта TApplication. О возможных командах справки Windows можно узгать в справочной информации Windows по ключу WinHelp.

function HelpContext (Context: THelpContext): Boolean;

Метод позволяет отобразить указанный раздел Context справочной системы. Если раздел был удачно отображен, то метод возвращает значение true.

Метод позволяет отобразить указанный раздел JumpID справочной системы. Если раздел был удачно отображен, то метод возвращает значение true.

Метод позволяет скрыть текущую всплывающую подсказку.

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

Метод позволяет создать перехватчик системных сообщений.

Метод позволяет инициализировать все подсистемы, определенные для данного приложения. Этот метод при загрузке проекта выполняется первым.

Метод возвращает значение true, если в приложении используется обход элементов управления в режиме справа налево.

Метод позволяет создать стандартное окно диалога. Подробнее

Метод позволяет свернуть все открытые окна приложения.

Метод позволяет перевести все окна приложения из состояния «всегда поверх остальных окон» в нормальное состояние.

Метод позволяет перевести все окна приложения за исключением главного окна из состояния «всегда поверх остальных окон» в нормальное состояние.

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

Метод позволяет восстановить все свернутые окна приложения до нормального размера.

Метод позволяет восстановить все открытые окна приложения, находящиеся в нормальном состоянии, в состояние «поверх всех». Данный метод применим только к тем окнам, свойство FormStyle которых имеет значение fsStayOnTop.

Метод предназначен для внутреннего использования и позволяет начать выполнение приложения. Этот метод вместе с методом инициализации (Initialize) и методом создания главной формы (CreateForm) автоматически записывается в основном блоке программы при создании ее заготовки.

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

Метод позволяет завершить работу приложения.

Метод позволяет генерировать событие OnActiveUpdate.

Метод возвращает значение true, если для выравнивания объектов используется режим «»права налево». Этот метод требуется для проверки приложений в ближневосточных версиях Windows, когда свойство BiDiMode имеет значение bdRightToLeft. Во всех остальных случаях метод возвращает значение false.

Метод возвращает значение true, если для вывода текстовой информации используется режим «»права налево». Этот метод требуется для проверки приложений в ближневосточных версиях Windows, когда свойство BiDiMode имеет значение bdRightToLeft. Во всех остальных случаях метод возвращает значение false.

Метод позволяет удалить перехватчик системных сообщений Hook, созданный методом HookMainWindow.

Метод возвращает значение true, если полосы прокрутки элементов управления должны отображаться с левой стороны. Этот метод используется для проверки приложений в ближневосточных версиях Windows, когда свойство BiDiMode имеет значение bdRightToLeft. Во всех остальных случаях метод возвращает значение false.

Событие генерируется, если вызван, но не обработан метод Execute.

Событие генерируется, если вызван, но не обработан метод Update.

Событие генерируется, когда приложение становится активным.

Событие генерируется, когда приложение становится неактивным.

Событие генерируется, когда в приложении возбуждается исключительная ситуация, которая не может быть программно обработана в блоке try…except.

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

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

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

Событие генерируется, когда приложение получает состемное сообщение от операционной системы.

Событие генерируется, когда окна приложения минимизируются.

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

Событие генерируется, когда пользователь нажимает на клавиатуре клавишу. Это событие генерируется первым из всех событий, связанных с обработкой нажатия клавиши: OnKeyDown, OnKeyPress и OnKeyUp.

Событие генерируется, когда приложение готовится вывести всплывающую подсказку. Параметр HintStr определяет текст подсказки, параметр CanShow – возможность отображения подсказки, а параметр HintInfo содержит информацию о внешнем виде и поведении окна справки.

Операции в Delphi

Операции применяются к выражениям – операндам. Большинство операций в Дельфи имеют два операнда, один из которых помещается перед знаком операции, а другой после. Операция вычитания «-» имеет два операнда: X и Y и вычитает Y от X. Такие операции называют бинарными. Унитарная же операция имеет только один операнд, например –Y.

Арифметические Операции

Арифметические операции применяются к действительным и целым числам (real, integer). Таблица бинарных арифметических операций:

Обозн

Операция

Типы операндов

Тип результата

Пример

X Y

X / Y

div

Целочисленное деление

mod

Остаток целочисленного деления

Некоторые правила: результат X/Y имеет тип extended при любых допустимых типах операндов. Для остальных операций, если хоть один операнд имеет тип Real, то результат имеет тип Extended.

Результат целочисленного деления X div Y равен X/Y, округленному в сторону нуля до ближайшего целого.

Выражение X mod Y равносильно выражению X-(X div Y)*Y. Это часто используется в тех случаях, когда надо обеспечить циклическое изменение какой-то переменной при изменении другой.

Операции отношения

При сравнении двух операндов в Дельфи используется операции сравнения. Они возвращают true – истина, если выполняется соотношение указанных операндов, и false – ложь, если соотношение не выполняется.

DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники

Отладка программы: Трассировка программы

Отладчик

Интегрированная среда разработки Delphi предоставляет программисту мощное средство поиска и устранения ошибок в программе — отладчик . Отладчик позволяет выполнять трассировку программы, наблюдать значения переменных, контролировать выводимые программой данные.

Трассировка программы

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

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

Трассировка — это процесс выполнения программы по шагам (step-by-step), инструкция за инструкцией. Во время трассировки программист дает команду: выполнить очередную инструкцию программы.

Delphi обеспечивает два режима трассировки: без захода в процедуру (Step over) и с заходом в процедуру (Trace into). Режим трассировки без захода в процедуру выполняет трассировку только главной процедуры, при этом трассировка подпрограмм не выполняется, вся подпрограмма выполняется за один шаг. В режиме трассировки с заходом в процедуру выполняется трассировка всей программы, т. е. по шагам выполняется не только главная программа, но и все подпрограммы.

Для того чтобы начать трассировку, необходимо из меню Run выбрать команду Step over или Trace into. В результате в окне редактора кода будет выделена первая инструкция программы. Для того чтобы выполнить выделенную инструкцию, необходимо из меню Run выбрать команду Step over (нажать клавишу ) или Trace into (нажать клавишу ). После выполнения инструкции будет выделена следующая. Таким образом, выбирая нужную команду из меню Run, можно выполнить трассировку программы. Активизировать и выполнить трассировку можно при помощи функциональной клавиатуры. Команде Step over соответствует клавиша , а команде Trace into — клавиша .

В любой момент времени можно завершить трассировку и продолжить выполнение программы в реальном темпе. Для этого надо из меню Run выбрать команду Run.

При необходимости выполнить трассировку части программы следует установить курсор на инструкцию программы, с которой надо начать трассировку, и из меню Run выбрать команду Run to cursor или нажать клавишу . Затем, нажимая клавишу или клавишу , выполнить трассировку нужного фрагмента программы.

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

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

Все о программировании.

Главное меню

Случайная новость

Как некоторые узлы в TTreeView выделить жирным шрифтом? Есть самый простой, но надежный способ реализации этого. Стандартное управление Windows TreeView имеет несколько флагов состояния (в нашем примере TVIS_BOLD и TVIS_CUT). При помощи этих флагов можно добиться нужного результата.

Как настроить диалоговое окно открытия файлов

Как можно добавить любые управления в диалоговое окно открытия файлов?

Мышь находится над управлением?

Иногда полезно знать, находится ли мышь над управлением. Например, изменять цвет управления, когда мышь находится над ним.

Переход к следующему элементу при нажатии Enter

Когда пользователь нажимает Enter , курсор должен перейти к следующему управлению. Клавиша по умолчанию не должна выполняться.

Список дисков в ComboBox, ListBox. Использование изображений

Программа показывает, как помещать изображения в такие компоненты, как:

Одна копия запущенного приложения (профессиональный путь)

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

Прозрачная тень под окном

Как сделать прозрачную тень под окном.

Использование консоли в не-консольных приложениях

Для осуществления ввода-вывода для не консольных приложений, Вы должны использовать функции AllocConsole и FreeConsole.

Как создать события MouseEnter/MouseLeave

Это приложение показывает как создать события OnMouseEnter и OnMouseLeave. Когда Вы входите в компонент или оставляете его, генерируются сообщения CM_MOUSEENTER и CM_MOUSELEAVE. Все, что Вам нужно сделать — ответить на эти сообщения.

Загрузка иконок из ресурсов во время выполнения программы

Загрузка иконок из файла ресурсов.

Прозрачный Bitmap

Есть простой способ, чтобы сделать прозрачный точечный рисунок.

Как создать окно подсказки приложения, подобно WinZip

Когда Вы проводите мышью над файлом ZIP с установленным WinZip, Windows Explorer показывает окно подсказки с информацией ZIP.

MessageForm — класс для вывода сообщений в ходе длительных операций

Класс позволяет вывести на экран псевдомодальное окно и обновлять сообщения в нем, не прерывая выполнения некоторой длительной операции в основном потоке приложения.

Перемещение элементов TListBox при помощи мыши

Этот небольшой пример показывает, как использовать мышь для перемещения пунктов в TListBox. Другой вариант расмотрен здесь.

Меню справа на форме

Как поместить TMenuItem справа на форме.

Делаем Label как ссылку

Как получить эффект URL на компоненте Label, например, в окне «О программе. «. Есть простой путь для выполнения этого.

Графическая кнопка

Графическая кнопка с закругленными краями с состояниями Up/Down.

« В начало21 22 2324252627282930В конец »

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL