如在frmMain
让另一个窗口的
WebBrowser1.Navigate('about:blank');而程序不会有停顿现象我建立了个线程Execute里直接写WebBrowser1.Navigate('about:blank');结果老提示错误
让另一个窗口的
WebBrowser1.Navigate('about:blank');而程序不会有停顿现象我建立了个线程Execute里直接写WebBrowser1.Navigate('about:blank');结果老提示错误
解决方案 »
- 请教:SQL server+数据互斥!
- treeview用法 急!!!!
- 使用odac控件如何实现对oracle数据库的导入导出功能!!!
- dbgrid的时间显示问题及一个拴新问题
- "运行时错误'429':ActiveX部件不能创建对象"是怎么回事,谢谢.
- 安装activex控件中遇到提示:'ComSerV' cannot be put into a package,怎么回事啊?
- 那里有UML书籍啊?
- 怎样去实现这个问题,对于数据库网格中加入控件?
- 谁能提供开发语音聊天的方面的资料(27分等着你~)
- 一个怪问题,大家看看
- 关于console application
- 关于ThemeEngine控件问题
应该是
如何创建个线程让WebBrowser悄悄打开一个页面
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;
我用WebBrowser是要用来做网页编辑器的
它是我的程序中的一个功能
但WebBrowser的执行Navigate方法时整个程序会等待它加载页面完毕
我想在程序启动的时候,利用用户还在执行其他操作的时候让它在后台悄悄执行完加载操作
现在我无论直接执行还是建一个线程执行
整个程序都在等待Navigate执行完毕
很是郁闷
我已经将建立的线程的优先级定义为TpLowest了
情况还是和原来一样
是不是应该去改变WebBrowser1.Navigate的执行的优先级呢?具体应该怎么改
请大家帮忙
分不够我可以加
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.
好象问题不是在自己建的线程上,而是应该去改变WebBrowser执行页面的那个线程的优先次序
不知道理解得对不对,如果对,应该怎么改啊
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;
试试不用Synchronize,而直接调用呢。。
如果是,在前面加 form1.WebBrowser1.Navigate('about:blank');写在execute中
或者也可以用指针引入form:
var
myform:^tform1;
begin
myform:=@form1;
myform.WebBrowser1.Navigate('about:blank');
end;