Oleg LOA wrote:
GPF внутри кода функции. Показывай код короче этой UDF, падает именно внутри
неё.
Надеюсь нопобют меня за такои бальшои пост:
Идея тут простая - первии и второи параметр ето кокаята цифра которую
сравнимаем с ACriticalLow и ACriticalHigh. Если ниже ACriticalLow то
резултат -1 если выше ACriticalHigh то 1. Если внорме то 0;
ATextValuе пытаемся преобразить в цифру, если удаётся то сравниваем.
Если в неи первы симбол < или > а за ним цифра, то опять пытаемся
сравнивать ...
Вроде негде невыжу где можно падать :(
Try Except вроде как нехочется ставить, а то ето по медицине всё и можно
забыть врачу сообшить что пациентy через 10 минут кранты ...
Function CheckCriticalRange(ANumericValue: PUDFParam; ATextValue
:PUDFParam; ACriticalLow :PUDFParam; ACriticalHigh :PUDFParam): Integer;
Cdecl; Export;
Var leNumericValue :Extended;
leCriticalLow :Extended;
leCriticalHigh :Extended;
lsTextValue :String;
Code :Integer;
Begin
Result := 0;
If (UDF_IsNull(ANumericValue^) And UDF_IsNull(ATextValue^)) Or
(UDF_IsNull(ACriticalLow^) And UDF_IsNull(ACriticalHigh^)) Then
Exit
Else Begin
If Not UDF_IsNull(ANumericValue^) Then Begin
UDF_GetScaledReal(ANumericValue^, leNumericValue);
If Not UDF_IsNull(ACriticalLow^) Then Begin
UDF_GetScaledReal(ACriticalLow^, leCriticalLow);
If leNumericValue <= leCriticalLow Then Begin
Result := -1;
Exit;
End;
End;
If Not UDF_IsNull(ACriticalHigh^) Then Begin
UDF_GetScaledReal(ACriticalHigh^, leCriticalHigh);
If leNumericValue >= leCriticalHigh Then Begin
Result := 1;
Exit;
End;
End;
End
Else Begin
UDF_GetString(ATextValue^, lsTextValue);
lsTextValue := Trim((ReplaceStr(lsTextValue,',','.')));
Val(lsTextValue, leNumericValue, Code);
If Code <> 0 Then Begin
If (Copy(lsTextValue,1,1) <> '<') Or (Copy(lsTextValue,1,1) <>
'>') Then
Exit;
Val(Copy(lsTextValue,2,Pred(Length(lsTextValue))),
leNumericValue, Code);
If Code <> 0 Then
Exit;
If Not UDF_IsNull(ACriticalLow^) Then
If (Copy(lsTextValue,1,1) = '<') And
UDF_GetScaledReal(ACriticalLow^, leCriticalLow) Then
If leNumericValue <= leCriticalLow Then Begin
Result := -1;
Exit;
End;
If Not UDF_IsNull(ACriticalHigh^) Then
If (Copy(lsTextValue,1,1) = '>') And
UDF_GetScaledReal(ACriticalHigh^, leCriticalHigh) Then
If leNumericValue >= leCriticalHigh Then Begin
Result := 1;
Exit;
End;
End
Else Begin
If Not UDF_IsNull(ACriticalLow^) Then
If UDF_GetScaledReal(ACriticalLow^, leCriticalLow) Then
If leNumericValue <= leCriticalLow Then Begin
Result := -1;
Exit;
End;
If Not UDF_IsNull(ACriticalHigh^) Then
If UDF_GetScaledReal(ACriticalHigh^, leCriticalHigh) Then
If leNumericValue >= leCriticalHigh Then Begin
Result := 1;
Exit;
End;
End;
End;
End;
End;