7

初めてのカスタム Delphi コンポーネントを作成しています。基本的には、ヘッダーと行のテキストが表示されたカスタム Tpanel です。

stringlist を使用して複数行のテキストを追加できるようにしたいと考えています。

コンポーネントをテストするときに、行を追加するときにテキスト行をパネルに表示できません: NewLinesText.add('line1 text')

ただし、実行時に新しい文字列リストを作成して入力し、それを自分のコントロールに割り当てると機能します: controlPanelitem.NewLinesText = MyNewStringlist

次のような行を追加できるようにしたい: NewLinesText.add('line1 text')

WinXP で Delphi 7 プロフェッショナルを使用しています。以下のコードを参照してください。

どんな助けでも大歓迎です!

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 に答える