掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Photoshop 7 で作成したBitmapを読み込むには? (ID:11214)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
推定有罪さん write > Stream.ReadBuffer(BitsMem^, ImageSize); の行の前に > ImageSize := ImageSize + 1; > を追加すればすべてのBitmapが EReadError例外を出すことから分かる。 試してみると確かにそのとおりです。 私も同じような原因しか考えられなかったのですが、 TFileStream.Read を私なりにテストしてみると、「そう厳密ではない」という結果が出ます。そこで解らなくなりました。 確保したバッファのサイズが読み込み指定サイズより1バイト少ないときはまずエラーにならない。 4バイト少ないと必ずエラーとなる。 2,3バイト少ない場合はケースバイケース。 エラーといっても、「無効なポインタ操作」というメッセージで、 TFileStream.Read が返す読み込めたサイズには問題がない。 しかし、推定有罪さんの指摘どおりにすると、厳密にエラーとなる。 TStream は今回が初めての経験なので、初歩的な考え違いが私にあるような気がします。 私がテストしたコードを載せますので、コメントしてくださる方があれば幸いです。 環境 Delphi7, Windows2000 SP4 ----------------------------------------------------------------- function GetFileSize(PathFName: string): integer; procedure OnlyNumber(var Key: Char; flgMark, flgReal: Boolean); implementation {$R *.dfm} function GetFileSize(PathFName: string): integer; var SearchRec: TSearchRec; Res: Integer; begin Res := Findfirst(PathFName, faAnyFile, SearchRec); if Res = 0 then Result := SearchRec.Size else Result := 0; end; procedure OnlyNumber(var Key: Char; flgMark, flgReal: Boolean); begin //数字が見つからなかったら if (Pos(Key, '0123456789')=0) and (Key <> #8) and (Key <> #13) and (Key <> '-') and (Key <> '.') then begin Key := #0; //無視する end else begin if (not flgMark) and (Key = '-') then Key := #0; //無視する if (not flgReal) and (Key = '.') then Key := #0; //無視する end; end; procedure TForm1.Button1Click(Sender: TObject); begin if not OpenDialog1.Execute then Exit; Memo1.Clear; Memo1.Lines.Add('FileName: ' + ExtractFileName(OpenDialog1.FileName)); Edit1.Text := '0'; Button2.Enabled := true; end; procedure TForm1.Button2Click(Sender: TObject); var FStream: TFileStream; FileSize, ReadSize, DecCount, BuffSize: Integer; Buff: Pointer; begin Memo1.Clear; Memo1.Lines.Add('FileName: ' + ExtractFileName(OpenDialog1.FileName)); FStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); try FileSize := GetFileSize(OpenDialog1.FileName); Memo1.Lines.Add('FileSize=ReadSize: ' + IntToStr(FileSize)); DecCount := StrToInt(Edit1.Text); BuffSize := FileSize - DecCount; GetMem(Buff, BuffSize); Memo1.Lines.Add('BuffSize: ' + IntToStr(BuffSize)); try ReadSize := FStream.Read(Buff^, FileSize); Memo1.Lines.Add('ReadedSize: ' + IntToStr(ReadSize)); finally FreeMem(Buff, BuffSize); // ポインタ操作エラー発生ケ所 end; finally FStream.Free; end; if ReadSize = FileSize then Memo1.Lines.Add(#13#10 + 'エラーなし') else Memo1.Lines.Add(#13#10 + 'エラー!!'); end; procedure TForm1.FormCreate(Sender: TObject); begin Button2.Enabled := false; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin OnlyNumber(Key, false, false); end; procedure TForm1.Edit1Click(Sender: TObject); begin Edit1.SelStart := 0; Edit1.SelLength := Length(Edit1.Text); end; procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_Return then Button2Click(Sender); end; ----------------------------------------------------------------
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.