Я тут наткнулся на ошибку, появившуюся вследствии использования "Шаманского метода Гео". Уже второй раз натыкаюсь на неё и второй раз удивляюсь тому, откуда она взялась.
Симптомы ошибки
При вызове процедуры 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;
Пока что решил проблему, написав собственную реализациию вызвавшей проблему функции. А "метод Гео" действительно удобен, и отказываться от него пока не собираюсь.
- А пока мы тут отлаживаем свои программы %username%, кое-кто их уже написал и отладил. И даже выложил в интернет, чтобы скачать бесплатно новые бесплатные программы могли все желающие.
А почему "метод Гео" ? Первый раз слышу такой термин.
ОтветитьУдалитьПросто название. Надо же как-то его называть. =)
ОтветитьУдалитьИменно под названием "Шаманский метод Goe" этот метод был описан в статье на сайте Королевства Delphi. Под этим же названием этот метод упоминался в блогах Gunsmoker-a, Всеволода Леонова и других. Т.е. это название уже вроде как и прижилось.
Конечно, сам метод существовал и использовался задолго до того, как был описан под этим названием в Королевстве. Он использовался ещё со времён Delphi 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."
Вообще-то, "шаманский метод Geo" предназначен для создания наследника, когда его не хочется регистрировать. Если же класс будет регистрироваться, то применение метода неоправдано. В этом случае как раз и нужно давать классу собственное уникальное имя.
ОтветитьУдалить