- Код: Выделить всё
Type BErrorInfo = Packed Record
Code: Integer;
Message: String;
End;
// Assert использую для исключений
Procedure Suppose(Const aCondition: Boolean; Const aCode: Integer;
Const aMessage: String; Var aErrorInfo: BErrorInfo); Inline;
..
Procedure Suppose(Const aCondition: Boolean; Const aCode: Integer;
Const aMessage: String; Var aErrorInfo: BErrorInfo);
Begin
If aCondition And (aErrorInfo.Code = 0) Then
Begin
aErrorInfo.Code := aCode;
aErrorInfo.Message := aMessage;
End;
End;
Вызываю так:
- Код: Выделить всё
Procedure BMeasuresControllerClass.RenameMeasure(Const aMeasureID,
aDimensionID: Integer; Const aCaption: String; Out aErrorInfo: BErrorInfo);
Var
aMeasure: BMeasureClass;
Begin
aMeasure := bManager.GetObject(aMeasureID);
Suppose(aMeasure = nil, CODE_FIND, ERROR_UNABLE_FIND, aErrorInfo);
// тут приходится проверять предыдующее предположение
Suppose((aErrorInfo.Code = 0) And (aMeasure.DimensionID = aDimensionID),
CODE_ILLEGAL_DIMENSION, ERROR_ILLEGAL_DIMENSION, aErrorInfo);
If aErrorInfo.Code > 0 Then Exit;
aMeasure := bManager.ChangeObject(aMeasure);
aMeasure.Caption := aCaption;
End;
Решение с проверкой предыдущего предположения мне кажется неудачным и громоздким. Хотелось бы обойтись без него.
В голову мне приходят только 2 варианта - использовать исключения или макрос.
Исключения использовать не хочу - пока в планах их вызывать только в модели, а в контроллере обойтись обычными кодами ошибок - вроде как это сильно быстрее и легче (поправьте, если не прав).
Макрос, который бы разворачивал Suppose(aMeasure = nil, CODE_FIND, ERROR_UNABLE_FIND, aErrorInfo); в
- Код: Выделить всё
If aMeasure = nil Then
Begin
aErrorInfo.Code := CODE_FIND;
aErrorInfo.Message := ERROR_UNABLE_FIND;
Exit;
End;
меня бы устроил более чем полностью. Прочитав документацию по макросам в FPC не понял - можно ли такое сделать. Собственно и вопрос - а можно ли? ^_^
Добавлено спустя 53 минуты 6 секунд:
Удалось сделать костылём:
- Код: Выделить всё
..
Interface
..
Type BErrorInfo = Packed Record
Code: Integer;
Message: String;
End;
Function Suppose(Const aCondition: Boolean; Const aCode: Integer;
Const aMessage: String; Var aErrorInfo: BErrorInfo): Boolean; Inline;
..
Implementation
..
Function Suppose(Const aCondition: Boolean; Const aCode: Integer;
Const aMessage: String; Var aErrorInfo: BErrorInfo): Boolean;
Begin
Result := aCondition;
If aCondition And (aErrorInfo.Code = 0) Then
Begin
aErrorInfo.Code := aCode;
aErrorInfo.Message := aMessage;
End;
end;
..
И вызов:
- Код: Выделить всё
{$define Suggest:=if (aErrorInfo.Code = 0) And Suppose}
{$define So:=Then Exit;}
Procedure BMeasuresControllerClass.RenameMeasure(Const aMeasureID,
aDimensionID: Integer; Const aCaption: String; Out aErrorInfo: BErrorInfo);
Var
aMeasure: BMeasureClass;
Begin
aMeasure := bManager.GetObject(aMeasureID);
Suggest(aMeasure = nil, 1, '', aErrorInfo) So;
Suggest(aMeasure.DimensionID = aDimensionID, 2, '', aErrorInfo) So;
aMeasure := bManager.ChangeObject(aMeasure);
aMeasure.Caption := aCaption;
End;
Не нравятся вопиющие костыльность и чужеродность. Плюс, нужно в каждом модуле прописывать дефайны