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


迷える子羊  2006-06-13 19:26:45  No: 22165

お世話になります。

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

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

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

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

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


HOta  2006-06-13 19:52:04  No: 22166

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


ふんだりけったり  2006-06-13 19:53:03  No: 22167

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


迷える子羊  2006-06-13 20:41:07  No: 22168

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

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


ふんだりけったり  2006-06-14 00:16:40  No: 22169

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加