Come utilizzare i file di unità in Delphi
-
23-08-2019 - |
Domanda
Sto solo cercando di ottenere il blocco di unità separate per fare il mio codice più incapsulato.
Sto cercando di ottenere le pubbliche / private dichiarazioni dei miei metodi risolto, in modo che io possa chiamare da altre unità che utilizzano testunit
. In questo esempio voglio fare hellofromotherunit
pubblica, ma stickletters
privato.
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.
Non riuscivo a copiare la struttura privata / pubblica da altre unità come in:
Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
Soluzione
La struttura Unità sembra un po 'come sezioni pubblico / privato dagli oggetti, si potrebbe dire che è il loro precursore. Ma la sintassi è diversa.
È sufficiente per dichiarare l'intestazione metodo nella sezione di interfaccia, come in:
interface
procedure hellofromotherunit();
implementation
procedure hellofromotherunit(); begin .. end;
Solo uno di ogni sezione permesso.
Altri suggerimenti
Private & Public valgono solo per le classi.
Che cosa si vuole fare è mettere una copia della dichiarazione di hellofromotherunit nella sezione interfaccia. Non mettere una copia della dichiarazione di stickletter lassù, però.
Tutto ciò che appare nella sezione interfaccia è efficace pubblico. Tutto ciò che è solo verso il basso per l'attuazione è privato.
Inoltre,
Ogni unità ha due parti distinte. L'interfaccia e l'implementazione.
La sezione interfaccia contiene tutte le definizioni pubblici (tipi, intestazioni di procedura, costanti). La sezione implementazione contiene tutti i dettagli di implementazione.
Quando si utilizza un'unità, (utilizzando la clausola uses) si ottiene l'accesso alle definizioni pubbliche di tale unità. Questo accesso non è ricorsiva, quindi se l'unità Un'interfaccia utilizza un'unità B, e l'unità C utilizza unità A, non si ottiene l'accesso alle unità di B a meno che non lo si utilizza in modo esplicito.
La sezione implementazione ha accesso all'interfaccia, all'unità utilizzato sia utilizza clausole (interfaccia e implementazione).
Le interfacce delle unità utilizzate sono compilati prima di continua compilare il resto. Questo ha il vantaggio che si può avere dipendenze circolari dall'interno l'attuazione:
unit A;
interface
uses B;
unit B;
interface
implementation
uses A;
che compila:
- Prova interfaccia A, fallire bisogno B
- provare l'interfaccia B, ok!
- provare l'interfaccia A, ok!
- Prova implementazione A, ok!
- Prova implementazione B, ok!
Ogni unità ha anche una sezione di inizializzazione (e se ha una sezione di inizializzazione, esso potrebbe avere anche una sezione finalizzazione.) La sezione di inizializzazione viene utilizzato per inizializzare le variabili dell'unità. Le sezioni finalizzazione vengono utilizzati per la pulizia. Quando si utilizzano questi, il suo bene a non contare su di inizializzazione di altre unità. Basta tenere loro semplice e breve.
Unità sono anche gli spazi dei nomi. Considder il seguente:
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;
Se un identificatore è definito in più unità d'occasione, viene presa l'ultima unità possibile nella lista di usi. Così f1 = 2. Ma si può prefisso con il nome dell'unità (namespace) per risolvere questo problema.
Con l'introduzione di .net, multi namespace parte sono permessi che introduce altri problemi curato:
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?
In questo caso si ha un conflitto. Ma che si risolve dando i nomi dei namespace priorità più alta. Così la prima linea non riesce.
Semplicemente non dichiarare metodo nella sezione di interfaccia e sarà privato.
unit Unit2;
interface
function MyPublicFunction():Boolean;
implementation
function MyPrivateFunction():Boolean;
begin
// blah blah
end;
function MyPublicFunction():Boolean;
begin
// blah blah
end;
end.