Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Поиск класса

Автор: Mike Scott

Могу ли я во время выполнения приложения определить, существует ли класс с именем Tlog?

Используйте в модуле TLog RegisterClass( TLog ) или потомка TLog, затем FindClass( 'TLog' ) или FindClass( 'TLogSubclass' ) для получения ссылки на класс в вызывающем модуле, позволяя тем самым пользоваться объектами данного класса. Вы также могли бы добавить классовый метод, возвращающий существующий экземпляр или NIL, или который создает и возвращает новый экземпляр при отсутствии текущего.

Самое необходимое, что нужно сделать, это создать абстрактный, чисто виртуальный базовый класс TLog, и TLogSubclass, реально наполненный функциональным назначением. Вызывающему оператору необходимо знать всего лишь о TLog, а не о TLogSubclass, чтобы получить доступ к его методам и свойствам.

Тем не менее, я считаю не лучшим решением технологию поиска класса по его имени. Вот что предлагаю я:


unit LogUnit;
interface

type
  TLog = class
  public
    constructor Create;
    procedure LogMessage(const Message: string); virtual; abstract;
  end;

var
  Log: TLog;

implementation

constructor TLog.Create;
begin
  Log := Self;
end;

procedure TidyUp; far;
begin
  Log.Free;
end;

initialization

  AddExitProc(TidyUp);
end.


unit LogImpl;

interface

implementation

uses Log;

type
  TLogImplementation = class(TLog)
  public
    procedure LogMessage(const Message: string); override;
  end;

procedure TLogImplementation.LogMessage(const Message: string);
begin
  { записываем сообщение в журнальный файл }
end;

initialization

  TLogImplementation.Create;
end.

Обратите внимание на то, что здесь используются "скрытые" данные - класс TLogImplementation объявлен внутри секции реализации модуля LogImpl, поэтому никакой другой модуль их не видит. Фактически, интерфейсная часть полностью пустая! Вы можете протестировать это, изучив Log и увидев NIL в самом начале.

Кроме того, вы могли бы иметь ничего не делающий TLog.LogMessage. Затем вы могли бы создать экземпляр TLog в секции инициализации модуля LogUnit.pas, и освобождать его перед созданием экземпляра TLogImplementation в LogImpl.pas. Таким образом, для подключения к приложению класса, нужно просто добавить к проекту модуль LogImpl.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay