31

Delphi の公開クラス メンバーと公開クラス メンバーの違いを教えてください。

Delphi ヘルプを調べてみましたが、これらのメンバーの可視性は同じであることは理解していますが、どのように異なるのか、公開メンバーの代わりに公開メンバーをいつ使用する必要があるのか​​ よくわかりません。

どうもありがとう。

4

8 に答える 8

29

コンパイラは、公開メンバーの RTTI (Run-Time Type Information) メタデータを生成しますが、パブリック メンバー (既定では) のメタデータは生成しません。これの主な効果は、オブジェクトの公開されたプロパティが設計時にオブジェクト インスペクターに表示されることです。

コンポーネントを作成しているかどうかはわかりませんが、作成している場合は、オブジェクト インスペクタを使用して設定できるように、プロパティとイベントが通常公開されていることをご存知でしょう。

公衆

public
  property MyProperty: integer read FMyProperty write FMyProperty

MyPropertyObject Inspector には表示されません。

公開済み

published
  property MyProperty: integer read FMyProperty write FMyProperty

MyPropertyオブジェクト インスペクタに表示されます。

于 2010-07-01T12:21:41.483 に答える
24

すでに述べたように、公開プロパティと公開プロパティは同じ可視性を持っています。パブリッシュされたプロパティは RTTI に含まれますが、パブリック プロパティは含まれません。

于 2010-07-01T12:25:54.480 に答える
9

補足として、公開された別の特別なものがあります。

クラス メンバーのデフォルトの可視性publishedはであるため、次のような安全でないコードを確認してください。

  TTopSecret = class(TObject)
    Name: string;
    Password: string;

    function DecryptPassword(const AValue): string;  
  public
    constructor Create(const AName, AEncryptedPassword: string);
  end; 

NamePasswordそしてDecryptPassword()「世界中」で見ることができます。

于 2010-07-01T12:40:02.790 に答える
4

パブリッシュされたプロパティは、ランタイム タイプ情報 (RTTI) をエクスポートします。

Delphi での RTTI については、こちらをご覧ください

于 2010-07-01T12:24:38.700 に答える
4

Object INspector、RTTI などを指摘して、すでに多くの適切な回答があるようです。これらはすべてパズルのピースです。

published キーワードを削除すると、Delphi RAD ツールの設計全体で、どのプロパティが DFM に格納され、コンポーネント プロパティ インスペクタで検査され、フォームまたはデータ モジュールが創造された。

つまり、これがパブリッシュの目的です。QT (元は TrollTech、後の Nokia の一部で、後に Digia にスピンオフ) の設計者が、C++ RAD ライブラリ "QT" 用にこのレベルの RTTI をエミュレートし、"公開された" 相当物と「プロパティ」と同等ですが、純粋な C++ にはまだこの基本的な機能がありません。

于 2010-07-01T13:27:43.940 に答える
3

publishedランタイム型情報 (RTTI) は、クラス メンバーに対してのみ生成されます。

于 2010-07-01T12:24:47.757 に答える
3

実行時には、公開セクションと公開セクションのエントリに等しくアクセスできます

これらの主な違いは、コンポーネントの発行済みアイテムが設計時にオブジェクト インスペクタに表示されることです。

これは、公開されたセクションのフィールドの RTTI が自動的に生成されるために発生します。

Object Inspector はこれをピックアップし、それを使用してプロパティとイベントのリストに追加するものを識別します。

于 2010-07-01T12:35:35.083 に答える
3

他の回答に加えて:

パブリッシュされたプロパティは、ストリーミング システムによって自動的に保存されます。

たとえば、TComponent の子孫インスタンスがあり、それを WriteComponent を使用して TStream に書き込む場合、公開されたすべてのプロパティ(すべてではありませんが、それは別の問題です) は、それ以上コーディングしなくてもストリームに書き込まれます。

もちろん、ストリーミング システムだけがそれを行うことができます。なぜなら、RTTI はそれらの公開されたプロパティで利用できるからです。

于 2010-07-01T12:40:52.010 に答える