請教一個問題:DELPHI里怎么創建能當容器用(里面可再放置其它activex控制元件)的ActiveX控制元件啊,就是象Panel那樣當容器用.
直接從TPanel,TScrollBox創建ActiveX控制元件沒用啊,不能當容器.
uj5u.com熱心網友回復:
1.main...unit DynamicOleControl;
interface
uses Windows, Classes, ActiveX, OleCtrls, ComObj;
type
TDynamicOleControl = class(TOleControl)
private
FClassID: TGUID;
FIntf: IUnknown;
function GetControlInterface: IUnknown;
protected
procedure CreateControl;
procedure InitControlData; override;
public
constructor CreateFromClassID(AOwner: TComponent; AClassID: TGUID); overload;
constructor CreateFromClassID(AOwner: TComponent; AClassID: string); overload;
constructor CreateFromProgID(AOwner: TComponent; AProgID: string);
property ControlInterface: IUnknown read GetControlInterface;
property DefaultInterface: IUnknown read GetControlInterface;
published
property Anchors;
end;
implementation
constructor TDynamicOleControl.CreateFromClassID(AOwner: TComponent;
AClassID: TGUID);
begin
FClassID := AClassID;
inherited Create(AOwner);
end;
constructor TDynamicOleControl.CreateFromClassID(AOwner: TComponent; AClassID: string);
begin
FClassID := StringToGUID(AClassID);
inherited Create(AOwner);
end;
constructor TDynamicOleControl.CreateFromProgID(AOwner: TComponent;
AProgID: string);
begin
FClassID := ProgIDToClassID(AProgID);
inherited Create(AOwner);
end;
procedure TDynamicOleControl.InitControlData;
const
CControlData: TControlData2 = (
ClassID: '';
EventIID: '';
EventCount: 0;
LicenseKey: nil;
Flags: $00000000; //$0000001D
Version: 401
);
begin
CopyMemory(@CControlData.ClassID, @FClassID, SizeOf(TGUID));
ControlData := @CControlData;
end;
procedure TDynamicOleControl.CreateControl;
procedure DoCreate;
begin
FIntf := IUnknown(OleObject) as IUnknown;
end;
begin
if FIntf = nil then DoCreate;
end;
function TDynamicOleControl.GetControlInterface: IUnknown;
begin
CreateControl;
Result := FIntf;
end;
end.
uj5u.com熱心網友回復:
2. DynamicOleControl.pas...unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DynamicOleControl, StdCtrls, Buttons, ExtCtrls, ComObj;
type
TMainForm = class(TForm)
pnl1: TPanel;
pnlContainer: TPanel;
lbl1: TLabel;
edtClassID: TEdit;
btnLoad: TBitBtn;
btnFree: TBitBtn;
Label1: TLabel;
edtProgID: TEdit;
Label2: TLabel;
procedure btnFreeClick(Sender: TObject);
procedure btnLoadClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FMyOleControl: TDynamicOleControl;
procedure FreeOleControl;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
begin
FMyOleControl := nil;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeOleControl;
end;
procedure TMainForm.FreeOleControl;
begin
if Assigned(FMyOleControl) then
FreeAndNil(FMyOleControl);
end;
procedure TMainForm.btnFreeClick(Sender: TObject);
begin
FreeOleControl;
end;
procedure TMainForm.btnLoadClick(Sender: TObject);
begin
FreeOleControl;
try
if Trim(edtClassID.Text) <> '' then
FMyOleControl := TDynamicOleControl.CreateFromClassID(Self,
Trim(edtClassID.Text))
else if Trim(edtProgID.Text) <> '' then
FMyOleControl := TDynamicOleControl.CreateFromProgID(Self,
Trim(edtProgID.Text));
if Assigned(FMyOleControl) then
begin
pnlContainer.InsertControl(FMyOleControl);
FMyOleControl.Align := alClient;
end;
except
on e: EOleSysError do
Application.MessageBox(PChar(e.Message), '錯誤', MB_OK + MB_ICONERROR);
end;
end;
end.
uj5u.com熱心網友回復:
3. 運行試試,activex組件可以顯示在form中了;可以指定其Parent,必要時再封裝其動態加載的事件或方法。。。。uj5u.com熱心網友回復:
謝謝,老大能不能把dfm檔案的代碼也復制一下:)uj5u.com熱心網友回復:
學習,受教了。uj5u.com熱心網友回復:
kye_jufei我發現你理解錯了,我問的是怎么"創建能當容器用(里面可再放置其它activex控制元件)的ActiveX控制元件",你的代碼卻是創建一個普通的ActiveX控制元件放到你的VCL容器控制元件"pnlContainer: TPanel"里面,這兩個不是一回事啊. 也就是說,你這個容器控制元件pnlContainer是VCL的TPanel,而并非activex控制元件uj5u.com熱心網友回復:
這樣的,你先將以上代碼運行;然後這個activex作為mian Parent,隨便再拖放一個vcl組件到activex上面先看看效果。。。uj5u.com熱心網友回復:
不對吧,我在運行這個程式時去哪里拖放一個vcl組件到activex上面啊:(uj5u.com熱心網友回復:

我也在找創建activex容器的方法。
uj5u.com熱心網友回復:
哈,學習。。。。
uj5u.com熱心網友回復:
頂一下,看看有人會了不:)uj5u.com熱心網友回復:
"創建能當容器用(里面可再放置其它activex控制元件)的ActiveX控制元件"是指設計時的容器? 不是有 tolecontainer 嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137855.html
標籤:VCL組件開發及應用
