R
rope
Unregistered / Unconfirmed
GUEST, unregistred user!
我把代码贴出来吧。
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.
这个问题实际上是:由TFRPopupMenu在设计期生成的MenuItem(子控件)如何能够正确的
被储存(File|Save),或者是被正确的储存后在Create过程中如何被FindComponent
找到(假设已经被正确存储了),在集成环境中TFRPopupMenu内部的事件发生顺序如下:
(1)窗体没有该TFRPopupMenu时,向窗体添加:
TFRPopupMenu.Create
(2)添加后 File|Save
(3)关闭窗体,
(4)重新打开
(5)已经存在TFRPopupMenu的窗体在重新打开时:
TFRPopupMenu.Create;
TFRPopupMenu.Loaded;
现在,为了合乎编程习惯,必须在第一步结束后,就允许程序员可以修改TFRPopupMenu
生成的MenuItem,也就是,必须在控件的Create中加入生成MenuItem的代码,同时,
生成前必须检测:是否上一次已经Create过MenuItem了。
对此,我专门在TFRPopupMenu中加入调试代码,跟踪后发现在窗体载入时(此时
MenuItem已在窗体上了)的事件顺序大概是下面这种情况:
A)
窗体.Create
窗体内的控件.Create
变化了的属性.Loaded
在这种情况下,
1)如果TFRPopupMenu自己创建的MenuItem被Delphi认为是一个属性,一个
具有控件特点的属性,则在 "窗体内的控件.Create" 过程中永远也检测不到,
2)如果TFRPopupMenu自己创建的MenuItem被Delphi认为是一个控件,一个
成为了TFRPopupMenu的属性的控件,这种情况稍微好一点,但是存在另一个问题:
如果MenuItem的Create过程在最后(对于MenuItem来说,这也合乎逻辑),则该
MenuItem还是不能被TFRPopupMenu检测到。
如果事情真是这样(我倒是很希望我搞错了),应该怎么办?
为了应付差事,我可以将MenuItem作为TFRPopupMenu的属性Publish出来,实际上
我现在就是这么做的,可是,我希望事情能够解决的完美一些。
大虾们,救我!
俗话说的好:不管是龙虾还是对虾,能解决问题就是大虾!
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.
这个问题实际上是:由TFRPopupMenu在设计期生成的MenuItem(子控件)如何能够正确的
被储存(File|Save),或者是被正确的储存后在Create过程中如何被FindComponent
找到(假设已经被正确存储了),在集成环境中TFRPopupMenu内部的事件发生顺序如下:
(1)窗体没有该TFRPopupMenu时,向窗体添加:
TFRPopupMenu.Create
(2)添加后 File|Save
(3)关闭窗体,
(4)重新打开
(5)已经存在TFRPopupMenu的窗体在重新打开时:
TFRPopupMenu.Create;
TFRPopupMenu.Loaded;
现在,为了合乎编程习惯,必须在第一步结束后,就允许程序员可以修改TFRPopupMenu
生成的MenuItem,也就是,必须在控件的Create中加入生成MenuItem的代码,同时,
生成前必须检测:是否上一次已经Create过MenuItem了。
对此,我专门在TFRPopupMenu中加入调试代码,跟踪后发现在窗体载入时(此时
MenuItem已在窗体上了)的事件顺序大概是下面这种情况:
A)
窗体.Create
窗体内的控件.Create
变化了的属性.Loaded
在这种情况下,
1)如果TFRPopupMenu自己创建的MenuItem被Delphi认为是一个属性,一个
具有控件特点的属性,则在 "窗体内的控件.Create" 过程中永远也检测不到,
2)如果TFRPopupMenu自己创建的MenuItem被Delphi认为是一个控件,一个
成为了TFRPopupMenu的属性的控件,这种情况稍微好一点,但是存在另一个问题:
如果MenuItem的Create过程在最后(对于MenuItem来说,这也合乎逻辑),则该
MenuItem还是不能被TFRPopupMenu检测到。
如果事情真是这样(我倒是很希望我搞错了),应该怎么办?
为了应付差事,我可以将MenuItem作为TFRPopupMenu的属性Publish出来,实际上
我现在就是这么做的,可是,我希望事情能够解决的完美一些。
大虾们,救我!
俗话说的好:不管是龙虾还是对虾,能解决问题就是大虾!