3

Delphi 2006で開発された古いアプリケーションがあり、でいくつかの変更を加える必要があります。

このアプリでは、MsSQLの「画像」フィールドから画像を読み込んでいますが、delphi 2010でコンパイルすると、「発生した例外クラスEJPEGとメッセージ「JPEGエラー#51」」というエラーが表示されます。

データベースから画像を取得するコード:

aStream := TMemoryStream.Create;
Try
If LoadFromBlob(FieldByName('Picture'), aStream) then
begin
    Pic:=TJpegImage.Create;

    try
        Try
            Pic.LoadFromStream(aStream);
            Picture.Assign(Pic); // <------ JPEG Error #51 here w D2010
        Except
            //something went wrong loading
            HandleImageError();    
        End;

    finally
     Pic.Free;
    end;

end;
Finally
    aStream.Free;
End;

// ............

function LoadFromBlob(const AField: TField; const Stream: TStream): boolean;
var
    ResultStr: string;
    PResultStr: PChar;
begin
    Result := false;
    if (Assigned(AField)) and (Assigned(Stream)) then begin
        try
            ResultStr := AField.Value;
            If ResultStr <> '' then
            begin
                PResultStr := PChar(ResultStr);
                Stream.Write(PResultStr^, Length(ResultStr));
                Stream.Seek(0,0);
                Result := true;
            end;
        except
        end;
    end;
end;

少しグーグルして、エラー#51が意味することを発見しました:JERR_NO_QUANT_TABLE、それが意味するものは何でも。

Delphi 2006でコンパイルすると、同じコードがエラーなしで正常に動作するので、D2010の何が問題になっていますか?

4

4 に答える 4

4

D2010では、CharがAnsiからUnicodeに変更されました。これは、1バイトではなく2バイトを占めることを意味します。LoadFromBlobの変数をAnsiStringとPAnsiCharに変更すると、機能するはずです。

更新:Field.Value(Variant)の代わりに、Field.AsAnsiStringにアクセスする方がよいでしょう。バリアントアクセスには、エラーを引き起こす暗黙のUnicode->Ansi変換が含まれる場合があります。

于 2010-09-01T13:12:18.840 に答える
3

かなり厄介な方法を使用して、blobフィールドをストリームに保存しています。TBlobField.SaveToStreamを使用しないのはなぜですか?

于 2010-09-01T14:18:03.027 に答える
1

aStreamをファイルに保存し、16進エディターで調べます。D2006とD2010の結果を比較します。そこにあるものは、JPEGヘッダーとは関係がなく、Unicode/Widecharの問題である可能性が高いことを納得させるはずです。

于 2010-09-01T14:04:33.857 に答える
1

とにかくなぜ弦を越えて行くのですか?ストリームに直接書き込むのはどうですか?画像フィールドはおそらくTBlobFieldまたはTGraphicFieldです。それらには、ニーズに完全に適合するSaveToStreamメソッドがあります。

于 2010-09-01T14:19:43.837 に答える