控件的子项目自动创建后如何自动删除?(50分)

  • 主题发起人 主题发起人 rope
  • 开始时间 开始时间
R

rope

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个控件,类似于ListBox,在它粘贴到Form上时会显示若干列数据,
方便编成时观察修改,可是在Run时数据又建立了一次,或者可以理解为设
计时的数据未被Free,请问我该怎么办?
 
没明白你的意思, 什么叫 *粘贴* 到?
 
我写了一个控件,类似于ListBox,在它"放"到Form上时会显示若干列数据,
方便编成时观察修改,可是在Run时数据又建立了一次,或者可以理解为设
计时的数据未被Free,请问我该怎么办?
 
用 Stored 指令禁止属性保存到 DFM 中。
 
我把代码贴出来吧。


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus,
dbctrls, comctrls, FRDBGrid, db, dbtables;

type
TFRPopupMenu = class(TPopupMenu)

private
FPMnuDBEditUndoAll: TMenuItem;

protected

public
property PMnuDBEditUndoAll: TMenuItem
Read FPMnuDBEditUndoAll Write FPMnuDBEditUndoAll;

constructor Create(AOwner: TComponent); override;

// Create Default MenuItem
Procedure FRCreatePopupMenuItem;
// Set PopupMenuItem

end;


procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Test', [TFRPopupMenu]);
end;

constructor TFRPopupMenu.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

// 问题就在这里
FRCreatePopupMenuItem;
End;

Procedure TFRPopupMenu.FRCreatePopupMenuItem;
Var
I: Integer;
SrcComponet:TComponent;
Begin

PMnuDBEditUndoAll:= TMenuItem.Create(Owner);
PMnuDBEditUndoAll.Caption := '取消';
PMnuDBEditUndoAll.Name:='PMnuDBEditUndoAll';
Items.Add(PMnuDBEditUndoAll);
UpdateItems;
End;


end.
 
各位大侠可不能见死不救啊 8-)
 
To Rope:
控件内部创建的控件应该在Destory方法中释放,也就是说必须继承Destroy方法
然后在Destroy方法中释放PMnuDBEditUndoAll。



 
这个问题实际上是:由UserPopupMenu在设计期生成的MenuItem(子控件)如何能够正确的
被储存(File|Save),或者是被正确的储存后在Create过程中如何被FindComponent
找到(假设已经被正确存储了),在集成环境中UserPopupMenu内部的事件发生顺序如下:
(1)窗体没有该UserPOpupMenu时,向窗体添加:
UserPOpupMenu.Create
(2)添加后 File|Save
(3)关闭窗体,
(4)重新打开
(5)已经存在UserPOpupMenu的窗体在重新打开时:
UserPOpupMenu.Create;
UserPOpupMenu.Loaded;

现在,为了合乎逻辑,必须在第一步结束后,就允许程序员可以修改UserPOpupMenu
生成的MenuItem,也就是,必须在控件的Create中加入生成MenuItem的代码,同时,
生成前必须检测:是否上一次已经Create过MenuItem了。
对此,我专门在UserPOpupMenu中加入调试代码,跟踪后发现在窗体载入时(此时
MenuItem已在窗体上了)的事件顺序大概是下面这种情况:
A)
窗体.Create
窗体内的控件.Create
变化了的属性.Loaded
在这种情况下,
1)如果UserPOpupMenu自己创建的MenuItem被Delphi认为是一个属性,一个
具有控件特点的属性,则在 "窗体内的控件.Create" 过程中永远也检测不到,
2)如果UserPOpupMenu自己创建的MenuItem被Delphi认为是一个控件,一个
成为了UserPOpupMenu的属性的控件,这种情况稍微好一点,但是存在另一个问题:
如果MenuItem的Create过程在最后(对于MenuItem来说,这也合乎逻辑),则该
MenuItem还是不能被UserPOpupMenu检测到。

如果事情真是这样(我倒是很希望我搞错了),应该怎么办?
为了应付差事,我可以将MenuItem作为UserPOpupMenu的属性Publish出来,实际上
我现在就是这么做的,可是,我希望事情能够解决的完美一些。

大虾们,救我!

小平同志有句名言:
只要能解决问题,不管是龙虾还是竹节虾,都是大虾!
 
还是换一个题目,重新提问算了。
 
后退
顶部