1

少し質問があります (知的好奇心)。(フォームの) コントロールがプライベートとして宣言され、動的に作成された場合、FindComponent を使用してクラスの外部にアクセスできることに気付きました。

論理的に正しいですか?

4

3 に答える 3

4

FindComponent は、所有者と名前に基づいてコンポーネントを返します。クラスメンバー変数をまったく使用せずに FindComponent を使用しようとすることでわかるように、プライベート変数を使用しません (代わりにローカル変数を使用します): 引き続き機能します。

キーワードprivateは、その名前を参照できないことを意味するだけです。基になるコントロールを参照する他の方法が提供されている場合、キーワードはそれを防ぐために何もしません。

于 2012-07-06T06:20:10.880 に答える
4

これは、コントロールが作成されると、所有されているコンポーネントの所有者リストに自分自身を登録するために発生します。したがって、コントロールへの複数の参照があります。

フォームのクラス内のコントロールへの参照は、実際には非公開です。ただし、フォームがコンポーネント リストに保持するコントロールへの参照はパブリックです。

論理的には、これはプロパティを介してプライベート変数を公開するのと非常に似ています。

property MyPublicProp: TMyControl read FMyPrivateField;

このようにプライベート フィールドを直接公開することはありませんが、コントロールは所有フォームに登録することで間接的に公開します。

于 2012-07-06T06:22:27.087 に答える
0

それは論理的ですか?プライベート変数は、このユニットの外部のコードではアクセスできません。また、 を使用する場合、このクラスの外部のコードではアクセスできませんstrict private。それがプライベートな可視性が意味するすべてです。

確かに、プロパティを使用FindComponentまたはステップスルーすることでそれを回避Componentsできますが、所有者を割り当てないことで回避できます。(注: 親を設定すると、自動破棄に所有者は必要ありません)。Controlsただし、親のプロパティをステップスルーすることで、これを回避できます。また、プライベート変数がコントロールではなく整数である場合でも、ハックを使用してその変数にアクセスできますが、その場合、クラスタイプの署名/宣言を知る必要があります。

質問に詳しく答えるには、可視性インジケーターが作成された理由と、その使用がどのように意図されたかを知る必要があります。それらは、変数を盗難から保護するために設計されたのではなく、プログラマーがクラス内で管理上の内部タスクを実行し、それらのクラスのユーザーに特定の処理を課すことができるようにするためだけに設計されたと思います。プログラムもコンポーネントも、ハッキングのない状態になることはありません。

于 2012-07-06T11:21:12.583 に答える