Delphi でユニット ファイルを使用する方法
-
23-08-2019 - |
質問
コードをよりカプセル化するために、個別のユニットのコツを掴もうとしているところです。メソッドのパブリック/プライベート宣言を整理して、メソッドを使用する他のユニットからメソッドを呼び出せるようにしようとしています。 testunit
. 。この例で作りたいのは、 hellofromotherunit
公共ですが、 stickletters
プライベート。
unit testunit;
interface
uses
Windows, Messages, Dialogs;
implementation
function stickletters(a,b:string):string;
begin
result:=a+b;
end;
procedure hellofromotherunit();
begin
showmessage(stickletters('h','i'));
end;
end.
次のように、他のユニットからプライベート/パブリック構造をコピーできないようです。
Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
解決
ユニットの構造はビットオブジェクトからパブリック/プライベートセクションのように見える、あなたはそれが彼らの先駆者であると言えるでしょう。しかし、構文が異なります。
あなただけのように、インターフェース部方法ヘッダーを宣言しなければなりません
interface
procedure hellofromotherunit();
implementation
procedure hellofromotherunit(); begin .. end;
許可された各セクションの一つだけ。
他のヒント
プライベート&パブリッククラスのみに適用されます。
あなたがインターフェイス部にhellofromotherunitの宣言のコピーを入れて何をしたいのか。しかし、そこまでstickletterの宣言のコピーを入れないでください。
インターフェース部に表示されるものは、効果的に公開されています。実装にのみダウンだものはプライベートです。
加えて、
各ユニットには 2 つの異なる部分があります。インターフェースと実装。
インターフェイス セクションには、すべての公開定義 (型、プロシージャの見出し、定数) が含まれています。実装セクションには実装の詳細がすべて含まれています。
ユニットを使用すると、(uses 句を使用して)そのユニットのパブリック定義にアクセスできるようになります。このアクセスは再帰的ではないため、ユニット A インターフェイスがユニット B を使用し、ユニット C がユニット A を使用する場合、明示的に使用しない限り、ユニット B にアクセスすることはできません。
実装セクションは、インターフェイス、両方の use 句 (インターフェイスと実装) で使用されるユニットにアクセスできます。
使用されるユニットのインターフェイスが最初にコンパイルされてから、残りのコンパイルが続行されます。これには、実装内から循環依存関係を持たせることができるという利点があります。
unit A;
interface
uses B;
unit B;
interface
implementation
uses A;
コンパイルするもの:
- インターフェイス A を試して、失敗する必要がある B
- インターフェイス B を試してください。OK!
- インターフェイス A を試してください。OK!
- 実装 A を試してください。OK!
- 実装 B を試してください。OK!
各ユニットには初期化セクションもあります (初期化セクションがある場合は、終了セクションも持つことができます)。初期化セクションは、ユニットの変数を初期化するために使用されます。ファイナライズセクションはクリーンアップに使用されます。これらを使用する場合、他のユニットの初期化を当てにしないのが賢明です。シンプルかつ短くしてください。
ユニットも名前空間です。次の点を考慮してください。
unit A;
interface
const foo = 1;
unit B;
interface
const foo = 2;
unit C;
interface
uses A, B;
const
f1 = foo;
f2 = A.foo;
f3 = B.foo;
識別子が複数の使用単位で定義されている場合は、使用リスト内で可能な最後の単位が使用されます。したがって、f1 = 2となります。ただし、この問題を解決するには、ユニット (名前空間) 名をプレフィックスとして付けることができます。
.net の導入により、複数の部分からなる名前空間が許可されるため、次のような別の優れた問題が発生します。
unit foo;
interface
type
rec1 = record
baz : Boolean;
end;
var
bar : rec1;
unit foo.bar;
interface
var
baz : Integer;
uses
foo, foo.bar;
begin
foo.bar.baz := true;
foo.bar.baz := 1;
end.
// 1. Which these lines gives an error and why?
// 2. Does the result change if you write uses foo.bar, foo?
この場合、競合が発生します。しかし、これは名前空間名に高い優先順位を与えることで解決されます。したがって、最初の行は失敗します。
単にインターフェース部でメソッドを宣言していないと、それは秘密にされます。
unit Unit2;
interface
function MyPublicFunction():Boolean;
implementation
function MyPrivateFunction():Boolean;
begin
// blah blah
end;
function MyPublicFunction():Boolean;
begin
// blah blah
end;
end.