web-dev-qa-db-ja.com

Delphiの公開クラスメンバーと公開クラスメンバーの違いは何ですか?

Delphiの公開クラスメンバーと公開クラスメンバーの違いを誰かに説明してもらえますか?

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

どうもありがとう。

29
Ondra C.

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

25
R-D

コンパイラーは、公開メンバーのRTTI(実行時型情報)メタデータを生成しますが、公開メンバーのメタデータは生成しません(デフォルト)。これの主な効果は、オブジェクトの公開されたプロパティがデザイン時にオブジェクトインスペクターに表示されることです。

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

公衆

public
  property MyProperty: integer read FMyProperty write FMyProperty

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

公開

published
  property MyProperty: integer read FMyProperty write FMyProperty

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

26

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

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

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

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

NamePasswordおよびDecryptPassword()は「世界中で」表示されます。

9
mjn

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

見てください ここ DelphiのRTTIについて

4
Ray

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

公開されたキーワードを削除すると、Delphi RADツールの設計全体で、DFMに格納され、コンポーネントプロパティインスペクターで検査され、実行時に再ロードできるプロパティを指定する方法が必要になります。フォームまたはデータモジュールが作成されたときにDFMから。

これは、一言で言えば、Publishedの目的です。 QTの設計者(元々はTrollTech、後にNokiaの一部、後にDigiaにスピンオフ)がC++のこのレベルのRTTIをエミュレートしなければならなかったことは私にとって興味深いですRADライブラリ "QT" 、「公開された」同等物と「プロパティ」同等物を追加しますが、純粋なC++にはまだこの基本的な機能がありません。

4
Warren P

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

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

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

オブジェクトインスペクターはこれを取得し、それを使用して、プロパティとイベントのリストに何を追加するかを識別します。

3
Bharat

他の答えに加えて:

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

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

もちろん、RTTIはこれらの公開されたプロパティで使用できるため、ストリーミングシステムでしか実行できません。

3
Uwe Raabe

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

3
splash