问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在程序运行的时候创建控件

发布网友 发布时间:2022-11-21 17:23

我来回答

2个回答

热心网友 时间:2024-10-22 05:10

编写Delphi应用程序时,经常会遇到一些ActiveX控件[注:扩展名为OCX的控件或DLL的类型库],它们为应用程序的开发提供了简单的操作途径。然而,这些程序在发布的同时,面临ActiveX控件注册问题。解决途径:一、用安装程序制作打包文件,往往会给增加程序本身的大小,系统重装时,则必须重新安装它;二、用程序本身进行代码编写函数的形式处理它。
使用方法分为两种:
一、直接把可视化的ActiveX控件放到程序中;
二、运行时根据需要实时建立。
如果是直接使用,则应用程序在初始化的过程中会自动寻找、创建所需的ActiveX控件,如果控件没有注册,初始化程序会产生一个异常,捕捉并处理这个异常。
在程序Form中加入一个新的方法:
unit UAutoRegActiveX;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComObj; //加入ComObj单元
type
TAutoRegActiveXFrm = class(TForm)
procere FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
protected
{ Public declarations }
procere CheckException(Sender: TObject; EAbort: Exception);
end;
var
AutoRegActiveXFrm: TAutoRegActiveXFrm;
implementation
{$R *.dfm}
{-------------------------------------------------
标准ActiveX控件中,有两个函数DLLRegisterServer 、DLLUnRegisterServer可调用,
其中函数用于注册控件,用于卸载控件。我们可用LoadLibrary装载DLL/OCX文件,用
GetProcAddress获取DLLRegisterServer和DLLUnRegisterServer两个函数的指针,然
后再直接运行这两个函数即可实现注册和卸载ActiveX控件的操作,从而代替Windows
系统的RegSvr32.exe实现ActiveX控件的注册和卸载。
--------------------------------------------------}
{-------------------------------------------------
参数说明:
sOleFileName 一个DLL或OCX文件名;
OleAction 表示注册操作类型:1表示注册,0表示卸载
返回值:True表示操作执行成功,False表示操作执行失败
--------------------------------------------------}
function OLERegister(sOleFileName: String; OleAction: Byte):Boolean;
const
RegisterOle = 1; //注册
UnRegisterOle = 0; //卸载
type
TOleRegisterFunction = function: HResult; //注册或卸载函数原型
var
hLibraryHandle: THandle; //由LoadLibray返回的DLL或OCX句柄
hFunctionAddress: TFarProc; //DLL或OCX中的函数句柄,由GetProAddress返回
RegFunction: TOleRegisterFunction; //注册或卸载函数指针
begin
Result := False;
//打开文件,返回DLL或OCX句柄
hLibraryhandle := LoadLibrary(PChar(SOleFileName));
if (hLibraryHandle > 0) then //DLLakg OCX句柄正确
try
//返回注册或卸载函数指针
if (OleAction = RegisterOle) then //返回注册函数指针
hFunctionAddress := GetProcAddress(hLibraryhandle,PChar('DLLRegisterServer'))
else //返回卸载函数指针
hFunctionAddress := GetProcAddress(hLibraryhandle,PChar('DLLUnRegisterServer'));
if (hFunctionAddress <> nil) then //判断注册或卸载函数是否存在
begin
RegFunction := TOleRegisterFunction(hFunctionAddress); //获取操作函数的指针
if RegFunction >=0 then //执行注册或卸载操作,返回值>=0表示执行成功
Result := True;
end;
finally
FreeLibrary(hLibraryHandle); //关闭已打开的文件
end;
end;
{ TAutoRegActiveXFrm }
procere TAutoRegActiveXFrm.CheckException(Sender: TObject;
EAbort: Exception);
begin
if EAbort is EOleSysError then
begin
if HResult(EOleSysError(EAbort).ErrorCode) = REGDB_E_CLASSNOTREG then
OleRegister('D:Flash.ocx',1);
end
else
Application.ShowException(EAbort);
end;
//将CheckException方法赋值给系统Application变量,在主Form的OnCreate事件中。
procere TAutoRegActiveXFrm.FormCreate(Sender: TObject);
var
DemoOcx: Variant; //变量声明
begin
Application.OnException := CheckException;
//是否产生类名称字符串错误
try
DemoOcx := CreateOleObject('Demo.Demo');
except
on EAbort:EOleSysError do
if HResult(EAbort.ErrorCode) = CO_E_CLASSSTRING then
begin
if OleRegister('D:Flash.ocx',1) then
DemoOcx := CreateOleObject('Demo.Demo')
else
begin
Application.MessageBox('控件注册失败,程序将无法正常运行',PChar('注册控件'),MB_OK+MB_ICONERROR);
Application.Terminate;
end;
end;
end;
end;
end.

