Frage
Ich möchte meine Anwendung von Indy 9 bis 10 mit Delphi 2007 aktualisieren. Jetzt ist dies nicht mehr kompiliert, da Decodetostream nicht gefunden wird. Der Code verwendet kühne Framwork, da es auf Bolderement bezeichnet wird.
Irgendwelche alternativen Methoden zum Aufrufen?
AKTUALISIEREN (Ich denke, ich vereinfache das vorherige Beispiel zu viel)
Ursprünglicher Code:
BlobStreamStr : String;
MIMEDecoder : TidDecoderMIME;
if (BoldElement is TBATypedBlob) then
begin
BlobStreamStr := copy(ChangeValue,pos(']',ChangeValue)+1,maxint);
(BoldElement as TBATypedBlob).ContentType := copy(ChangeValue,2,pos(']',ChangeValue)-2);
MIMEDecoder := TidDecoderMIME.Create(nil);
try
MIMEDecoder.DecodeToStream(BlobStreamStr,(BoldElement as TBATypedBlob).CreateBlobStream(bmWrite));
finally
FreeAndNil(MIMEDecoder);
end;
end
Nach meiner Änderung:
BlobStreamStr : String;
MIMEDecoder : TidDecoderMIME;
LStream : TIdMemoryStream;
if (BoldElement is TBATypedBlob) then
begin
BlobStreamStr := copy(ChangeValue, pos(']', ChangeValue) + 1, maxint);
(BoldElement as TBATypedBlob).ContentType := copy(ChangeValue, 2, pos(']',ChangeValue)-2);
MIMEDecoder := TidDecoderMIME.Create(nil);
LStream := TIdMemoryStream.Create;
try
MIMEDecoder.DecodeBegin(LStream);
MIMEDecoder.Decode(BlobStreamStr, 0, Length(BlobStreamStr));
LStream.Position := 0;
ReadTIdBytesFromStream(LStream, DecodedBytes, Length(BlobStreamStr));
// Should memory for this stream be released ??
(BoldElement as TBATypedBlob).CreateBlobStream(bmWrite).Write(DecodedBytes[0], Length(DecodedBytes));
finally
MIMEDecoder.DecodeEnd;
FreeAndNil(LStream);
FreeAndNil(MIMEDecoder);
end;
end
Aber ich bin in all meinen Veränderungen nicht zuversichtlich, da ich Indy nicht so sehr kenne. Alle Kommentare sind also willkommen. Eine Sache, die ich nicht verstehe, ist der Anruf bei CreateBlobStream. Ich sollte mich bei FastmM erkundigen, damit es kein Memleak ist.
Lösung
Die Verwendung von TIDDECODER.decodeBegin () ist der richtige Weg, um zu einem TStream zu dekodieren. Sie benötigen jedoch nicht den mittleren TidMemoryStream (das übrigens seit langem nicht mehr in Indy 10 existiert - ein Upgrade auf eine neuere Veröffentlichung in Betracht ziehen). Sie können den Blob -Stream stattdessen direkt übergeben, zum Beispiel:
var
BlobElement : TBATypedBlob;
BlobStreamStr : String;
BlobStream : TStream;
MIMEDecoder : TidDecoderMIME;
begin
...
if BoldElement is TBATypedBlob then
begin
BlobElement := BoldElement as TBATypedBlob;
BlobStreamStr := Copy(ChangeValue, Pos(']',ChangeValue)+1, Maxint);
BlobElement.ContentType := Copy(ChangeValue, 2, Pos(']',ChangeValue)-2);
BlobStream := BlobElement.CreateBlobStream(bmWrite);
try
MIMEDecoder := TidDecoderMIME.Create(nil);
try
MIMEDecoder.DecodeBegin(BlobStream);
try
MIMEDecoder.Decode(BlobStreamStr);
finally
MIMEDecoder.DecodeEnd;
end;
finally
FreeAndNil(MIMEDecoder);
end;
finally
FreeAndNil(BlobStream);
end;
end;
...
end;
Andere Tipps
Ja, sie haben sich zwischen 9 und 10 sehr verändert.
Jetzt haben Sie "DecodeBytes" anstelle von Decodetostream, denke ich. Also so etwas sollte es tun:
var
DecodedBytes: TIdBytes;
begin
MIMEDecoder := TidDecoderMIME.Create(nil);
try
DecodedBytes := MIMEDecoder.DecodeBytes(vString);
vStream.Write(DecodedBytes[0], Length(DecodedBytes));
finally
FreeAndNil(MIMEDecoder);
end;
end;