在ActiveForm里如何控制网页跳转

aawolf 2002-08-03 10:56:48
加精
需求是这个样子的:
用ActiveForm实现一个登陆页面,当密码验证正确后,我要跳转到另一个页面,请问的是如何在ActiveForm中实现web间的跳转。
...全文
93 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
aawolf 2002-08-12
  • 打赏
  • 举报
回复
今天终于把这个东西做完了,回头想想,真的收获很多,谢谢BCB_FANS(四大名捕之追杀令) 和cker(〖烟波浩淼三千里、人鬼殊途五百年〗) 两位大哥。
我最后采用的是cker的解决方案。
aawolf 2002-08-05
  • 打赏
  • 举报
回复
我在家里配了IIS,做了一个ActiveForm放上去还是不行,真郁闷。看来至少不是环境配置的问题了。
bcb_fans 2002-08-05
  • 打赏
  • 举报
回复
看来问题得到了最终的解决。

可是还是无法达到Delphi中的一条语句效果,有点遗憾。

  • 打赏
  • 举报
回复
对了....还有
#pragma package(smart_init)
#pragma resource "*.dfm"
TActiveFormX *ActiveFormX;
///Added by cker
IWebBrowserApp* Browser;
//---------------------------------------------------------------------------
Html如下:
<HTML>
<H1> C++Builder 6 ActiveX Test Page </H1><p>
You should see your C++Builder 6 forms or controls embedded in the form below.
<HR><center><P>
<OBJECT NAME = "CK"
classid="clsid:AE8FCC61-A31B-45E2-BC06-9555272A1111"
codebase="http://cker.vicp.net/ActiveFormProj1.ocx#version=1,0,2,0"
width=350
height=250
align=center
hspace=0
vspace=0
>
</OBJECT>
<SCRIPT VBSCRIPT>
CK.MethodTest();
</SCRIPT>

</HTML>
  • 打赏
  • 举报
回复
STDMETHODIMP TActiveFormXImpl::MethodTest()
{
try
{
IOleClientSite* ClientSite;
IServiceProvider* SrvProvider;

if(GetClientSite(&ClientSite)==S_OK)
{
if(ClientSite && ClientSite->QueryInterface(IID_IServiceProvider,(void**)&SrvProvider)== S_OK)
{
if (SrvProvider && SrvProvider->QueryService(IID_IWebBrowserApp,IID_IWebBrowserApp,(void**)&Browser)== S_OK)
{
ShowMessage("Succeed!!");
}
else
{
Browser = NULL;
}
}
}
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IActiveFormX);
}
return S_OK;
};

void __fastcall TActiveFormX::Button1Click(TObject *Sender)
{

if(Browser)
{
TVariant v = TNoParam();
Browser->Navigate(StringToOleStr(Edit1->Text),&v,&v,&v);
}
}
//---------------------------------------------------------------------------
  • 打赏
  • 举报
回复
按钮其实也不是非的放在IE中来Submit的。我修改了以下代码如下:


bcb_fans 2002-08-05
  • 打赏
  • 举报
回复
如果使用cker的方法,就必须把验证按钮放在IE中,如果我想通过按ActiveForm上的一个按钮(Subit)来进行验证,问题还是没有解决,有谁想进行技术上的研究吗?
aawolf 2002-08-05
  • 打赏
  • 举报
回复
今天忙了一天,终于把该做的做完了,可问题还没解决。现在总可以松一口气了,好好研究一下这个问题了。
不过又有新的问题,ActiveForm如何控制Seccion?哈哈,我都快晕了。
谢谢大家,cker为什么不拿分呢,少吗?我最多可以放200的。
aawolf 2002-08-05
  • 打赏
  • 举报
回复
(脸红)代码看不是太懂,但能帮我解释一下为什么(IUnknown*)(VCLComObject)传过来的是个空吗?如果大家得到的都是空,至少说明不是我其他地方出的问题。
cker先送你200,十分感谢你和BCB_FANS。
jians 2002-08-05
  • 打赏
  • 举报
回复
干嘛要这么复杂啊,为控件增加一个导出属性和一个导出方法很EASY就可以做到网页控制的功能,cker兄里的
<SCRIPT VBSCRIPT>
CCCKKK.MethodTest();
</SCRIPT>
MethodTest()就是一个这样的方法。
  • 打赏
  • 举报
回复
我们的实例是在IE中生成
ThisInst不可以
  • 打赏
  • 举报
回复
搞定!!



STDMETHODIMP TActiveFormXImpl::MethodTest()
{
try
{
IOleClientSite* ClientSite;
IServiceProvider* SrvProvider;

if(GetClientSite(&ClientSite)==S_OK)
{
if(ClientSite && ClientSite->QueryInterface(IID_IServiceProvider,(void**)&SrvProvider)== S_OK)
{
IWebBrowserApp* Browser;

if (SrvProvider && SrvProvider->QueryService(IID_IWebBrowserApp,IID_IWebBrowserApp,(void**)&Browser)== S_OK)
{

IHTMLDocument2* Doc;
TVariant v = TNoParam();
Browser->Navigate(L"www.csdn.net",&v,&v,&v);
Browser->get_Document((IDispatch**)&Doc);
if(Doc)
{
wchar_t* url;
Doc->get_URL(&url);

ShowMessage(url);
}
}
}
}

}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IActiveFormX);
}
return S_OK;
};


