Тестируем созданный класс TPASSMomentum (Delphi 7: отладчик, create, private, protected, breakpoint) |
![]() |
![]() |
Автор megabax | ||||||||
10.08.2009 г. | ||||||||
Тестируем созданный класс TPASSMomentum (Delphi 7: отладчик, create, private, protected, breakpoint, точка останова)Сегодня мы приступим к тестированию созданного нами класса индикатора. Для этого создадим тестовый пример. Сначала разместим на форме меню mmMenu и сделаем в нем всего лишь один пункт: "Файл"-->"Загрузить" (itLoad). Затем поместим диалог выбора файла: odOpenDialog, метки lbDateTime и lbResult, кнопкочку "Вычислить" (btnCalk), два компонента SpinEdit (seCandle и seDT), их можно найти на закладке Samples. Вот так примерно будет выглядеть наша форма*: В фильтре диалога выбора файлов установим фильтр текстовые файлы (с расширенеим *.txt) Добавим в класс основной формы окна переменные FPriceSource и FIndicator (добавленное выделено красным шрифтом):
в обработчике события OnCreate формы нам нужно полям FPriceSource и FIndicator присвоить nil:
Теперь реализуем процедуру загрузки котировок в обработчике OnClick пункта меню "Загрузить":
В этой процедуре мы запускаем диалог выбора файла, в случае, если пользователь выбрал файл, уничтожаем объект FPriceSource, если он уже создан, затем вновь создаем его и загружаем выбранный файл. Что бы нам видеть дату свечи, которую мы обрабатываем, сделаем обработчик OnChange объекта seCandle:
Ну, и наконец, реализуем обработчик нажати яна кнопку "Вычислить"
Здесь мы уничтожаем объект индикатора, если он у нас уже создан и создаем его заново. Передаем ему в качестве источника котировок FPriceSource, затем вычисляем значение индикатора. Все, запускаем программу. загружаем индикатор и жмем на кнопку "Вычислить". Опаньки! У нас вылезло сообщение об ошибке*. Данная ошибка возникла при попытке выполнить операцию FParameters.Add('PriceFieldType',APriceFieldType)*; Давайте при помощи отладчика узнаем, что содержалось в FParameters на момент ошибки. и так, ставим точку останова, просто щелкнув мышкой слева от строки*: Точку останова можно так же поставить (или снять), нажав на клавиатуре клавишу F5, либо через всплывающее меню (по щелчку правой кнопки мыши) "Debuп" --> "Toggle breakpoint"*. Теперь запустим программу. Когда мы нажмем на кнопочку "Вычислить" у нас выполнения программы прервется в точке останова. что бы посмотреть значения переменных, откроем окно "Watches" через меню "View" --> "Debug Windows" --> "Watches"*: В это окно добавим переменную FParameters, это можно сделать нажав на клавиатуре клавишу Insert. При этом должно открыться окно добавления переменной*: Как видим FParameters у нас равно nil*: Иными словами, данная переменная у нас почему то не инициализировалась, хотя мы вызвали конструктор родительского класса:
Давайте поставим точку останова выше, как раз на inherited Create; Когда программа у остановится, начнем выполнять ее пошагово, нажимая на клавишу F7 на клавиатуре. У нас зайдет в конструктор класса TPASSIndicator, затем в выполниться : inherited Create а после него FParameters:=TPASSParameters.Create Как видим, у нас FParameters инициализируется. Но, выйдя снова в конструктор класса TPASSMomentum он принимает значение nil. Оказывается, все дело в особенностях Delphi. Дело в том, что одна и та же переменная, объявленная в разных секция, на самом деле разная. Иными словами, мы получили две локальных переменных. А у нас как раз в классе TPASSIndicator переменная FParameters объявлена как private, а в классе TPASSMomentum как protected. Мы хотели таким образом добраться до приватной переменной. А не тут то было! Если бы мы по какой то причине не могли править модуль PASSIndicators (например, не имели бы исходников), то добраться до FParameters бло бы очень трудно. Таким образом, на примере данной ошибки ясно и понятно показано, в каких случаях нужно объявлять переменные в секции private, и в каких случаях protected. И так, прорезюмирую:
И так мы выяснили, что нам нужно внутренние переменные класса TPASSIndicator объявить как protected. У нас есть исходники мы можем это сделать. Но переписывать модуль PASSIndicators, а заодно и проводить рефреминг кода мы будем на следующем уроке.
Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation".
|
||||||||
Последнее обновление ( 27.07.2013 г. ) |
« След. | Пред. » |
---|