如何在自定义 delphi 组件中实现 stringlist 属性?

Posted

技术标签:

【中文标题】如何在自定义 delphi 组件中实现 stringlist 属性?【英文标题】:How to impliment a stringlist property in a custom delphi component? 【发布时间】:2011-05-02 07:46:11 【问题描述】:

我正在创建我的第一个自定义 Delphi 组件。它基本上是一个自定义的 Tpanel,上面显示了标题和行文本。

我希望能够使用字符串列表添加多行文本。

在测试组件时,添加行时无法在面板上显示文本行:NewLinesText.add('line1 text')

但是,当我在运行时创建并填充一个新的字符串列表并将其分配给我的控件时,它确实有效:controlPanelitem.NewLinesText = MyNewStringlist

我希望能够像这样添加行:NewLinesText.add('line1 text')

我在 WinXP 上使用 Delphi 7 Professional。请参阅下面的代码。

任何帮助将不胜感激!

unit ControlPanelItem; interface uses SysUtils, Classes, Controls, ExtCtrls, Graphics, AdvPanel, StdCtrls, Windows,Forms,Dialogs; type tControlPanelItem = class(TAdvPanel) private fLinesText : TStrings; procedure SetLinesText(const Value: TStrings); procedure SetText; protected public constructor Create(AOwner : TComponent); override; destructor Destroy; override; published property NewLinesText : TStrings read FLinesText write SetLinesText; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [tControlPanelItem]); end; constructor tControlPanelItem.Create(AOwner: TComponent); begin inherited; fLinesText := TStringList.Create; end; destructor tControlPanelItem.Destroy; begin fLinesText.Free; inherited; end; procedure tControlPanelItem.SetLinesText(const Value: TStrings); begin fLinesText.Assign(value); SetText; end; procedure tControlPanelItem.SetText; var count : Integer; begin for count := 0 to fLinesText.Count - 1 do ShowMessage(fLinesText.strings[count]); end; end.

【问题讨论】:

【参考方案1】:

你应该这样做

procedure SetLines(Lines: TStrings);
begin
  FLinesText.Assign(Lines);
  // Repaint, update or whatever you need to do.
end;

您可能还需要设置FLinesOnChange 属性(在您创建自定义控件的构造函数中执行此操作)。将其设置为组件的任何TNofifyEvent 兼容(我猜是私有或受保护)过程。在此过程中,您可以进行所需的重绘、更新等操作。

也就是说,做

constructor TControlPanelItem.Create(AOwner: TComponent);
begin
  inherited;
  FLinesText := TStringList.Create;
  TStringList(FLinesText).OnChange := LinesChanged;
end;

procedure TControlPanelItem.LinesChanged(Sender: TObject);
begin
  // Repaint, update or whatever you need to do.
end;

【讨论】:

我已经在这样做了。请参阅调用 SetText 的过程 tControlPanelItem.SetLinesText。 (程序SetText不完整。我只是使用showmessage来查看它是否工作) 好的,我没看到。 (如您所知,几分钟前的代码还不是很漂亮!)但我看不到任何OnChange 嗨。感谢你的快速回复。 FLinesText 是一个字符串列表,据我所知没有 onchange 属性? @Delphiguy:是的,它有:docwiki.embarcadero.com/VCL/en/Classes.TStringList_Events。但是由于变量被声明为TStringsnot 有此事件),您需要明确告诉编译器/IDE 它是TStringList。查看我的更新。 这令人困惑。 FLinesText 被声明为不具有 onchange 属性的 TStrings,但是,FLinesText 被创建为具有 onchange 事件的 TStringList。我应该输入 cast 吗?

以上是关于如何在自定义 delphi 组件中实现 stringlist 属性?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi自定义组件如何在属性面板中实现打开文件的对话框?

Unity3D 在自定义脚本中实现Button组件上的OnClick面板

如何在自定义 Spring 存储库中实现自定义方法? [复制]

如何在自定义 UIButton 中实现 .isHighlighted 动画?

如何在自定义相机中实现“捏放大”

如何使用edittexts在自定义ListView中实现监听器文本更改?