[Çözüldü] FastReport "Couldnt convert variant of type ...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

[Çözüldü] FastReport "Couldnt convert variant of type ...

Mesaj gönderen omurolmez »

Arkadaşlar merhaba, Fast Report v4.13.1 Delphi 6 EE uygulamamda raporu görüntülemeye çalıştığım sırada "Could not convert variant of type (Array Variant) into type (String)" mesajlı EVariantTypeCastError istisnası oluşuyor.

Raporda tanımlı bileşenler üzerinde (view, richview ve image bileşenleri) ' [[tabloadi."alanadi"]+[COPY(tabloadi."alanadi", 1, 1)]+[tabloadi."alanadi"]] biçiminde scriptler var. Bu scriptleri kaldırdığımda istisna oluşmuyor. Öte yandan, istisnanın TfrxReport bileşeni Calc işlevinde oluştuğunu gördüm. Anladığım kadarıyla, rapordaki bileşenler script ifadelerini raporun Calc işlevine geçiyorlar ve sonucu string tanımlı Text özelliklerine atıyorlar. İşlev bir şekilde, Variant yerine VariantArray döndürüyor ve VariantArray tipi string tipine atanamadığı için de istisna çıkıyor.

Peki neden ? Bu konuda fikri olan varsa, şimdiden teşekkürler ...

Kod: Tümünü seç

function TfrxReport.Calc(const Expr: String; AScript: TfsScript = nil): Variant;
var
  ErrorMsg: String;
  CalledFromScript: Boolean;
begin
  CalledFromScript := False;
  if Integer(AScript) = 1 then
  begin
    AScript := FScript;
    CalledFromScript := True;
  end;
  if AScript = nil then
    AScript := FScript;
  if not DoGetValue(Expr, Result) then
  begin
    Result := FExpressionCache.Calc(Expr, ErrorMsg, AScript);
    if ErrorMsg <> '' then
    begin
      if not CalledFromScript then
      begin
        if FCurObject <> '' then
          ErrorMsg := FCurObject + ': ' + ErrorMsg;
        FErrors.Add(ErrorMsg);
      end
      else ErrorMsg := 'Error in Calc expression: ' + ErrorMsg;
      raise Exception.Create(ErrorMsg);
    end;
  end;
end;
Ömür Ölmez
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: [Çözüldü] FastReport "Couldnt convert variant of type ..

Mesaj gönderen omurolmez »

TfrxExpressionCache nesnesinin bir örneğini oluşturarak, TfrxReport nesnesinin OnGetValue olayında kullandım. Böylece eğer VarArray dönerse ilk elemanını kullandım.

FormCreate içinde,

Kod: Tümünü seç

 FExpressionCacheS :=TfrxExpressionCacheS.Create(Rapor1.Script);
 FExpressionCacheS.ScriptLanguage :=Rapor1.ScriptLanguage;
 FExpressionCacheS.CaseSensitive :=Rapor1.CaseSensitiveExpressions;
ve raporun OnGetValue olayında,

Kod: Tümünü seç

 Value :=FExpressionCacheS.Calc(VarName, ErrorMsg, Rapor1.Script);
 if VarIsArray(Value) then
   Value :=Value[VarArrayLowBound(Value, 1)];
Ömür Ölmez
Cevapla