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;

Ответить