Проводим рефакторинг и дальнейшую отладку класса TPASSMomentum (Delphi 7: отладчик, private, protected, поиск)
Сегодня мы займемся переписыванием кода модуля PASSIndicators. Начнем с класса TPASSIndicator. Вот как он у нас объявлен:
TPASSIndicator=Class(TPASSAbstractDataSource) private FParameters:TPASSParameters; // значения параметров индикатора. FPriceSource:TPASSPriceSource; // источник котировок. procedure SetPriceSource(APriceSource:TPassPriceSource); procedure UpdateParameters; virtual; abstract; public constructor Create; property PriceSource:TPASSPriceSource read FPriceSource write SetPriceSource; procedure SetParameterByName(AParameterName:string; AParameterValue:Variant); virtual; function GetParameterByName(AParameterName:string):Variant; virtual; function GetResultByFieldName(AFieldName:string):double; virtual; abstract; function GetResultByFieldNameAndIndex(FieldName:string; Index:LongInt):double; virtual; abstract; function GetResultByFieldNum(AFieldName:integer):double; virtual; abstract; function GetResultByFieldNumAndIndex(FieldName:Integer; Index:LongInt):double; virtual; abstract; procedure First; virtual; abstract; procedure Last; virtual; abstract; function Next:boolean; virtual; abstract; function Prev:boolean; virtual; abstract; function GetIndicatorName:string; virtual; abstract; Destructor Destroy; virtual; end; |
А мы сделаем объявление таким (изменения выделены красным цветом):
TPASSIndicator=Class(TPASSAbstractDataSource) protected FParameters:TPASSParameters; // значения параметров индикатора. FPriceSource:TPASSPriceSource; // источник котировок. procedure SetPriceSource(APriceSource:TPassPriceSource); procedure UpdateParameters; virtual; abstract; procedure AfterConstruction; override; public constructor Create; property PriceSource:TPASSPriceSource read FPriceSource write SetPriceSource; procedure SetParameterByName(AParameterName:string; AParameterValue:Variant); virtual; function GetParameterByName(AParameterName:string):Variant; virtual; function GetResultByFieldName(AFieldName:string):double; virtual; abstract; function GetResultByFieldNameAndIndex(FieldName:string; Index:LongInt):double; virtual; abstract; function GetResultByFieldNum(AFieldName:integer):double; virtual; abstract; function GetResultByFieldNumAndIndex(FieldName:Integer; Index:LongInt):double; virtual; abstract; procedure First; virtual; abstract; procedure Last; virtual; abstract; function Next:boolean; virtual; abstract; function Prev:boolean; virtual; abstract; function GetIndicatorName:string; virtual; abstract; Destructor Destroy; virtual; end; |
procedure TPASSIndicator.AfterConstruction; begin UpdateParameters; end;< |
Теперь запускаем программу и вылавливаем еще один "баг" - у нас ругается на строку
lbResult.Caption:= intToStr(FIndicator.GetParameterByName('Value'));
Все верно, это ошибка. Вместо нее следует записать
lbResult.Caption:= FloatToStr(FIndicator.GetResultByFieldName('Value'));
Иными словами, для вычисления результата индикатора нам нужно пользоваться не функцией GetParameterByName, а функцией GetResultByFieldName.
После исправления опять запускаем программу и получаем новое сообщение об ошибке:
Данное сообщение достаточно информативно, и мы, не пользуясь отладчиком вполне можем найти, где ошибка. Должны быть, мы где то указали 'PriceFieldType' dvtcnj PriceFieldType. Иными словами, обращаемся к полю "PriceFieldType", которого у нас действительно нет, вместо того, что бы обратимся к полю, имя которого у нас хранится в переменной PriceFieldType.
Для поиска просто воспользуемся поиском. Входим в пункт меню "Search" --> "Find"*
Находим и исправляем эту строку*:
Пишем вместо неправильной строки правильную:
Pbeg:=FPriceSource.GetDataByFieldNameAndIndex(FPriceFieldType,FPriceSource.CurrentItemIndex-FDT);
Запускаем программу, тестируем снова. На этот раз она выдает какой то результат:
Правда, тестирование на этом не кончается. Теперь нам нужно проверить, а правильный ли результат выдала программа. Но этим мы займемся на следующем уроке.
Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation"
Источник: http://easyprog.ru/index.php?option=com_content&task=view&id=78&Itemid=44
Не поленитесь ребята , сходите на их сайт , там много интересного