Как получить эквивалент статического (класса) поля в Delphi? - PullRequest
5 голосов
/ 02 января 2012

У меня есть определенная операция в классе, которая очень дорогая.(порядка 8 секунд для полного запуска) Итак, теперь я решил, что он, вероятно, должен запускаться в начале программы во время экрана «инициализации».Однако я не могу найти в Delphi указание на то, что существует такая вещь, как статическое поле.

Что мне в основном нужно сделать, это загрузить список записей и поддерживать их в течение всей жизни программы.Каков наилучший способ сделать это в Delphi?

Я бы сделал это в C # довольно просто:

class Foo{
  static List<...> Bar;
}

Однако в Delphi я не вижу ничего для создания статического поля,Все, что я вижу, это ключевое слово class для создания статических методов

Ответы [ 3 ]

5 голосов
/ 02 января 2012

Вы можете просто использовать глобальную переменную.Добавьте его в раздел implementation устройства, чтобы сделать его локальным для этого устройства.

Мой Turbo Delphi поддерживает class var x:integer;, но я почти уверен, что Delphi 7 этого не делает.

4 голосов
/ 02 января 2012

Я думаю, что сейчас самое время использовать initialization и finalization в Delphi. Это происходит в конце модуля, непосредственно перед end.. Вы можете использовать его для создания / освобождения глобальных экземпляров, подобных этому, или просто для установки переменных по умолчанию ...

unit Unit1;

interface

uses
  Classes;

function MyList: TStringList;    

implementation

var
  GMyList: TStringList;

function MyList: TStringList;
begin
  Result:= GMyList;
end;

initialization
  GMyList:= TStringList.Create;
  MyList.Append('Value 1'); 
  MyList.Append('Value 2');
  MyList.Append('Value 3');

finalization
  GMyList.Free;

end.

Это требует только особых сценариев, подобных этому. MyList будет действовать в течение всего срока действия вашего заявления.

Обратите внимание, как GMyList объявлен под implementation, а MyList на самом деле является глобальной функцией доступа к GMyList. Это чтобы избежать случайных назначений и тому подобное. Из любого другого устройства вы можете получить доступ к GMyList с помощью функции MyList, но не сможете получить прямой доступ к GMyList (именно это вы и хотите избежать ошибок).

3 голосов
/ 02 января 2012

Вам понадобится более новая версия Delphi, если вы хотите настоящую вещь.

Тем не менее, у Паскаля всегда была похожая область видимости, но для этого вы должны (с небольшим количеством фантазии) увидеть юнит как статический финальный класс.

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

Если вы называете свой модуль loader.pas и определяете функцию «init» в разделе интерфейса, вы можете даже вызвать ее, как если бы она была функцией класса: loader.init ().

Разделы инициализации и завершения являются эквивалентом конструктора класса и деструктора класса.

То, что я описал выше, имеет смысл с Turbo Plascal до Delphi 2007 (я думаю, переменные класса были введены в d2009). В общем, я бы посоветовал просто получить более новую версию Delphi.

...