再问ActiveX的问题
大家好:
第一次接触ActiveX控件,问题一大堆,请别见笑。
1.新建的ActiveForm里的元素,其它单元引应该怎样引用?包含.H文件再引用还是会报错
2.OnDestroy函数不执行,应该在什么时候释放NEW创建的东西啊?
3.怎样请ActiveX独立界面运行,而不是嵌在网页里面?
代码如下:
//OCXYYTFrmImpl.cpp文件
//$$---- Active Form CPP ---- (stActiveFormSource)
//---------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <atl\atlvcl.h>
#include "internal.h"
#include "OCXYYTFrmImpl.h"
//---------------------------------------
#pragma package(smart_init)
#pragma link "RzBckgnd"
#pragma link "RzBmpBtn"
#pragma resource "*.dfm"
TOCXYYTFrm *OCXYYTFrm;
//---------------------------------------
__fastcall TOCXYYTFrm::TOCXYYTFrm(HWND ParentWindow)
: TActiveForm(ParentWindow)
{
}
//---------------------------------------
void __fastcall TOCXYYTFrmImpl::ActivateEvent(TObject *Sender)
{
Fire_OnActivate();
}
void __fastcall TOCXYYTFrmImpl::ClickEvent(TObject *Sender)
{
Fire_OnClick();
}
.
.
.
.
.
STDMETHODIMP TOCXYYTFrmImpl::set_Visible(VARIANT_BOOL Value)
{
try
{
const DISPID dispid = 201;
if (FireOnRequestEdit(dispid) == S_FALSE)
return S_FALSE;
m_VclCtl->Visible = Value;
FireOnChanged(dispid);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IOCXYYTFrm);
}
return S_OK;
};
//---------------------------------------
void __fastcall TOCXYYTFrm::RzBmpButton1Click(TObject *Sender)
{
try
{
//if(ComponentState.Contains(csDesigning))
//return;
AnsiString a = Edit1->Text.Trim( ) ;
char *ac = a.c_str( );
if( dd->usb )
dd->usb->display( ac );
if( strlen(ac) < 11 )
{
ac = hpi->shortcuts( ac ) ;
if( ac == 0 ) return ;
}
hpi->dial( ac );
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
//---------------------------------------
void __fastcall TOCXYYTFrm::RzBmpButton2Click(TObject *Sender)
{
try
{
//if(ComponentState.Contains(csDesigning))
//return;
hpi->hangup( 0 );
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
;
}
//---------------------------------------
void __fastcall TOCXYYTFrm::ActiveFormCreate(TObject *Sender)
{
try
{
//if(ComponentState.Contains(csDesigning))
//{
//return;
//}
Label1->Caption = "";
headcall_start( ) ;
Sleep(1000);
hpi->start();
Sleep(1000);
//ShowMessage("dddd");
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
//---------------------------------------
void __fastcall TOCXYYTFrm::ActiveFormDestroy(TObject *Sender) //这个函数不执行,请教应该在哪里做这些释放的动作啊?
{
try
{
//ShowMessage("dfdsf");
//if(ComponentState.Contains(csDesigning))
//return;
hpi->stop();
headcall_stop( );
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
//---------------------------------------
void __fastcall TOCXYYTFrm::Dial(AnsiString cNO)
{
try
{
Edit1->Text = cNO;
RzBmpButton1Click(RzBmpButton1);
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
//---------------------------------------
STDMETHODIMP TOCXYYTFrmImpl::Dial(BSTR cNO)
{
try
{
AnsiString tmp = cNO;
::OCXYYTFrm->Edit1->Text = tmp; //这里有执行,但没有效果,跟踪是有经过,但TEXT内容没变
::OCXYYTFrm->RzBmpButton1Click(::OCXYYTFrm->RzBmpButton1); //这里有执行,但没有效果,跟踪是有经过,但事件没触发
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IOCXYYTFrm);
}
return S_OK;
};
//---------------------------------------
//引入外部的CPP文件
#include <vcl.h>
#include <stdio.h>
#include <time.h>
#pragma hdrstop
#include "OCXYYTFrmImpl.h" //引用OCXYYTFrmImpl.h
//------------------------------------------
//------------------------------------------
void display_ptitle( char *ptitle )
{
::OCXYYTFrm->Label1->Caption = ptitle; //这个执行总是报错:access violation
}
//------------------------------------------
[解决办法]
void __fastcall TOCXYYTFrm::ActiveFormDestroy(TObject *Sender) //这个函数不执行,请教应该在哪里做这些释放的动作啊?
解决方法:重载DoDestroy函数,如下:
procedure DoDestroy; override;//释放的代 写在这里面
[解决办法]
在delphi中是重载实现的,在cb中你可以放在
__fastcall ~TOCXYYTFrm();中实现
引用报错可以这样解决:
f = new TForm1(this);//注意传递this,作为FORM1的OWNER
f->ShowModal();
delete f;
Form1中的调用方法:
void TForm1::display_ptitle( char *ptitle )
{
((TOCXYYTFrm*)(this->Owner))->Label1->Caption = ptitle; //这个执行总是报错:access violation
}
//------------------------------------------
[解决办法]
还有
::OCXYYTFrm->Edit1->Text = tmp; //这里有执行,但没有效果,跟踪是有经过,但TEXT内容没变
应该是
m_VclCtl->Edit1->Text = tmp;