Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Отображаемых записей из БД «телефонная книжка»Содержание книги
Поиск на нашем сайте
(программный путь) В телефонной книжке, как правило, располагается много записей и просмотр всех их последовательно затруднителен. Рассмотрим простейшее разбиение таких записей на следующие две части: в первую войдут те, которые содержат фамилии, начинающиеся на буквы от «А» до «М», а во вторую – от «Н» до «Я», причем записи будут выводиться в алфавитном порядке. Будем использовать TQuery программно. 1. Загрузим заготовку проекта, созданную в предыдущем примере. Зададим свойству Caption формы Form1 значение «Информация о людях (запрос 2)». Сразу же сохраним все составные части проекта в файлах с теми же именами, что и прежние, но с добавлением цифры 6 в конце имени: MyExUnitDB6.pas, MyExUnitQuery6.pas и MyExampleDB6.dpr. В тексте модуля формы Form1 заменим раздел объявления используемых модулей в секции implementation USES MyExUnitQuery; на раздел USES MyExUnitQuery6; А в тексте модуля формы Form2 заменим раздел объявления используемых модулей в секции implementation USES MyExUnitDB5; на раздел USES MyExUnitDB6; А ее свойство Caption изменим на «Ограниченный просмотр». Изменим немного вид формы Form1: свойство Caption у компоненты Label6 с Постраничный на Ограниченный. 2. Перейдем к форме Form2. Удалим из нее две компоненты – ComboBox1 и Button1 (кнопка Страница). На место удаленных компонент поместим со страницы Standart две компоненты Button, а у компоненты DBGrid1 свойство DataSource сделаем пустым, чтобы первоначально в ней не было никаких записей. 3. Выберем кнопку Button1 и изменим ее свойство Caption на «А – М». Активизируем ее и в появившемся обработчике события OnClick введем следующие строки: procedure TForm2.Button1Click(Sender: TObject); Begin WITH Form1.Query1 DO BEGIN Close; SQL.Clear; SQL.Add('SELECT D.*, D1.*'); SQL.Add('FROM "People.db" D, "Tel.db" D1'); SQL.Add('WHERE'); SQL.Add('(D1.IDPeople = D.IDPeople)AND(D.Family < "Н")'); SQL.Add('ORDER BY D.Family ASC'); Open; END; Form1.DataSource3.DataSet:= Form1.Query1; DBGrid1.DataSource:= Form1.DataSource3; end; 4. Выберем кнопку Button3 и изменим ее свойство Caption на «Н – Я». Активизируем ее и в появившемся обработчике события OnClick внесем следующее: procedure TForm2.Button3Click(Sender: TObject); Begin WITH Form1.Query1 DO BEGIN Close; SQL.Clear; SQL.Add('SELECT D.*, D1.*'); SQL.Add('FROM "People.db" D, "Tel.db" D1'); SQL.Add('WHERE'); SQL.Add('(D1.IDPeople = D.IDPeople)AND(D.Family >= "Н")'); SQL.Add('ORDER BY D.Family ASC'); Open; END; Form1.DataSource3.DataSet:= Form1.Query1; DBGrid1.DataSource:= Form1.DataSource3; end; 5. Запустим программу командой Run|Run. 6. Перейдем ко второй форме, нажав кнопку Просмотр. Нажимая кнопки «А – М» и «Н – Я», можем видеть, как меняется набор отображаемых записей. 7. Завершим работу приложения. 8. Сохраним все изменения в проекте. Взаимодействие с приложениями-серверами через OLE. Способ получения информации о необходимых командах в продуктах Microsoft Office.
Основные средства отладки программ в Delphi. (?нужен ли просмотр и анализ кода и раздел расширенные средства отладки.основное,что он говорил присутствует) Синтаксические ошибки Синтаксические ошибки обнаруживаются компилятором автоматически. Сообщения о найденных ошибках отображаются в нижней части редактора, в небольшом окне (рис. 3.1): Main pas '•:.::: *Г '*+"- *ariw3Ke itiiG uar i,l, j: Integer; Fi: T&KtFile; 3: String; begin К:= О; oe i:- 1 -co МА*_РАТТЕКНЯ do begin AsaigriFiJ-e (Fi, XntTaatc f i > + ". Си* W tanA uted ml ≪3*1 MS' Puc. 3.1. Информация о синтаксической ошибке, обнаруженной компилятором При двойном щелчке на строке с сообщением об ошибке система Delphi 7 пере- ключится в редактор, где подсветит строку, в которой эта ошибка обнаружена. Само сообщение (на английском языке) описывает ошибку достаточно подробно, чтобы можно было понять ее причину. Например: Undeclared identifier: ' X ' В данном случае указано, что идентификатор X не объявлен. Логические ошибки Существует несколько способов предотвращения, выявления и устранения логиче- ских ошибок. Все они используются программистами, как правило, в комбинации друг с другом. За наиболее часто встречающимися ошибками можно заставить следить саму про- грамму. Для этого в настройках проекта — соответствующее диалоговое окно вызывается командой Project > Options (Проект >• Настройки) — на вкладке Compiler (Компилятор) надо выполнить следующие действия (рис. 3.2). 154 Урок 3. Отладке программ Project Options (or TeiilMainf roq.exe • Code generator; Го Г гга Stricl vaf trended i>rta ; F Atwj^e l>BeiJ cofstvU Rurifne SICKS ------ JJ Hangt chpcfors ОеЬиетпд — P Eebupniofmaljcn Сим! Рис. 3.2. Настройка компилятора для максимального контроля ошибок О На панели Code generation (Генерация машинного кода) сбросьте флажок Optimization (Оптимизация). Когда компилятор создает оптимизированный код, он нередко вносит существенные улучшения в детали алгоритма, реали- зованного на Паскале. Например, если программист вводит в процедуре ло- кальную переменную X для хранения промежуточных результатов: function Sum: integer; var X: integer; begin X:= StrToInt(Editl.Text) + StrToInt(Edit2.Text); Result:= X end; то после оптимизации этого кода программа вполне может не использовать промежуточную переменную, а результат вычислений условно будет пред- ставлен так: Result:= StrToInt(Editl.Text) + StrToInt(Edit2.Text); Это означает, что программист не сможет узнать значения локальной пере- менной X во время работы программы, потому что реально для нее не будет отводиться место в оперативной памяти. ') ЗАМЕЧАНИЕ Кок правило, для повышения эффективности вычисления подобных выражений компилятор активно использует регистры процессора. О На панели Runtime errors (Ошибки времени выполнения) должны быть уста- новлены флажки Range checking (Контроль выхода индекса за границы массива), I/O Checking (Контроль ошибок ввода/вывода) и Overflow checking (Контроль Что такое отладка 1 55 переполнения при целочисленных операциях). Так как все типы Паскаля имеют строго ограниченные диапазоны, то, например, при сложении двух чисел, близких к максимально допустимому значению, получится число, которое не укладывается в этот диапазон. Последний флажок позволяет обнаружи- вать такие ошибки. О На панели Debugging (Отладка) установите флажки Debug information (Добав- ление отладочной информации), Local symbols (Просмотр значений локальных переменных), Reference info (Просмотр структуры кода), Assertions (Включение процедуры Assert в машинный код) и Use Debug DCUs (Использование отладочных версий стандартных модулей библиотеки компонентов VCL). Без отладочной информации отладка программы в среде Delphi 7 вообще невозможна. Процедура Assert выполняет отладочные функции. В заключи- тельной версии программы она, как правило, не нужна, а удалять ее вызовы из исходного текста неудобно — их могут насчитываться сотни. Отключить генерацию машинного кода для этой процедуры можно с помощью флажка Assertions. Отладочные версии стандартных модулей содержат дополнитель- ные режимы проверки корректности работы с компонентами Delphi 7. Теперь, если в программе, запущенной непосредственно из среды Delphi 7, встре- тится ошибка (например, вышеупомянутый выход индекса за допустимые границы), выполнение программы прервется, а строка, Б которой встретилась ошибка (в дан- ном случае — Arr[i]:- 0;), будет подсвечена. При этом система Delphi 7 позволит быстро определить, в чем причина ошибки. Например, наводя указатель мыши на различные переменные, можно сразу увидеть их значения в окне всплывающей подсказки (i = 11). ЗАМЕЧАНИЕ 8 некоторых случаях, как в рассматриваемом примере, реальные ^^^~^^^~ значения переменных i и Агг могут не совпадать с отображаемыми, потому что произошла запрещенная попытка обращения к недо- ступной области памяти, в результате чего значения локальных переменных могли измениться. Все же в большинстве ситуаций, когда работа программы, запущенной из Delphi 7, прервалась по ошибке, подобным образом можно посмотреть значения любых пере- менных и констант. За более сложными ошибками разработчик должен следить из среды Delphi 7 са- мостоятельно. Для этого применяется ряд стандартных приемов, однако требуется, чтобы отлаживаемая программа была запущена непосредственно из среды Delphi 7. Только тогда среда разработки сможет должным образом контролировать ход выпол- нения программы и изменение значений различных переменных. Выполнение по шагам Обычно разработчику приблизительно известно, в какой подпрограмме возникает ошибка, однако обнаружить ее быстро, просто рассматривая исходный текст, не всегда удается, особенно новичкам в программировании (хотя просмотр исходных 156 Урок 3. Отладке программ тестов признан наиболее эффективным средством обнаружения ошибок). Поэтому возникает необходимость выполнить эту подпрограмму по шагам: каждый оператор по очереди, с возможностью контроля значений используемых переменных. Рассмотрим пример, связанный с проектом Projectl (предварительно в Менеджере проектов его надо сделать активным). Добавим в обработчик списка действий AddAction следующие описание и оператор: var Arr: array[1..10] of integer; begin for i:= 1 to 11 do if i > 3 then A r r t i ]:= 0 else Arr[i]:= 1; В данном месте программы скрывается ошибка. Чтобы перейти к выполнению этой подпрограммы по шагам, в ней надо создать точку прерывания (или точку оста- новки), встретив которую программа прервет свою работу и временно передаст управление системе Delphi 7. Точки прерывания можно ставить не в любой строке исходного теста, а только там, где выполняются какие-то действия. Такие строки помечены на левом поле в редакторе синими круглыми маркерами, которые появляются после успешно выполненной компиляции. В нашем случае точку прерывания можно поставить в строке с оператором цикла. Это делается нажатием клавиши F5 или щелчком мыши на синем маркере. При этом соответствующая строка выделяется красным цветом (рис. 3.3). Снимается точка прерывания аналогичным способом. Строка, содержащая точку прерывания — Признак точки прерывания Маркеры выполняемых —' операторов := 1 to in do else Arr [i]:= J; Label 1. Caption:= IntToStr (M888 + StrToInt (Ed: end; Рис. 3.3, Подготовка подпрограммы к пошаговой отладке Если теперь запустить программу и выполнить операцию сложения (щелкнув па кнопке Сложить или выбрав соответствующий пункт в строке меню или в контекстном меню), то программа остановится и управление будет передано в систему Delphi 7, где строка с точкой прерывания помечается зеленой стрелкой на левом поле (рис, 3.4). ft: i.: = I t o iu do else Ac r I i }:= 1; Рис. З.4. По достижении точки прерывания праерамма останавливает работу Что такое отладка 1 57 В заголовке главного окна системы Delphi 7 появится информационное сообще- ние Projectl [Stopped] (Выполнение проекта Projectl остановлено). Далее выполнение метода AddActionExecute можно продолжить по шагам. Для этого используются команда Run > Step Over (Запуск >• Перешагнуть), кла- виша F8 или кнопка Step Over (Перешагнуть). Если выполнить очередной шаг, то в редакторе подсвечивается голубым цветом и помечается зеленой стрелкой следующий оператор, ожидающий выполнения. if i > 3 then Arr[i]:= 0 Сейчас можно проверить значение переменной i, наведя на нее указатель мыши. Появится окно всплывающей подсказки с надписью i - 1. Если навести указатель на переменную Arr, то в круглых скобках будет показан список всех значений мас- сива, однако, пока инициализация не закончена, значения, хранимые в массиве, непредсказуемы. Продолжив выполнение метода по шагам, мы увидим, что следующим выполняе- мым оператором станет оператор else Arr[i]:= 1; Предыдущий оператор присваивания Arr[i]:= 0 пропущен, потому что условие i > 3 не выполнено. Наконец, на следующем шаге управление опять будет передано опе- ратору цикла, который будет выполнять свое ≪тело≫ 11 раз, и на последнем шаге возникнет ошибка. Полностью остановить работу программы можно с помощью команды Run > Program Reset (Запуск > Сброс программы) или комбинацией клавиш CTRL+F2. Теперь можно исправить параметр окончания цикла с 11 на 10 и вновь запустить программу. Вер- нуться к точке прерывания можно, например, щелкнув на кнопке Сложить. Однако выполнять циклы по шагам не очень удобно. Если число повторений дости- гает сотен или тысяч, то постоянно жать на клавишу F8 бессмысленно. Чтобы про- пустить выполнение группы операторов, можно использовать команду Run > Run to Cursor (Запуск х Выполнение до курсора) или клавишу F4. Предварительно надо выполнить следующие действия. Текстовый курсор надо уста- новить в строку, начиная с которой требуется продолжить выполнение по шагам, например в начало оператора LabelI.Caption:= IntToStrf StrToInt(Editl.Text) + StrToInt(Edit2.Text)); Затем следует убрать точку прерывания (так как при попытке выполнить группу операторов, в данном случае цикл, система Delphi 7 встретит эту точку прерывания и вновь остановится на старом месте) и нажать клавишу F4. Работа цикла завер- шится (можно убедиться, что в массиве Arr хранятся только единицы и нули, наведя на его название указатель мыши) и подсветится оператор сложения чисел, введен- ных в поля. Продолжить выполнение программы (не по шагам) можно с помощью команды Run (Запуск) или клавиши F9. 158 Урок 3. Отладка программ Просмотреть список всех установленных точек прерывания можно с помощью команды View > Debug Windows > Breakpoints (Вид >• Окна отладки >• Точки прерыва- ния) (рис. 3.5). Breakpoint List Filename JA6*ess, Рис. 3-5. Список созданных точек прерывания ПОДСКАЗКА Если в момент, когда программа остановлена, выполнялись какие- то действия по просмотру файлов и текущее место остановки было потеряно, быстро вернуться к нему поможет команда Run >• Show Execution Point (Запуск > Показать точку выполнения). В некоторых случаях при выполнении программы по шагам требуется также сле- дить за тем, как работают различные подпрограммы, вложенные в отлаживаемый модуль. Рассмотрим это на примере — добавим к форме MyForm новую кнопку и сформируем обработчик ее нажатия. В нем поместим обращение к методу AddActionExecute. procedure TMyForm.Button4Click(Sender: TObject); begin AddActionExecute(Sender) end; Поставим на вызове этого метода точку прерывания. Запустим программу, щелк- нем на новой кнопке, и выполнение прервется в нужном месте. Если теперь нажать на клавишу F8, то подпрограмма AddActionExecuteQ выполнится за один шаг (про- изойдет шаг через подпрограмму). Это не всегда удобно — ведь нам хочется выяс- нить, какова логика работы самого метода AddActionExecute. Для этого надо приме- нить команду Run > Trace into (Запуска Войти внутрь), нажать клавишу F7 или щелкнуть на кнопке Trace into (Войти внутрь). В результате управление передается первой команде метода AddActionExecute. ВНИМАНИЕ Можно входить внутрь только тех методов, которые написаны раз- работчиком. С помощью команды Trace into (Войти внутрь] удастся выполнить по шагам далеко не все стандартные функции и проце- дуры. Это связано с тем, что некоторые из них не существуют в отладочных версиях, а их исходные тексты в поставку системы не входят. Допустимо заходить внутрь методов обьектов, включенных в состав библиотеки компонентов VCL, если используются отла- дочные версии ее модулей. Эта библиотека полностью поставля- ется в и сходных текстах. Что такое отладка 159 Иногда сразу становится ясно, что делает подпрограмма, в которую разработчик вошел с помощью клавиши F7. В таких случаях можно быстро ее покинуть с помощью команды Run >• Run Until Return (Запуск >• Выполнять до выхода) или комбинации кла- виш SHIFT+F8, в результате чего управление передается на оператор, следующий за вызовом данной подпрограммы. Б нашем примере, если программист вошел внутрь метода AddActionExecute, то быстро покинуть его и вернуться в обработчик Button4CLick можно с помощью команды Run Until Return (Выполнять до выхода). Довольно часто в программах встречаются ситуации, когда число вызовов вложен- ных подпрограмм весьма велико — оно может достигать десятков. Чтобы взгля- нуть на подобную последовательность подпрограмм с конкретными параметрами во время выполнения программы, надо дать команду View >• Debug Windows >• Call Stack (Вид > Окна отладки >• Стек вызовов) (рис. 3.6). Execute TGMctO* TBuUtnOck TBU>cnOJCoran*v((lM01.3№6. 0. 2556, ВД TCBViolWntfKell'Wm 2556. 2556. 0.2556.0.2556.0.0.0]| TW>iCOnKilWntPHK{|43WI. 2556.?55£. 0. 2556. 0.2556.0.0. M) TBiBonConta!lWr>dPiiK(l4ai<)1.2556. 2556. 0. 2556. D. 2556. 0. 0 OB IConOol Pet[an<4W01.2556.2556) DoCanlrcMsg(2556{ra valuel) TW.iConWil.WMC»mB™([273. 2556. 0.2556. On THoturfomWMCaimevU^S. 2556.0.2556.0]] TCix*ijtWridPioDl]273. 2556.2556.0. 2566.0. 2556. u 0. Qlj TWnCoreotWn<Fii!cU273. 2556.2556.0. 2556.0. 2556.0.0, Щ TCiBtomF≫mWndProc[(273.2556.2556. D. 2556. 0.2556. Q. 0.0)! TWnConlral.MerWn*r<Kl[273. 2556. 2556,0, 2556. 0,2556. 0.0.0]) kLJ Рис. З.6. Стек вызовов подпрограмм Просмотр значений Когда во время работы программы приходится контролировать множество значе- ний разных переменных, использовать для этой цели мышь неэффективно. Система Delphi 7 позволяет помешать переменные в специальное окно, где наряду с их име- нами показываются также и текущие значения. При выполнении программы по шагам переключаться между этим окном и окном редактора неудобно, поэтому в контекстном меню окна списка переменных имеется пункт Stay on Top (Поверх дру- гих окон). Если его включить, это окно будет во время отлад- ки располагаться выше всех остальных окон, что позволяет следить за изменениями переменных при пошаговом выпол- нении программы. С помощью флажков (крайняя левая ко- лонка) можно включать и выключать отслеживание конкрет- ных переменных. Добавление новых переменных в такое окно осуществляется с помощью команды Run > Add Watch (Запуск > Добавить слежение) или нажатием клавиш CTRL+F5. В появив- шемся окне Watch Properties (Своиава слежения) имя переменной вводится в поле 160 УрокЗ. Отладка программ Поле для ввода выражения Тип значения Watch Properties. -:E3 ЕФИЯЭСИ. J 1 RmeatCCUiC 10 i Djgte jlB — W Ejjebled Г~ ABnw ^u*MicnCob . С £hafacie«Г rfe&fliiKirrb^ P ^Et&d/SBuctie _ ^ S^ire ^* Floating piwl ^ Ddai^ irEKim* Г!>*≪, Гы.^уО,™ - OK Carest JJcfc Число знаков после запятой I Рмс. 3.7. Ввод выражения для постоянного контроля Expression (Выражение). Можно следить за изменениями не только отдельных пере- менных, но и за значениями целых выражений, например x-t-y или i-5 (рис. 3.7). В нижней части окна Watch Properties имеется ряд переключателей, с помощью кото- рых можно указать тип результирующего значения (например, переменная может иметь тип Integer, а показывать требуется символ, соответствующий этому значе- нию). По умолчанию считается, что показываться будет значение, имеющее тот же тип, что и переменная — переключатель Default (По умолчанию). В поле Repeat Count (Число элементов) указывается, сколь- ко элементов массива будут отображаться. Например, можно указать элемент массива Агг[3] и число элементов, равное 5. Тогда при выполнении программы по шагам в этом поле будут отображаться через запятую значения пяти эле- ментов, начиная с Агг[3]: Агг[3], Агг[4], Агг[5], Агг[6], Агг[7]. В поле Digits (Разрядность) задается число значащих цифр после запятой, которые будут выводиться для чисел дробных типов. С помощью переключателя Enable (Включено) можно временно отключать контроль значений некоторых переменных списка. Флажок Allow Function Calls (Разрешить вызов функций) допускает использование в выражениях вызовов функций. Например, выражение IntToStr(Arr[3]) будет показы- вать текстовое представление значения, хранящегося в элементе Агг[3]. Содержимое переменной, тип которой основан на записи (record), отображается в виде, принятом для инициализации записей: имя-поля: значение; Значение точки Р в методе FormMouseUp будет показано так: Р: (х: 129; у: 312] Чтобы отредактировать выражение, ранее введенное в список, надо дважды щелк- нуть на нем. Удаление выражение производится нажатием клавиши DELETE. В кон- текстном меню окна слежения имеются также пункты Delete All Watches (Удалить все элементы), Disable AIL Watches (Отключить все элементы), Enable All Watches (Вклю- чить все элементы), позволяющие, соответственно, удалить, временно выключить или включить все элементы. В Delphi 7 появилась возможность объединять эле- Что такое отладка 161 менты в несколько групп, каждой из которых соответствует своя закладка в ниж- ней части окна просмотра. Этот удобный подход позволяет собирать отслеживае- мые переменные программы в компактные группы по смыслу, а не показывать в одном длинном списке. Добавление новой группы выполняется командой л скаль- ного меню просмотра значений Add Group (Добавить группу). ЗАМЕЧАНИЕ В системе Delphi 7 имеется также специальное окно для показа значений всех локальных переменных текущей подпрограммы или метода. Оно открывается командой View >• Debug Windows > Local Variables (Вид >• Окна отладки > Локальные переменные). Б этом окне отображается, в частности, значение переменной Self, ука- зывающей на объект, которому принадлежит данный метод.
|
||||
Последнее изменение этой страницы: 2017-02-21; просмотров: 242; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.186.132 (0.01 с.) |