Как использовать файлы модулей в Delphi - PullRequest
2 голосов
/ 03 апреля 2009

Я просто пытаюсь освоить отдельные модули, чтобы сделать мой код более инкапсулированным. Я пытаюсь отсортировать публичные / частные объявления моих методов, чтобы я мог вызывать их из других модулей, которые используют 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

Ответы [ 4 ]

6 голосов
/ 03 апреля 2009

Структура модуля выглядит как открытые / открытые разделы объектов, можно сказать, что это их предшественник. Но синтаксис другой.

Вы должны только объявить заголовок метода в разделе интерфейса, как в:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

Допускается только один из каждого раздела.

5 голосов
/ 03 апреля 2009

Частные и общедоступные относятся только к классам.

Что вы хотите сделать, это поместить копию объявления hellofromotherunit в раздел интерфейса. Однако не помещайте туда копию декларации наклеек.

Все, что появляется в разделе интерфейса, является общедоступным. Все, что находится только в реализации, является приватным.

1 голос
/ 06 апреля 2009

Кроме того,

Каждый блок состоит из двух отдельных частей. Интерфейс и реализация.

Раздел интерфейса содержит все публичные определения (типы, заголовки процедур, константы). Раздел реализации содержит все детали реализации.

Когда вы используете юнит, (с помощью условия использования) вы получаете доступ к общедоступным определениям этого юнита. Этот доступ не является рекурсивным, поэтому, если интерфейс блока A использует блок B, а блок C использует блок A, вы не получите доступ к блоку B, если не используете его явно.

Раздел реализации имеет доступ к интерфейсу, к модулю, используемому в обоих разделах использования (интерфейс и реализация).

Интерфейсы используемых модулей компилируются первыми, а затем продолжают компилирование остальных. Это имеет то преимущество, что вы можете иметь циклические зависимости внутри реализации:

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

Что компилируется:

  • попробуйте интерфейс A, сбой нужен B
  • попробуй интерфейс B, ок!
  • попробуй интерфейс А, ок!
  • попробуйте реализацию A, ок!
  • попробуйте реализацию B, ок!

У каждого модуля также есть раздел инициализации (и если у него есть раздел инициализации, он также может иметь раздел финализации.) Раздел инициализации используется для инициализации переменных модуля. Разделы финализации используются для очистки. Когда вы используете их, не стоит рассчитывать на инициализацию других модулей. Просто держите их простыми и короткими.

Единицей также являются пространства имен. Рассмотрим следующее:

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?

В этом случае у вас конфликт. Но это решается путем придания именам пространства имен более высокого приоритета. Так что первая строка заканчивается неудачей.

0 голосов
/ 21 сентября 2016

Просто не объявляйте метод в разделе интерфейса, и он останется закрытым.

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

function MyPrivateFunction():Boolean;
begin
  // blah blah
end;

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...