Как реализовать свойство stringlist в пользовательском компоненте delphi? - PullRequest
7 голосов
/ 29 октября 2010

Я создаю свой первый пользовательский компонент Delphi.Это в основном пользовательский Tpanel с отображаемым на нем заголовком и текстом строк.

Я хочу иметь возможность добавлять несколько строк текста, используя список строк.

При тестировании компонента я не могу отобразить текстовые строки на панели при добавлении строк: NewLinesText.add ('line1 text')

Однако он работает, когда я создаю и заполняюновый список строк во время выполнения, а затем назначьте его моему элементу управления: controlPanelitem.NewLinesText = MyNewStringlist

Я хочу добавить следующие строки: NewLinesText.add ('text1 text')

IЯ использую Delphi 7 Professional на WinXP.См. Код ниже.

Буду признателен за любую помощь!

</p>

<code>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.
</code>

1 Ответ

9 голосов
/ 29 октября 2010

Вы должны сделать

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;
...