Como usar arquivos de unidade em Delphi
-
23-08-2019 - |
Pergunta
Eu só estou tentando pegar o jeito de unidades separadas para tornar meu código mais encapsulado.
Eu estou tentando obter o público / privadas declarações de meus métodos classificados, para que eu possa chamá-los de outras unidades que usam testunit
. Neste exemplo, eu quero tornar pública hellofromotherunit
, mas stickletters
privado.
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.
Eu não conseguia copiar a estrutura privada / pública de outras unidades como em:
Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
Solução
A estrutura da Unidade parece um pouco com o público / seções privadas de objetos, você poderia dizer que é o seu precursor. Mas a sintaxe é diferente.
Você só tem que declarar o cabeçalho do método na seção interface, como em:
interface
procedure hellofromotherunit();
implementation
procedure hellofromotherunit(); begin .. end;
Apenas um de cada seção permitido.
Outras dicas
Privado e Público se aplicam somente a classes.
O que você quer fazer é colocar uma cópia da declaração de hellofromotherunit na seção interface. Não coloque uma cópia da declaração de stickletter lá em cima, no entanto.
Qualquer coisa que aparece na seção interface é efetivamente público. Qualquer coisa que é apenas para baixo na implementação é privado.
Além disso,
Cada unidade tem duas partes distintas. A interface ea implementação.
A seção interface contém todas as definições públicas (tipos, títulos procedimento, constantes). A seção de implementação contém todos os detalhes de implementação.
Quando você usa uma unidade, (usando a cláusula de usos) que você tenha acesso às definições públicas daquela unidade. Este acesso não é recursivo, então se a unidade usa a interface da unidade A B, e a unidade usa C unidade A, você não tem acesso a unidade B, a menos que você usá-lo explicitamente.
A seção de implementação tem acesso à interface, para a unidade usada em ambas as cláusulas usos (interface e implementação).
As interfaces de unidades utilizadas são compilados primeiro antes de continuar a compilar o resto. Isto tem a vantagem de que você pode ter dependências circulares de dentro da aplicação:
unit A;
interface
uses B;
unit B;
interface
implementation
uses A;
que compila:
- tentar interface A, falhar necessidade B
- interface de tentativa B, ok!
- tentar interface A, ok!
- implementação tentativa A, ok!
- implementação tentativa B, ok!
Cada unidade tem também uma seção de inicialização (e se ele tem uma seção de inicialização, ele também poderia ter uma seção de finalização.) A seção de inicialização é usado para inicializar as variáveis ??da unidade. As secções de finalização são utilizados para limpeza. Quando você usá-los, seu sábio não contar com inicializações de outras unidades. Apenas mantê-los simples e curto.
Unidade também são namespaces. Considder o seguinte:
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 um identificador é definido em vários unidades usadas, a última unidade possível na lista de usos é tomada. Então f1 = 2. Mas você pode prefixo com o nome da unidade (namespace) para resolver este problema.
Com a introdução do .net, múltiplos namespaces parte são permitidos que introduz outros problemas agradáveis:
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?
Neste caso, você tem um conflito. Mas isso é resolvido, dando nomes de namespace maior prioridade. Assim, a primeira linha de falha.
Simplesmente não declaram método na seção de interface e que serão mantidos em sigilo.
unit Unit2;
interface
function MyPublicFunction():Boolean;
implementation
function MyPrivateFunction():Boolean;
begin
// blah blah
end;
function MyPublicFunction():Boolean;
begin
// blah blah
end;
end.