问题说明:
    把网页内容(webbrowser1中的内容)以流的方式写入数据库中,然后再以流的方式读出来.
问题描述:数据库表中同时有rtf文件流和html文件流.根据表中html标示来判断是rth文件流还是html文件流.
   再读文件流的时候,根据是rtf文件流则加载frmrtf窗体,显示rtf文件;
      如果是html文件流则加载frmHTML窗体.
出现的问题.
    从主窗体如果先读取一个html文件流也就是先加载frmhtml窗体然后再加载一个rtf文件流即使frmrtf窗体加载.然后再加载一个html文件流,就是frmhtml再次加载,那么问题出现了webbrowser1的没有内容空白.若再接着加载另外一个html文件流有正常.
    从主窗体另外如果先加载rtf文件,然后再加载html文件则正常.
部分代码如下:
if frmRTF.Visible then frmRTF.Close ;
          if  not frmHTML.Visible then
          begin
             frmHTML.Parent:=frmMain.Panel1 ;
             URL := 'about:blank';
             frmHTML.WebBrowser1.Navigate(URL);
            // frmHTML.WebBrowser1.Navigate('about:blank'
             frmHTML.Show ;
             frmHTML.Visible:=true; ;            //浏览器工具栏可用
             frmMain.ToolBar3.Enabled :=true;
          end;
          *****读取html文件流重数据库中
另外再frmHTML关闭的时候没有做任何处理.另外一个问题,如果webbrowser1的内容是直接输入网址打开则可以编辑如果从数据库读入则不能编辑(空白)不能得到HTML代码.
这两个问题可以总共给分500分.解决后另外开贴给分.
     

解决方案 »

  1.   

    全部代码如下function TFrmMain.LoadFileFormTable(var Table:TAdoTable;pDirID:longint):Boolean;
     var
        Ms:TStream;
        ps: IPersistStreamInit;
        sa: IStream;
        URL:string;
     begin
      Table.TableName :='file';
      Table.Filtered :=false;
      table.Filter :='DirID=' +intTostr(currID);
     // showmessage(table.Filter );
      table.Filtered :=true;
        try
          Table.Open ;
          if Table.Recordset.RecordCount >0 then   //如果记录存在
          begin
            if Table.FieldByName('html').AsBoolean=false then
            //读取rtf文档
            begin
              Ms:=Table.CreateBlobStream(Table.FieldByName('FileContent'),bmRead);
              if frmHTML.Visible then
              begin
              frmHTML.Close ;
              frmMain.ToolBar3.Enabled :=false;
              end;
              if not frmRTF.Visible then frmRTF.Visible:=true;
              frmRTF.Show;
              frmRTF.Visible :=true;
              frmRTF.RichEdit21.Lines.LoadFromStream(Ms);
              ms.Free ;
              //frmHTML.Hide  ;
              table.Close ;
              if frmHTML.Visible then showmessage('HTML is show now');
              result:=true;
              exit;
            end
            else //如果是Html文档
            begin
              Ms:=TStream.create;
              Ms:=Table.CreateBlobStream(Table.FieldByName('FileContent'),bmRead);
              Ms.Position :=0;
              if frmRTF.Visible then frmRTF.Close ;
              if  not frmHTML.Visible then
              begin
                 frmHTML.Parent:=frmMain.Panel1 ;
                 URL := 'about:blank';
                 frmHTML.WebBrowser1.Navigate(URL);
                // frmHTML.WebBrowser1.Navigate('about:blank'
                 frmHTML.Show ;
                 frmHTML.Visible:=true; ;            //浏览器工具栏可用
                 frmMain.ToolBar3.Enabled :=true;
              end;
                 *****读取html文件流*****
              frmHTML.WebBrowser1.Update ;
              frmHTML.Update ;
              ms.Free ;
              Table.Close ;
              if frmRTF.Visible then showMEssage('frmRTR is show now');
              result:=true;
              exit;
            end;
          end
          else
            table.Close ;
            exit;
            result:=false;
        except
          Table.Close ;
          result:=false;
        end;
    end;
      

  2.   

    *****读取html文件流*****
    这里的代码就是显示啊不过我没有写出来而已.
    另外其实那个问题是内容闪一下变空白而已.
    我现在贴完整大代码
    如下:
    function TFrmMain.LoadFileFormTable(var Table:TAdoTable;pDirID:longint):Boolean;
     var
        Ms:TStream;
        ps: IPersistStreamInit;
        sa: IStream;
        URL:string;
     begin
      Table.TableName :='file';
      Table.Filtered :=false;
      table.Filter :='DirID=' +intTostr(currID);
     // showmessage(table.Filter );
      table.Filtered :=true;
        try
          Table.Open ;
          if Table.Recordset.RecordCount >0 then   //如果记录存在
          begin
            if Table.FieldByName('html').AsBoolean=false then
            //读取rtf文档
            begin
              Ms:=Table.CreateBlobStream(Table.FieldByName('FileContent'),bmRead);
              if frmHTML.Visible then
              begin
              frmHTML.Close ;
              frmMain.ToolBar3.Enabled :=false;
              end;
              if not frmRTF.Visible then frmRTF.Visible:=true;
              frmRTF.Show;
              frmRTF.Visible :=true;
              frmRTF.RichEdit21.Lines.LoadFromStream(Ms);
              ms.Free ;
              //frmHTML.Hide  ;
              table.Close ;
              if frmHTML.Visible then showmessage('HTML is show now');
              result:=true;
              exit;
            end
            else //如果是Html文档
            begin
              Ms:=TStream.create;
              Ms:=Table.CreateBlobStream(Table.FieldByName('FileContent'),bmRead);
              Ms.Position :=0;
              if frmRTF.Visible then frmRTF.Close ;
              if  not frmHTML.Visible then
              begin
                 frmHTML.Parent:=frmMain.Panel1 ;
                 URL := 'about:blank';
                 frmHTML.WebBrowser1.Navigate(URL);
                // frmHTML.WebBrowser1.Navigate('about:blank'
                 frmHTML.Show ;
                 frmHTML.Visible:=true; ;            //浏览器工具栏可用
                 frmMain.ToolBar3.Enabled :=true;
              end;
              ps := frmHTML.WebBrowser1.Document as IPersistStreamInit;
              sa:=TStreamAdapter.Create(Ms,soReference)as IStream;
              ps.Load(sa);
              frmHTML.WebBrowser1.Update ;
              frmHTML.Update ;
              ms.Free ;
              Table.Close ;
              if frmRTF.Visible then showMEssage('frmRTR is show now');
              result:=true;
              exit;
            end;
          end
          else
            table.Close ;
            exit;
            result:=false;
        except
          Table.Close ;
          result:=false;
        end;
    end;
      

  3.   

    把 frmHTML.WebBrowser1.Update 去掉试试
      

  4.   

    问题我认为在关闭frmHTML时是否应该对webBrowser1 做些处理.但是我不知道怎么样处理.
    因为只有在frmhtml窗体关闭frmHTML.close一次后,再次加载,frmhtml.show的时候才会时读取的html流在webbrowser1中闪一下.其他都正常.