お世話になります。
編集ボックスのコンポーネントで
OpenDialogを表示させようとしています。
private
FOpenDialog: TOpenDialog;
published
OpenDialog: TOpenDialog read FOpenDialog write FOpenDialog;
end;
Create部で
FOpenDialog := TOpenDialog.Create(Self);
以上のようにしています。
現在、クリック時にOpenDialogを開くまでは良いのですが
オブジェクトインスペクタで設定した
OpenDialogの設定が反映されません。
どのように対応すればよいのでしょうか?
動的にOpenDialogを作っていますので、設計時に作成しているものとは別物になっています。
普通に、設計時にポトリペタと貼り付けたものを使えば、設定を反映できます。
ココ読む
https://www.petitmonte.com/bbs/answers?question_id=3939
つまりは、コンポーネントのプロパティで
クラスを渡すことができないということでしょうか?
オブジェクトインスペクタで設定したプロパティは
どこに消えてしまったのでしょう?
> クラスを渡すことができないということでしょうか?
できます。
「ん?」さんの使い方参照してください。
具体的には
> property MyPersistent:TMyPersistent read FMyPersistent write SetMyPersistent;
ここ(SetMyPersistent)の中身。
クラス型のプロパティは、インスタンス(ここではFOpenDialog)の置き換え(単純な代入)ではなく、
そのクラスのプロパティを複写するメソッドを用意するのがいいでしょう。
HOtaさんのレスにもあるように、ぽとりぺたりで貼り付けたコンポーネントをプロパティで参照し、
使用するのであれば話は違います。
このときは、迷える子羊さんのくらすでは、TOpenDialogの変数を用意するだけで、
クラス内でTOpenDialogのインスタンスを用意する必要はありません。
ただし、フォーム上からOpenDialogを削除したとき、プロパティをnilにする必要があるので、
Notification(スペル怪しい)を継承し、参照しているOpenDialogが破棄されたことをチェックする必要があります。
var
IA, IB:Integer;
TA, TB:THogeClass;
begin
IA := 1;
IB := 1;
TA := THogeClass.Create;
TB := THogeClass.Create;
//このときこうなります。
IA = IB
TA ≠ TB
//これでTA = TB です
TA := TB;
TA.Free;
TB.Free; //ここでアクセス違反
//元のTAは行方不明
end;
ツイート | ![]() |