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.

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top