[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