如在frmMain
让另一个窗口的
WebBrowser1.Navigate('about:blank');而程序不会有停顿现象我建立了个线程Execute里直接写WebBrowser1.Navigate('about:blank');结果老提示错误

解决方案 »

  1.   

    我的标题错了
    应该是
    如何创建个线程让WebBrowser悄悄打开一个页面
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WebBrowser1.Navigate('http://community.csdn.net/Expert/topic/3228/3228955.xml?temp=.4876978'); //载入网页本来就是异步的~~
    end;procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
      WebBrowser1.Left := WebBrowser1.Tag; //载入完后显示~~
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      WebBrowser1.Tag := WebBrowser1.Left;
      WebBrowser1.Left := -1000; //先藏起来~~
    end;
      

  3.   

    是这样的
    我用WebBrowser是要用来做网页编辑器的
    它是我的程序中的一个功能
    但WebBrowser的执行Navigate方法时整个程序会等待它加载页面完毕
    我想在程序启动的时候,利用用户还在执行其他操作的时候让它在后台悄悄执行完加载操作
    现在我无论直接执行还是建一个线程执行
    整个程序都在等待Navigate执行完毕
    很是郁闷
      

  4.   

    楼上大哥
    我已经将建立的线程的优先级定义为TpLowest了
    情况还是和原来一样
    是不是应该去改变WebBrowser1.Navigate的执行的优先级呢?具体应该怎么改
    请大家帮忙
    分不够我可以加
      

  5.   

    这就是打开webBrowser的线程,很简单
    unit doWebBrowser;interfaceuses
      Classes,SysUtils,SHDocVw;
    type
      WebThread = class(TThread)
      WebBrowser1: TWebBrowser;
      private
        { Private declarations }
      protected
        procedure Execute; override;
      public
        { Public declarations }
        constructor create(sWebBrowser: TWebBrowser);     
        procedure openTheWeb;
      end;
    implementationuses LTS;constructor WebThread.create(sWebBrowser: TWebBrowser);     
    begin
      inherited Create(false);
      Priority := TpLowest;
      WebBrowser1 := sWebBrowser  ;
      FreeOnTerminate:=true;
    end;procedure WebThread.openTheWeb;
    begin
      WebBrowser1.Navigate('about:blank');
    end;procedure WebThread.Execute;
    begin
      Synchronize(openTheWeb);
    end;end.
      

  6.   

    不过我查了一下午资料
    好象问题不是在自己建的线程上,而是应该去改变WebBrowser执行页面的那个线程的优先次序
    不知道理解得对不对,如果对,应该怎么改啊
      

  7.   

    //获得应用程序版本
    function GetVerItem(FileName, Item: string): string; //获取文件的版本号
    var
      VerInfoSize: DWORD;
      GetInfoSizeJunk: DWORD;
      VersionInfo: Pointer;
      Translation: Pointer;
      InfoPointer: Pointer;
      VersionInfoSize: UINT;
      VersionValue: string;
    begin
      VerInfoSize := GetFileVersionInfoSize(PChar(FileName), GetInfoSizeJunk);
      if VerInfoSize > 0 then
      begin
        GetMem(VersionInfo, VerInfoSize); //得到足够的内存来存放版本资源
        GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VersionInfo);
          //得到文件的版本资源
        VerQueryValue(VersionInfo, '\\VarFileInfo\\Translation',
          Translation, VersionInfoSize);
        VersionValue := '\\StringFileInfo\\' +IntToHex(LoWord(LongInt(Translation^)), 4) +
          IntToHex(HiWord(LongInt(Translation^)), 4) +'\\';    if uppercase(Item) = uppercase('CompanyName') then //提取公司名称
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'CompanyName'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('FileDescription') then //提取文件描述
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'FileDescription'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('FileVersion') then //提取文件的版本
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'FileVersion'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('InternalName') then //提取内部名称
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'InternalName'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('LegalCopyright') then //提取合法版权
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'LegalCopyright'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('LegalTrades') then //提取合法商标
        begin
          if VerQueryValue(VersionInfo, PChar(VersionValue + 'LegalTrades'),
            InfoPointer, VersionInfoSize) then
            result := string(PChar(InfoPointer))
          else
            result := '';
        end;
        if uppercase(Item) = uppercase('OriginalFilename') then //提取原文件名称
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'OriginalFilename'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('ProductName') then //提取产品名称
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'ProductName'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('ProductVersion') then //提取产品版本
        begin
          VerQueryValue(VersionInfo, PChar(VersionValue + 'ProductVersion'),
            InfoPointer, VersionInfoSize);
          result := string(PChar(InfoPointer));
        end;
        if uppercase(Item) = uppercase('Comments') then //提取备注
        begin
          if VerQueryValue(VersionInfo, PChar(VersionValue + 'Comments'),
            InfoPointer, VersionInfoSize) then
            result := string(PChar(InfoPointer))
          else
            result := '';
        end;    FreeMem(VersionInfo, VerInfoSize);
      end;
    end;
      

  8.   

    你虽然创建了线程,但是在线程中还是用Synchronize来调用主线程中的过程,因此主线程会有停顿。
    试试不用Synchronize,而直接调用呢。。
      

  9.   

    你看看是不是把WebBrowser1放在form中了,
    如果是,在前面加 form1.WebBrowser1.Navigate('about:blank');写在execute中
    或者也可以用指针引入form:
    var
      myform:^tform1;
    begin
    myform:=@form1;
    myform.WebBrowser1.Navigate('about:blank');
    end;