Тема: Помилка в Case..Of..Else: Очікується постійний вираз!
Вітаю Незламні! Як виправити помилку "Очікується постійний вираз!" в конструкції Case..Of..Else. Ось метод в якому є конструкція Case..Of..Else:
// Метод повертає позицію оператора найвищого пріорітету в підвиразі, якщо оператор не знайдено повертає 0
Function TOperand.PositionOperator(Const PExpression: String): UInt64;
Begin
Case True Of
OperatorInExpression('^', PExpression): Result := PositionInExpression('^', PExpression);
OperatorInExpression('√', PExpression): Result := PositionInExpression('√', PExpression);
OperatorInExpression('*', PExpression): Result := PositionInExpression('*', PExpression);
OperatorInExpression('/', PExpression): Result := PositionInExpression('/', PExpression);
OperatorInExpression('+', PExpression): Result := PositionInExpression('+', PExpression);
OperatorInExpression('-', PExpression):
Begin
For Var I := 1 To LengthExpression(PExpression) Do
If (I = 1) And (PExpression[i] = '-') Then
Continue
Else If (PExpression[i] = '-') Then
Begin
Result := I;
Break
End
End
Else Result := 0
End
End;
Тут видає помилку що булева функція: OperatorInExpression() не є постійним виразом. Через If..Then..Else все працює, та код погано читабельний:
// Метод повертає позицію оператора найвищого пріорітету в підвиразі, якщо оператор не знайдено повертає 0
Function TOperand.PositionOperator(Const PExpression: String): UInt64;
Begin
// Якщо жодного оператора не знайдено, повертаємо 0
Result := 0;
If OperatorInExpression('^', PExpression) Then
Result := PositionInExpression('^', PExpression)
Else If OperatorInExpression('√', PExpression) Then
Result := PositionInExpression('^', PExpression)
Else If OperatorInExpression('*', PExpression) Or OperatorInExpression('/', PExpression) Then
Begin
// Від початку виразу і до кінця виразу Виконати
For Var I := 1 To LengthExpression(PExpression) Do
// Якщо символ виразу є оператор '*' Або оператор '/' То
If (PExpression[i] = '*') Or (PExpression[i] = '/') Then
Begin
Result := I; // Результату присвоюємо позицію оператора
Break // Виходимо з циклу
End
End
Else If OperatorInExpression('+', PExpression) Or OperatorInExpression('-', PExpression) Then
Begin
// Від початку виразу і до кінця виразу Виконати
For Var I := 1 To LengthExpression(PExpression) Do
Begin
// Якщо першим символом іде оператор - То
If (I = 1) And (PExpression[i] = '-') Then
Continue // переходимо до наступної ітерації циклу
// Інакше, Якщо символ виразу є оператор '+' Або оператор '-' То
Else
If (PExpression[i] = '+') Or (PExpression[i] = '-') Then
Begin
Result := I; // Результату присвоюємо позицію оператора
Break // Виходимо з циклу
End
End
End
End;
Що в такому випадку можна зробити? Переписати через конструкцію If..Then..Else, чи можливо якось виправити помилку в Case..Of..Else?
Реалізація методів OperatorInExpression() та PositionInExpression описана нижче:
// Метод повертає Істина якшо у виразі знайдено математичний оператор
Function TOperand.OperatorInExpression(Const POperator: WideChar; Const PExpression: String): Boolean;
Begin
Result := False;
For Var Op In PExpression Do
If Op = POperator Then
Begin
Result := True;
Exit
End
End;
// Метод повертає першу позицію підвиразу знайденого в виразі
Function TSystemUtilities.PositionInExpression(Const PSubExpression, PExpression: String): UInt64;
Var
J: UInt64; // Лічильники для циклу, визначає поточну позицію в підвиразі
Begin
Result := 0; // Ініціалізуємо результат нулем
// Пошук першого символу підвиразу в виразі
For Var I := 1 To LengthExpression(PExpression) Do
Begin
// Якщо символ виразу співпадає з першим символом підвиразу То
If PExpression[i] = PSubExpression[1] Then
Begin
// Порівнюємо підвираз з виразом, перевіряючи кожен символ
J := 1; // Стаємо на перший символ підвиразу
// Поки символ підвиразу <= довжини підвиразу І символи виразу та підвиразу співпадають Виконати
While (J <= LengthExpression(PSubExpression)) And
(I + J - 1 <= LengthExpression(PExpression)) And // Відповідний символ виразу < за довжину виразу І
(PExpression[I + J - 1] = PSubExpression[J]) Do // Символи виразу та підвиразу співпадають Виконати
IncreaseByOne(J); // Переходимо до наступного символу підвиразу
// Якщо всі символи підвиразу співпали з виразом То
If J > LengthExpression(PSubExpression) Then
Begin
Result := I; // Повертаємо позицію, з якої починається підвираз у виразі
Exit; // Виходимо з функції
End
End
End
End;