概要
TCustomTreeView から派生するコンポーネントを作成しています。オブジェクト インスペクタにドロップダウン リスト (paValueList?) を表示するプロパティを追加したいと考えています。このリストは、自分のコントロールにアタッチされている別のリスト (TStrings) に基づいて動的に設定する必要があります。たとえば、TComboBox、TListBox の項目、または TStringList の文字列などです。
私はいくつかの問題を抱えていますが、いくつかのガイダンスとアドバイスがあれば本当にできます.
コードのレイアウト
読みやすくするためにコードを短くしましたが、レイアウトは基本的に私が持っているものと同じです。
コンポーネント パッケージを 2 つ (同じプロジェクト グループ) に分けPackage1
、コンポーネント コード (たとえば、TCustomTreeView から派生したコンポーネント) で構成しPackage2
、登録手順とデザイナー ユニット (designide.dcp、DesignIntf、DesignEditors など) を含めます。
Package2
の TCustomTreeView から派生したコンポーネントに使用されるプロパティ エディタを追加する必要があると思われる場所ですPackage1
。
パッケージ1
unit MyTreeViewUnit;
implementation
uses
...
Classes,
SysUtils;
type
TMyTreeView = class(TCustomTreeView)
private
FSomeList: TStringList; // property editor should be filled using this list
procedure SetSomeList(const Value: TStringList);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property SomeList: TStringList read FSomeList write SetSomeList;
end;
....
パッケージ2
unit MyTreeViewPropUnit;
implementation
uses
DesignIntf,
DesignEditors,
Classes;
type
TMyTreeViewProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure Edit; override;
end;
implementation
uses
MyTreeViewUnit;
function TMyTreeViewProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList]; ?
end;
procedure TMyTreeViewProperty.GetValues(Proc: TGetStrProc);
begin
inherited;
// These cannot be added here!!
// This list should be populated based on SomeList found in Package1 - MyTreeViewUnit.pas
Proc('Item1');
Proc('Item2');
end;
procedure TMyTreeViewProperty.Edit;
begin
inherited;
// ?
end;
unit MyCompsRegister;
interface
uses
Classes;
procedure Register;
implementation
uses
MyTreeViewUnit;
MyTreeViewPropUnit;
procedure Register;
begin
RegisterComponents('MyTree', TMyTreeView);
RegisterPropertyEditor(TypeInfo(String), TMyTreeView 'Test', TMyTreeView); // does not seem to add to object inspector for the component TMyTreeView
end;
end.
問題
最初の問題は、自分が行っていることが正しいアプローチであるかどうかわからないことです。私のコンポーネントはインストールされ、問題なく使用できますが、私のプロパティ エディター 'Test' は表示されません!
2 番目の問題は、GetValues が設定される方法です。いくつかの記事をオンラインで見ると、プロパティ エディターの入力などに関して、これまでの内容について基本的な洞察が得られました。最初のユニットで SomeList に割り当てられた文字列 (前に述べたように、FSomeList はたとえば TListBox である可能性があります)。
これは問題 2 に関連しており、プロパティ エディタ (作業中) がツリービューと通信できるようにするにはどうすればよいですか?
誰かが私にいくつかの指針を与えることができれば、本当に感謝しています. Delphi.about や DelphiDabbler などで私が読んだものは、理解して従うのが簡単ではありません (私は混乱し、問題でかなり簡単に行き詰まります)。
どうもありがとう!