Motto

В тихом саду здравомыслия
Пусть на вас постоянно падают
кокосовые орехи пробужденности.
Чогьям Трунгпа РИНПОЧЕ


Версия для мобильного


вторник, 10 мая 2011 г.

Текучка 13: “шаманский метод Гео” + RegisterClass = EFilerError

Я тут наткнулся на ошибку, появившуюся вследствии использования "Шаманского метода Гео". Уже второй раз натыкаюсь на неё и второй раз удивляюсь тому, откуда она взялась.

Симптомы ошибки

При вызове процедуры RegisterClass для класса появлется исключение EFilerError с текстом ошибки: “A class named XXX already exists”.

Расследование показало что эта ошибка появляется, если RegisterClass был вызван дважды для разных классов с одним и тем же названием.

Казалось бы, причём тут метод Гео?

А вот при том, что именно из-за подмены одного класса другим у меня в коде и возникла ситуация вызвавшая ошибку. В частности, я использую “метод Гео” для подмены стандартного TDbGrid-a своим наследником от TDbGridEh. Для работы моей программы (crm системы) мне необходимо зарегистрировать свой DbGrid. Так что при старте программы я спокойно регистрирую свой класс. А после получаю вышеупомяную ошибку при вызове одного из методов одной из сторонних библиотек, которой также необходимо зарегистрировать класс TDbGrid.

Пример кода вызывающего ошибку:

type
  // для простоты заменяем TDbGrid на TButton
  TDbGrid = class(TButton) 
  end;

procedure TForm5.btnGeoFailClick(Sender: TObject); 
begin
  // регистрируем класс оригинального TDbGrid-а 
  RegisterClass(DbGrids.TDBGrid);
  // регистрируем этот класс ещё раз. Никаких ошибок.
  RegisterClass(DbGrids.TDBGrid);

  // регистрируем свой класс TDbGrid
  RegisterClass(TDBGrid); // получаем EFilerError
end;

Пока что решил проблему, написав собственную реализациию вызвавшей проблему функции. А "метод Гео" действительно удобен, и отказываться от него пока не собираюсь.


4 комментария:

  1. А почему "метод Гео" ? Первый раз слышу такой термин.

    ОтветитьУдалить
  2. Просто название. Надо же как-то его называть. =)

    Именно под названием "Шаманский метод Goe" этот метод был описан в статье на сайте Королевства Delphi. Под этим же названием этот метод упоминался в блогах Gunsmoker-a, Всеволода Леонова и других. Т.е. это название уже вроде как и прижилось.

    Конечно, сам метод существовал и использовался задолго до того, как был описан под этим названием в Королевстве. Он использовался ещё со времён Delphi 3, если не ошибаюсь (а может и раньше).

    ОтветитьУдалить
  3. По данной проблеме достаточно четко говорится в Help.
    Цитирую:
    "If the class is already registered, RegisterClass does nothing. If a different class with the same name is already registered, RegisterClass raises an EFilerError exception."

    ОтветитьУдалить
  4. Вообще-то, "шаманский метод Geo" предназначен для создания наследника, когда его не хочется регистрировать. Если же класс будет регистрироваться, то применение метода неоправдано. В этом случае как раз и нужно давать классу собственное уникальное имя.

    ОтветитьУдалить

Постоянные читатели