7

我正在创建我的第一个自定义 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.

4

1 回答 1

9

你应该做

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

您可能还需要设置 的OnChange属性FLines(在您创建自定义控件的构造函数中执行此操作)。将其设置为组件的任何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;
于 2010-10-29T09:28:07.990 回答