读书人

再问ActiveX的有关问题

发布时间: 2012-02-26 20:19:45 作者: rapoo

再问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;

读书人网 >C++ Builder

热点推荐