热心网友 时间:2024-10-22 05:11

编写Delphi应用程序时,经常会遇到一些ActiveX控件[注:扩展名为OCX的控件或DLL的类型库],它们为应用程序的开发提供了简单的操作途径。然而,这些程序在发布的同时,面临ActiveX控件注册问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华硕X205TABIOS里launchcsm这个选项怎么找 朋友在一起,本来想着相互花钱不要计较那么多的,结果对方却老是想着比... 别人叫你请他吃东西,那他是不是不讨厌你。算是给你机会吗?? 哪种乌冬面比较好吃 ...膳,你小时候最爱吃那儿的豌豆黄儿。还记得那回我带你去北海吗... 苍梧鸟是什么意思? 右手五指受伤其中小指无名指各截掉一节可评几级伤残 ...桡骨骨折伤残鉴定怎么算呢,是左手的算左手的右手算右手,还是一起算... 工伤伤残鉴定中,对右手左手有区别吗? 车子出了事故,4s店在维修合同上写的交车日期,如果4s店超出预订时间交车... 有多爽!直播平台推出Mac桌面客户端:大屏刷视频,还有哪些优势? 电脑如何拓展刷视频 电脑隔空刷视频怎么设置 手表上弦健按不下去怎么办? 冻库回气结霜太快怎么办 冷库压缩机结霜是怎么回事? 百度百科的词条增长速度怎么这么快? 百度百科怎么升级才快 为什么百度百科能怎么快地被更新? 文少加拿大赢了多少 索尼智能电视连接无线看电影很慢直接连网线有帮助吗? 全民k歌上面拼图是把两个人是怎么做到的, 全民k歌什么的拼图是怎么搞的,求助, 全民tv官网 登录为啥拼图一直被怪兽吃 姓龙的叫什么好一些,男的女的都可以,好听就行,嗯不要想怪名字,否则我不... 一家三口都属龙 腊月生的男孩 父亲姓刘 母亲姓王叫什么名字好呢 汽车给电瓶充电电压是多少? 汽车电瓶充电电压和电流是多少? 小车电瓶充电电压和电流是多少? 汽车电瓶用多少伏电压充电? 在程序中输出字符串为什么要通过中断 怎样才能在程序的道路上犯错越多 在程序运行阶段完成的联编称为什么 什么可以实现这种联编。 在程序中怎么用ASCII码 在程序设计中对于大程序主要强调 直接转销法是什么呢? 坏账准备有哪两种方法,各有的优缺点 公牛双开开关,怎样接两个灯是零线合在一起,还是火线合在一起? 室内装修效果图如何看?室内设计需要注意什么? Solidworks这款三维设计软件在哪里可以买到?要求正版的!最好是重庆的... 你怎么不播放了 如何看懂设计图纸 大枣冰糖醋制作方法 黑豆应该怎么做``` 秦岭大坝沟附近的蒙古包叫什么名字? tps5430能否控制输出恒定电流? 用tps5430降压芯片,12V输入3.4V输出,电阻R1,R2,R3的值该如何取?_百度... 青椒炒肉怎样除去青椒的苦味 体寒湿的人能吃苦菜吗 法律文书写作对法律专业学生来说重要性怎么样