初めて参加させていただき、いきなりの質問で申し訳ありませんが、
どうかお助けください。
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
クーポンサイトを選んで検索♪一番おトクなクーポンをGET!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdk58
-----------------------------------------------------[freeml by GMO]--
> Blobフィールドからの取り出し方が分かりません。
DBX4 / IBX / FIBPlus... Firebird との接続方法はイロイロありますが、
どれを利用しているのかを記載しておくとレスが得られ易いと思います。
質問内容からすると、格納しているデータが PDF であるかどうかは関係なさそうですね。
IBX + Firebird + BLOB のサンプルであれば以下のリンク先にあります。
[IBXを使用した場合の画像(BLOBデータ)の表示 (Delphi Q&A 掲示板)]
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200711/200711_07110038.html
--
by DEKO
-----------------------------
http://ht-deko.minim.ne.jp/
de...@ht-deko.minim.ne.jp
-----------------------------
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
友達の服をこっそり借りちゃお!「おしゃれ泥棒」OPEN!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdmht
> DBX4 / IBX / FIBPlus... Firebird との接続方法はイロイロありますが、
> どれを利用しているのかを記載しておくとレスが得られ易いと思います。
IBXを使っています。
> IBX + Firebird + BLOB のサンプルであれば以下のリンク先にあります。
>
> [IBXを使用した場合の画像(BLOBデータ)の表示 (Delphi Q&A 掲示板)]
> http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200711/200711_07110038.html
「FirebirdのBlob登録できました(?)」と書きましたが、
それは、このリンク先を参考にしてできました。(?)
データは登録されているけれども、内容が確認できないため、詳細不明です。
このサイトに書いてあるのは
BS1 :TStream;
jpg1 :TJPEGImage;
BS1 := IBSQL.CreateBlobStream(IBSQL.FieldByName('PHUTO_Blob'),bmRead);
jpg1 := TJPEGImage.Create;
jpg1.LoadFromStream(BS1);
Image_X.Picture.Graphic := jpg1;
として、JPegを表示していますが、TAcroPDFではLoadFromStreamが使えませんよね?
jpg1 :TJPEGImage;
みたいなPDF用の変数(?)があるのでしょうか?
よろしくお願いします。
by mtan
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
戦国時代の武将達とともに天下統一を目指そう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdpqZ
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
【重要】携帯電話向けMLメールの仕様変更のお知らせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdpVf
// データ登録
procedure TNoticeForm.btnPDFRegClick(Sender: TObject);
var TMS:TMemoryStream;
begin
if pdfDisp.src='' then
begin
ShowMessage('PDFファイルを選択してください。');
Exit;
end;
//
try
TMS:=TMemoryStream.Create;
TMS.LoadFromFile(pdfDisp.src);
//
if not DM.IBTR.InTransaction then DM.IBTR.StartTransaction;
try
with DM.IBQ do
begin
Close;
SQL.Clear;
SQL.Add('insert into PDF_Files (PDF_No,PDF_Files) values(next value for PDF_No,:PDFS)');
ParamByName('PDFS').LoadFromStream(TMS,ftBlob);
ExecSQL;
end;
DM.IBTR.Commit;
except
DM.IBTR.Rollback;
ShowMessage('PDFの登録に失敗しました。');
end;
finally
TMS.Free;
end;
end;
// データ抽出
procedure TNoticeForm.btnSelectClick(Sender: TObject);
var TMS:string;
begin
with DM.IBQ do
begin
Close;
SQL.Clear;
SQL.Add('select * from PDF_Files where PDF_No=1');
Open;
if not DM.IBQ.FieldByName('PDF_Files').IsNull then
TBlobField(DM.IBQ.FieldByName('PDF_Files')).SaveToFile(TMS);
end;
pdfDisp.src:=TMS+'.pdf';
end;
しかし、
TBlobField(DM.IBQ.FieldByName('PDF_Files')).SaveToFile(TMS);
のところで、止まってしまいます。
何か変なことをしていますか?
また、登録すると、レコードが増えているのでうまく行っていると思っていますが、
確認できておりません。
よろしくお願いいたします。
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdsB9
> TAcroPDFではLoadFromStreamが使えませんよね?
Stream に格納できたのであれば、それを MemoryStream 等で
SaveToFile() して TAcroPDF の LoadFromFile() で読みこめばいいと思います。
> TBlobField(DM.IBQ.FieldByName('PDF_Files')).SaveToFile(TMS);
> のところで、止まってしまいます。
"止まる" という状況がよく判らないのですが...
var
IBS: TStream;
MS: TMemoryStream;
dFileName: String;
begin
dFileName := 'C:\TEST\TEST.PDF'; // ワーク
IBS := IBSQL.CreateBlobStream(IBSQL.FieldByName('PDF_Files'), bmRead);
MS := TMemoryStream.Create;
try
IBS.Seek(0, soFromBeginning);
MS.LoadFromStream(IBS);
MS.Seek(0, soFromBeginning);
MS.SaveToFile(dFileName);
AcroPDF1.LoadFile(dFileName);
finally
MS.Free;
IBS.Free;
end;
end;
例えば、このようなコードならその現象を回避する事ができますか?
--
by DEKO
-----------------------------
http://ht-deko.minim.ne.jp/
de...@ht-deko.minim.ne.jp
-----------------------------
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
メンバーで使える掲示板を活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdtkg
procedure TNoticeForm.btnSelectClick(Sender: TObject);
var TMS:TMemoryStream;
TSM:TStream;
dFileName:string;
begin
screen.Cursor:=crHourGlass;
dFileName:='TEST.PDF'; // ワーク
with DM.IBQ do
begin
Close;
SQL.Clear;
SQL.Add('select * from PDF_Files where PDF_No=2');
Open;
if not DM.IBQ.FieldByName('PDF_Files').IsNull then
begin
try
TSM:=DM.IBQ.CreateBlobStream(DM.IBQ.FieldByName('PDF_Files'),bmRead);
TMS:=TMemoryStream.Create;
TSM.Seek(0, soFromBeginning);
TMS.LoadFromStream(TSM);
TMS.Seek(0, soFromBeginning);
TMS.SaveToFile(dFileName);
pdfDisp.LoadFile(dFileName);
finally
TMS.Free;
TSM.Free;
end;
end;
end;
screen.Cursor:=crDefault;
end;
下記の部分はいまだに理解できませんが、
TSM.Seek(0, soFromBeginning);
TMS.LoadFromStream(TSM);
TMS.Seek(0, soFromBeginning);
TMS.SaveToFile(dFileName);
また勉強したいと思います。
これで組織内のペーパーレス化が画期的に進みます。
DEKOさんはじめメンバーの皆さん、本当にありがとうございました。
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdvtQ
補足ですが、
Stream.Seek(0, beginning)
は、ストリームの先頭に巻き戻しているだけです。
CreateBlobStream() で読み込んだ直後、LoadFromStream() した直後の
Position がどうなるのか思い出せなかったので、保険で入れておきました。
また、BLOB フィールドで CreateBlobStream() を使う理由は、
ヘルプの記述にあります。
[DB.TDataSet.CreateBlobStream]
http://docwiki.embarcadero.com/VCL/ja/DB.TDataSet.CreateBlobStream
> ヒント: コードで直接 BLOB ストリームを作成するよりも
> CreateBlobStream を呼び出すことをお勧めします。
> これにより,ストリームがデータセットに対して適切であることが保証されます。
> また,BLOB データを常にメモリに格納するわけではないデータセットが,
> ストリームを作成する前に BLOB データを取り出すことも保証されます。
わざわざこう書いてあるという事は、
"他の方法では適切に読み出せない可能性がある" のかもしれません。
ただ、TBlobField.SaveToFile() も内部で CreateBlobStream() を
呼んでおり、nori さんの方法で失敗する理由がよく解りません。
--
by DEKO
-----------------------------
http://ht-deko.minim.ne.jp/
de...@ht-deko.minim.ne.jp
-----------------------------
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdvNZ
流し読みしただけなんでハズしてる気もしますが、2063 のポストがソースからのコピペであるなら、SaveToFileに渡してるファイル名の変数TMSに値を設定してる箇所がないのでそれが原因かなと。
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
クーポンサイトを選んで検索♪一番おトクなクーポンをGET!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hd2sT
DEKOさん、ありがとうございます。
下記のごとく変更したらうまく行きました。
DEKOさんはじめメンバーの皆さん、本当にありがとうございました。
MLホームページ: http://www.freeml.com/delphi-users
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
「アルテイル」オンラインカードゲームで暇つぶし!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hnZga