调用的Html源文件:

<HTML>
<H1> C++Builder 6 ActiveX Test Page </H1><p>
You should see your C++Builder 6 forms or controls embedded in the form below.
<HR><center><P>
<OBJECT NAME = "CCCKKK"
classid="clsid:AE8FCC61-A31B-45E2-BC06-9555272A1111"
codebase="http://cker.vicp.net/ActiveFormProj1.ocx#version=1,0,17,0"
width=350
height=250
align=center
hspace=0
vspace=0
>
</OBJECT>

<SCRIPT VBSCRIPT>
CCCKKK.MethodTest();
</SCRIPT>

</HTML>
bcb_fans 2002-08-05
  • 打赏
  • 举报
回复
真是见鬼了。根据MSDN(ActiveX.chm)的一个例子:

CComPtr<IOleContainer> spContainer;
m_spClientSite->GetContainer(&spContainer);
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spDoc(spContainer);
if(spDoc)
spDoc->put_bgColor(CComBSTR(_T("pink")));

在BCB中改变一下语法:

IOleClientSite* m_spClientSite;

hRes = GetClientSite(&m_spClientSite);
if(SUCCEEDED(hRes))
{
CComPtr<IOleContainer> spContainer;

//******在这里阻塞,ActiveForm无法正常显示,且下面消息框没有显示。
m_spClientSite->GetContainer(&spContainer);

//如果得到IHTMLDocument2指针就好办了
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spDoc(spContainer);

MessageBox(NULL,"Succeed4444444",NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);
}

真是不可思议,MSDN的例子怎么在BCB就不行了呢???
bcb_fans 2002-08-05
  • 打赏
  • 举报
回复
To: cker(〖烟波浩淼三千里、人鬼殊途五百年〗)

没有那么容易,使用这种方法会在新的窗口中显示那个页面,实际上直接传一个NULL参数就可以让它在新的页面中显示,如:
HlinkNavigateString(NULL,WideString(".....").c_bstr());

而楼主需要在原来的窗口中显示,这才麻烦!!!!!!

-----------------------------------------------
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
void __fastcall TSample::btnGoClick(TObject *Sender)
{
HlinkNavigateString((IUnknown*)(VCLComObject), L"www.csdn.net");
}
//---------------------------------------------------------------------------


void __fastcall TSample::btnFowardClick(TObject *Sender)
{
HlinkGoForward((IUnknown*)(VCLComObject));
}
//---------------------------------------------------------------------------

void __fastcall TSample::btnBackClick(TObject *Sender)
{
HlinkGoBack((IUnknown*)(VCLComObject));
}
aawolf 2002-08-04
  • 打赏
  • 举报
回复
……
bcb_fans 2002-08-04
  • 打赏
  • 举报
回复
因为TCppShellWindows的返回的值连资源管理器也包括在内?当然要去掉啦。这段代码放在你的ActiveForm中的某一个脚本中。只要ActiveForm被打包就行了。
aawolf 2002-08-04
  • 打赏
  • 举报
回复
写的很漂亮,
if(CheckURL.LowerCase().SubString(1,5) == "file:")//资源管理器
continue;
这句话是什么意思?
这个帖子我想等一下有没有其他的答案,不如我另开帖子先给你200,如何?另外问一句,应该不需要打包什么文件吧?
bcb_fans 2002-08-04
  • 打赏
  • 举报
回复
直接的办法没有,间接的办法导师有一个。

问题的关键是怎样得到ActiveForm所在的窗口的IWebBrowser2接口指针?

我使用一种比较笨的方法:

//查找当前IE窗口的IWebBrowser2接口指针
TCppShellWindows *ptrShellWin;

ptrShellWin = new TCppShellWindows(NULL);
for(int i=0; i < ptrShellWin->Count; i++)
{
TVariantInParam va(i);
IDispatch *m_spDispatch;

m_spDispatch = (IDispatch*)ptrShellWin->Item(va);
if(m_spDispatch == NULL) continue;

IWebBrowser2Ptr m_spWebBrowser(m_spDispatch);

if((IWebBrowser2*)m_spWebBrowser == NULL) continue;

AnsiString CheckURL;

CheckURL = m_spWebBrowser->LocationURL;
if(CheckURL.LowerCase().SubString(1,5) == "file:")//资源管理器
continue;

//可能有多个IE窗口,要判断是否是当前ActiveForm所在的IE窗口
if((HWND)m_spWebBrowser->get_HWND() == GetForegroundWindow())
{
WideString NewURL = ".........";
m_spWebBrowser->Navigate2(NewURL.c_bstr());//进入另一个页面
break;
}
}
aawolf 2002-08-04
  • 打赏
  • 举报
回复
都可以,但最好是在同一个页面中打开,毕竟是个登陆窗体。有办法吗?
加载更多回复(6)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