コンポーネントでOpenDialogをつかうには?


迷える子羊  2006-06-13 10:26:45  No: 22165  IP: 192.*.*.*

お世話になります。

編集ボックスのコンポーネントで
OpenDialogを表示させようとしています。

private
  FOpenDialog:  TOpenDialog;
published
  OpenDialog:  TOpenDialog  read FOpenDialog  write FOpenDialog;
end;

Create部で
  FOpenDialog := TOpenDialog.Create(Self);

以上のようにしています。
現在、クリック時にOpenDialogを開くまでは良いのですが
オブジェクトインスペクタで設定した
OpenDialogの設定が反映されません。

どのように対応すればよいのでしょうか?

編集 削除
HOta  2006-06-13 10:52:04  No: 22166  IP: 192.*.*.*

動的にOpenDialogを作っていますので、設計時に作成しているものとは別物になっています。
普通に、設計時にポトリペタと貼り付けたものを使えば、設定を反映できます。

編集 削除
ふんだりけったり  2006-06-13 10:53:03  No: 22167  IP: 192.*.*.*

ココ読む
https://www.petitmonte.com/bbs/answers?question_id=3939

編集 削除
迷える子羊  2006-06-13 11:41:07  No: 22168  IP: 192.*.*.*

つまりは、コンポーネントのプロパティで
クラスを渡すことができないということでしょうか?

オブジェクトインスペクタで設定したプロパティは
どこに消えてしまったのでしょう?

編集 削除
ふんだりけったり  2006-06-13 15:16:40  No: 22169  IP: 192.*.*.*

> クラスを渡すことができないということでしょうか?
できます。
「ん?」さんの使い方参照してください。

具体的には
> 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;

編集 削除