Mainfrm.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:3k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit Mainfrm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, DB, DBTables, StdCtrls, OleCtnrs;
  6. type
  7.   TForm1 = class(TForm)
  8.     Database1: TDatabase;
  9.     Table1: TTable;
  10.     Button1: TButton;
  11.     OpenDialog1: TOpenDialog;
  12.     Button2: TButton;
  13.     Doc_Ole: TOleContainer;
  14.     procedure Button1Click(Sender: TObject);
  15.     procedure Button2Click(Sender: TObject);
  16.   private
  17.     { Private declarations }
  18.   public
  19.     { Public declarations }
  20.   end;
  21. var
  22.   Form1: TForm1;
  23. implementation
  24. {$R *.dfm}
  25. procedure TForm1.Button1Click(Sender: TObject);
  26. var
  27.   MemSize: Integer;
  28.   Buffer: PChar;
  29.   MyFile: TFileStream;
  30.   Stream: TBlobStream;
  31. begin
  32.   OpenDialog1.Filter := 'WORD文档(*.DOC)|*.DOC'; {从对话窗选择文件}
  33.   if OpenDialog1.Execute then begin
  34.     MyFile := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
  35.   //判断word文件大小是否大于BDE blobSize属性
  36.     Listparam := TStringlist.Create;
  37.     database1.Session.GetAliasParams('test', ListParam);
  38.     blobSize := strToInt(ListParam.Values['Blob size']);
  39.     if (myfile.Size) div 1024 > blobSize then
  40.       raise exception.Create('word文件大于指定的大小');
  41.    //将Doc文件转换成文件流
  42.     with table1 do
  43.     begin
  44.       Open;
  45.       insert;
  46.       FieldByName('id').Value := 1;
  47.       //将Doc字段的值存到Stream变量中,并标明Stream是可写的
  48.       Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmWrite);
  49.       MemSize := MyFile.Size;
  50.       Inc(MemSize);
  51.       //给缓冲区分配大小
  52.       Buffer := AllocMem(MemSize);
  53.       try
  54.         //将Stream的指针移到最前面
  55.         Stream.Seek(0, soFromBeginning);
  56.         //将MyFile文件流读到Buffer缓冲区中
  57.         MyFile.Read(Buffer^, MemSize);
  58.         //将缓冲区的内容写到Stream
  59.         Stream.Write(Buffer^, MemSize);
  60.       finally
  61.         MyFile.Free;
  62.         Stream.Free;
  63.       end;
  64.       try
  65.         //保存表的修改
  66.         Post;
  67.       except
  68.       end;
  69.     end;
  70.     //Doc_ole是TOleContainer控件,放在窗体上,用它来显示Word文档
  71.     Doc_ole.CreateObjectFromFile(OpenDialog1.FileName, False);
  72.     Doc_ole.Run;
  73.   end;
  74. end;
  75. procedure TForm1.Button2Click(Sender: TObject);
  76. var
  77.   MemSize: Integer;
  78.   Buffer: PChar;
  79.   MyFile: TFileStream;
  80.   Stream: TBlobStream;
  81. begin
  82.   //创建一个临时文件
  83.   MyFile := TFileStream.Create('c:temp.tmp', fmCreate);
  84.   with Table1 do
  85.   begin
  86.     //将Doc字段的内容读到Stream中
  87.     Stream := TBlobStream.Create
  88.       (FieldByName('Doc') as TBlobField, bmRead);
  89.     MemSize := Stream.Size;
  90.     Inc(MemSize);
  91.     //分配缓冲区的大小
  92.     Buffer := AllocMem(MemSize);
  93.     try
  94.       //将Stream的字节读到Buffer缓冲区中
  95.       Stream.Read(Buffer^, MemSize);
  96.       //将Buffer缓冲区的内容读到MyFile文件流中
  97.       MyFile.Write(Buffer^, MemSize);
  98.     finally
  99.       MyFile.Free;
  100.       Stream.Free;
  101.     end;
  102.   end;
  103.   //如果存在'c:temp.doc'则删除
  104.   if FileExists('c:temp.DOC') then
  105.     DeleteFile('c:temp.DOC');
  106.   if FileExists('c:temp.tmp') then
  107.   begin
  108.     //重命名临时文件,将其后缀改为.Doc
  109.     RenameFile('c:temp.tmp', 'c:temp.DOC');
  110.     //用Doc_Ole控件来显示Word文档
  111.     Doc_ole.CreateObjectFromFile('c:temp.DOC', False);
  112.     Doc_ole.Run;
  113.   end;
  114. end;
  115. end.