unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, ExtCtrls, StdCtrls,
Dialogs;type
TFramePanel = class(TPanel)
private
FTxtList: TList;
FMClick: TNotifyEvent;
procedure SetMClick(const Value: TNotifyEvent);
public
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
published
property OnMClick: TNotifyEvent read FMClick write SetMClick;
end;implementation{ TFramePanel }constructor TFramePanel.Create(AOwner: TComponent);
var
TxtObj:TLabel;
begin
inherited Create(AOwner);
FTxtList:=TList.Create;
TxtObj:=TLabel.Create(Self);
TxtObj.Parent:=Self;
TxtObj.Caption:='AAAAAAAAA';
TxtObj.Left:=10;
TxtObj.Top:=10;
FTxtList.Add(TxtObj);
TxtObj:=nil; TxtObj:=TLabel.Create(Self);
TxtObj.Parent:=Self;
TxtObj.Caption:='BBBBBBBBB';
TxtObj.Left:=100;
TxtObj.Top:=10;
FTxtList.Add(TxtObj);
TxtObj:=nil;
end;destructor TFramePanel.Destroy;
var
i:Integer;
TxtObj:TLabel;
begin
for i:=0 to Pred(FTxtList.Count) do begin
TxtObj:=TLabel(FTxtList.Items[i]);
if Assigned(TxtObj) then TxtObj.Free;
end;
FTxtList.Free;
inherited;
end;procedure TFramePanel.SetMClick(const Value: TNotifyEvent);
var
i:Integer;
begin
FMClick := Value;
for i:=0 to Pred(FTxtList.Count) do TLabel(FTxtList.Items[i]).OnClick:=FMClick;
end;end.问题:我在SetMClick中将所有的Label对象的Click事件链接到FMClick怎么没有效果,只有点击Panel有效,请问这是什么原因?
Windows, Messages, SysUtils, Variants, Classes, Graphics, ExtCtrls, StdCtrls,
Dialogs;type
TFramePanel = class(TPanel)
private
FTxtList: TList;
FMClick: TNotifyEvent;
procedure SetMClick(const Value: TNotifyEvent);
public
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
published
property OnMClick: TNotifyEvent read FMClick write SetMClick;
end;implementation{ TFramePanel }constructor TFramePanel.Create(AOwner: TComponent);
var
TxtObj:TLabel;
begin
inherited Create(AOwner);
FTxtList:=TList.Create;
TxtObj:=TLabel.Create(Self);
TxtObj.Parent:=Self;
TxtObj.Caption:='AAAAAAAAA';
TxtObj.Left:=10;
TxtObj.Top:=10;
FTxtList.Add(TxtObj);
TxtObj:=nil; TxtObj:=TLabel.Create(Self);
TxtObj.Parent:=Self;
TxtObj.Caption:='BBBBBBBBB';
TxtObj.Left:=100;
TxtObj.Top:=10;
FTxtList.Add(TxtObj);
TxtObj:=nil;
end;destructor TFramePanel.Destroy;
var
i:Integer;
TxtObj:TLabel;
begin
for i:=0 to Pred(FTxtList.Count) do begin
TxtObj:=TLabel(FTxtList.Items[i]);
if Assigned(TxtObj) then TxtObj.Free;
end;
FTxtList.Free;
inherited;
end;procedure TFramePanel.SetMClick(const Value: TNotifyEvent);
var
i:Integer;
begin
FMClick := Value;
for i:=0 to Pred(FTxtList.Count) do TLabel(FTxtList.Items[i]).OnClick:=FMClick;
end;end.问题:我在SetMClick中将所有的Label对象的Click事件链接到FMClick怎么没有效果,只有点击Panel有效,请问这是什么原因?
FTxtList.Add(TxtObj);
TxtObj:=nil; //这里已经释放了列表对象了
2.你所说的在函数SetMClick中已链接到所有Lable对象,但你的代码中没有体现出何时调用SetMClick这个函数呀,也就是说你根本没有执行“链接到所有Lable对象”这个操作。如果你的类由其它对象来调用,必须保证这个函数被真正执行过
var
TxtObj:TLabel;
begin
inherited Create(AOwner);
FTxtList:=TList.Create;
TxtObj:=TLabel.Create(Self);
TxtObj.Parent:=Self;
TxtObj.Caption:='AAAAAAAAA';
TxtObj.Left:=10;
TxtObj.Top:=10;
TxtObj.OnClick := FMClick;
FTxtList.Add(TxtObj);
TxtObj:=nil;TxtObj:=TLabel.Create(Self);TxtObj.Parent:=Self;
TxtObj.Caption:='BBBBBBBBB';
TxtObj.Left:=100;
TxtObj.Top:=10;
TxtObj.OnClick := FMClick;
FTxtList.Add(TxtObj);
TxtObj:=nil;end;