DLL+接口封装类, 不用Runtime Packge, 如何解决类不一致的错误.(200分)

  • 主题发起人 主题发起人 cncharles
  • 开始时间 开始时间
C

cncharles

Unregistered / Unconfirmed
GUEST, unregistred user!
IActionMenu=interface
['{83C75241-9C05-4085-B778-3BDE2E126DC9}']
procedure AddMenu(const Dimensions:array of Byte; Action:TAction);
procedure DeleteMenu(const Dimensions:array of Byte);
function GetActionBarItem:TActionBarItem;
function GetParentActionItem(const Dimensions:array of Byte):TActionClientItem;
procedure InsertMenu(const Dimensions:array of Byte; Action:TAction);
procedure SetActionBarItem(AActionBarItem:TActionBarItem);
property ActionBarItem:TActionBarItem read GetActionBarItem write SetActionBarItem;
end;

TActionMenu=class(TComponent, IActionMenu)
private
FActionBarItem:TActionBarItem;
public
//IActionMenu
procedure AddMenu(const Dimensions:array of Byte; Action:TAction);
procedure DeleteMenu(const Dimensions:array of Byte);
function GetActionBarItem:TActionBarItem;
function GetParentActionItem(const Dimensions:array of Byte):TActionClientItem;
procedure InsertMenu(const Dimensions:array of Byte; Action:TAction);
procedure SetActionBarItem(AActionBarItem:TActionBarItem);
property ActionBarItem:TActionBarItem read GetActionBarItem write SetActionBarItem;
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
end;

谢cybercake, 我本来用的就是接口.
TActionMenu=class(TComponent, IActionMenu)
private
FActionBarItem:TActionBarItem;
public
//IActionMenu
procedure AddMenu(const Dimensions:array of Byte; Action:TAction);
procedure DeleteMenu(const Dimensions:array of Byte);
function GetActionBarItem:TActionBarItem;
function GetParentActionItem(const Dimensions:array of Byte):TActionClientItem;
procedure InsertMenu(const Dimensions:array of Byte; Action:TAction);
procedure SetActionBarItem(AActionBarItem:TActionBarItem);
property ActionBarItem:TActionBarItem read GetActionBarItem write SetActionBarItem;
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
end;

//GetParentActionItem不会出错, 可以正确的回转结果.
function TActionMenu.GetParentActionItem(
const Dimensions: array of Byte): TActionClientItem;
var
I:integer;
Msg:string;
ActionItem:TActionClientItem;
ActionClients:TActionClients;
begin
Result:=nil;
ActionItem:=nil;
Msg:='对不起你的第%d维值%d超标.';
ActionClients:=FActionBarItem.Items;
for I := 0 to High(Dimensions) - 1 do begin
if Dimensions>ActionClients.Count then begin
Msg:=Format(Msg, [I, Dimensions]);
ShowMessage(Msg);
Exit;
end else begin
ActionItem:=TActionClientItem(ActionClients.Items[Dimensions]);
ActionClients:=ActionItem.ActionClients;
end;
end;
Result:=ActionItem;
end;


procedure TActionMenu.AddMenu(const Dimensions: array of Byte; Action: TAction);
var
ActionItem:TActionClientItem;
begin
ActionItem:=GetParentActionItem(Dimensions);
if ActionItem=nil then
Exit;
ActionItem:=ActionItem.Items.Add; //这里就出错. 类型不一致, 也就是说只要用到了
//ActionClientItem.Items属性都会出错, 但是奇怪能实现我的功能,但总提示错误不好.
ActionItem.Action:=Action;
end;

如果用了runtime package与exe一起发布了相关的bpl在其它的电脑上面
没有效果真是搞不明白其中的原因.

使用了FastMM, ShareMM都不行.


群号:16497064欢迎高手交流.
 
那么快就沉了
 
看看这篇帖子,对你可能有帮助:http://www.lummie.co.uk/content/view/20/21/
E文的,大概意思是如何共享一个ControlAtom,也许能解决你的问题,我这里有改好的源码,需要的话qq联系:71278547
 
接受答案了.
 

Similar threads

I
回复
0
查看
651
import
I
I
回复
0
查看
704
import
I
I
回复
0
查看
650
import
I
I
回复
0
查看
521
import
I
I
回复
0
查看
615
import
I
后退
顶部