[firebase-br] Re: Preciso de ajuda (SOAP) ACHEIIIII!!!!!!

Francisco Thiago jeandeadlucky em yahoo.com.br
Qui Fev 24 11:08:07 -03 2005


Pessoal, encontrei!!!!

No fórum da ClubeDelphi havia uma dica dizendo para reescrever um trecho de 
código num Unit do Delphi.
Refiz conforme o dito e dei um Build All... mas não adiantou.

Então eu fiz uma busca por tudo o que era TypeTrans (o nome da unit) e 
percebi que as .dcu não foram trocadas com a recompilação. O que fiz? 
Adicionei esta unit em um projeto qqr e peguei o .dcu dela e substitui pelos 
antigos. (Exceto as do delphi 2005)

E, senhoras e senhores.... FUNCIONOU!
Passo para você o código: // Comentem a rotina anterior e confiram o erro... 
Eu pensei que só eu fizesse isso... hehehe

function TTypeTranslator.CastSoapToNative(Info: PTypeInfo; const SoapData: 
WideString; NatData: Pointer; IsNull: Boolean): Boolean;
var
  ParamTypeData: PTypeData;
  SavedDecSep: Char; //criei a variavel
begin
  SavedDecSep := DecimalSeparator; //salvei o separador decimal
  try //eu criei este try...finally para voltar o separador original
    DecimalSeparator := '.'; //nesta funcao o delphi muda p/ '.'
    Result := True;
    if IsNull and (Info.Kind = tkVariant) then
    begin
      Variant(PVarData(NatData)^) := NULL;
      Exit;
    end;
    ParamTypeData := GetTypeData(Info);
    case Info^.Kind of
      tkInteger:
        case ParamTypeData^.OrdType of
          otSByte, otUByte:
            PByte(NatData)^ := StrToInt(Trim(SoapData));
          otSWord, otUWord:
            PSmallInt(NatData)^ := StrToInt(Trim(SoapData));
          otSLong, otULong:
            PInteger(NatData)^ := StrToInt(Trim(SoapData));
        end;
      tkFloat:
        case ParamTypeData^.FloatType of
          ftSingle:
            PSingle(NatData)^ := StrToFloatEx(Trim(SoapData));
          ftDouble:
          begin
            if Info = TypeInfo(TDateTime) then
              PDateTime(NatData)^ := XMLTimeToDateTime(Trim(SoapData))
            else
              PDouble(NatData)^ := StrToFloatEx(Trim(SoapData));
          end;
          ftComp:
            PComp(NatData)^ := StrToFloatEx(Trim(SoapData));
          ftCurr:
            PCurrency(NatData)^ := StrToFloatEx(Trim(SoapData));
          ftExtended:
            PExtended(NatData)^ := StrToFloatEx(Trim(SoapData));
        end;
        tkWString:
          PWideString(NatData)^ := SoapData;
        tkString:
          PShortString(NatData)^ := SoapData;
        tkLString:
          PString(NatData)^ := SoapData;
        tkChar:
          if SoapData <> '' then
            PChar(NatData)^ := Char(SoapData[1]);
        tkWChar:
          if SoapData <> '' then
            PWideChar(NatData)^ := WideChar(SoapData[1]);
        tkInt64:
          PInt64(NatData)^ := StrToInt64(Trim(SoapData));
        tkEnumeration:
        { NOTE: Here we assume enums to be byte-size; make sure (specially 
for C++)
        that enums have generated with the proper size }
          PByte(NatData)^ := GetEnumValueEx(Info, Trim(SoapData));
        tkClass:
          ;
        tkSet, tkMethod, tkArray, tkRecord, tkInterface, tkDynArray:
          raise ETypeTransException.CreateFmt(SUnexpectedDataType, [ 
KindNameArray[Info.Kind]] );
        tkVariant:
          CastSoapToVariant(Info, SoapData, NatData);
    end;
  finally
    DecimalSeparator := SavedDecSep; //voltando o decimal separator
  end;
end; 








Mais detalhes sobre a lista de discussão lista