Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  1 438

•  TDictionary Custom Sort  4 145

•  Fast Watermark Sources  3 826

•  3D Designer  5 893

•  Sik Screen Capture  4 089

•  Patch Maker  4 627

•  Айболит (remote control)  4 540

•  ListBox Drag & Drop  3 713

•  Доска для игры Реверси  89 088

•  Графические эффекты  4 874

•  Рисование по маске  3 903

•  Перетаскивание изображений  3 285

•  Canvas Drawing  3 579

•  Рисование Луны  3 378

•  Поворот изображения  2 872

•  Рисование стержней  2 556

•  Paint on Shape  1 958

•  Генератор кроссвордов  2 711

•  Головоломка Paletto  2 143

•  Теорема Монжа об окружностях  2 825

•  Пазл Numbrix  1 934

•  Заборы и коммивояжеры  2 508

•  Игра HIP  1 547

•  Игра Go (Го)  1 487

•  Симулятор лифта  1 754

•  Программа укладки плитки  1 503

•  Генератор лабиринта  1 867

•  Проверка числового ввода  1 620

•  HEX View  1 803

•  Физический маятник  1 639

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Поиск класса



Автор: 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.





Похожие по теме исходники

Поисковик

Поиск символа

Поиск файлов

Поиск открытых файлов

 

Findup (поиск дублей)

Дейкстра: поиск кратчайшего пути




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте