首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

再问ActiveX的有关问题

2012-02-26 
再问ActiveX的问题大家好:第一次接触ActiveX控件,问题一大堆,请别见笑。1.新建的ActiveForm里的元素,其它单

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

热点排行