![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает FindClass [D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
BFG9k © (2005-10-26 15:42:00)
var FormClass:TClass;
begin
FormClass:=FindClass('TForm');
end;
Ошибка - Class TForm not found. Но он есть и активно используется в программе (и так со всеми классами). В чем дело ?
BFG9k (2005-10-26 18:32:00) [1]Думаю, что ключевой момент в том, что я создавал форму с момощью меню New-Form. Создавал в пакете, повторюсь еще раз. Delphi7. Регистрировал так :
type
TForm1 = class(TForm)
//ля-ля-ля
end;
implementation
{$R *.DFM}
initialization
RegisterClass(TForm1);
end.
Игорь Шевченко (2005-10-26 17:51:00) [2]BFG9k © (26.10.05 17:32) [9]
> TfSpaRouteConditionForm - что это ?
Наследник TForm :)
> Я пробовал с потомками обычной формы.
Покажи, как ты пробовал и как не получилось.
У меня получилось даже так:
type
TForm1 = class(TForm)
procedure Button4Click(Sender: TObject);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
RegisterClass(TForm1);
end;
Без всяких ошибок. Delphi5.
BFG9k (2005-10-26 17:32:00) [3]
> Все прекрасно работает
TfSpaRouteConditionForm - что это ?
Я пробовал с потомками обычной формы.
Digitman (2005-10-26 16:23:00) [4]
> Игорь Шевченко © (26.10.05 16:17) [6]
> RTTI тут как бы не причем
логично.
ошибку признаю.
дело - в экземпляре списка, к которому происходит обращение при вызове FindClass().
Игорь Шевченко (2005-10-26 16:21:00) [5]BFG9k © (26.10.05 16:08) [5]
> Проблему решил - RegisterClass должен вызываться не в том
> модуле, где этот класс объявляется. Иначе ошибка - класс
> уже зарегестрирован
Ерунда какая.
unit SpaATBP;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SpaConditionForm, StdCtrls, SpaPoint, SpaRouteConditionForm, ActnList,
Buttons;
type
TfSpaATBP = class(TfSpaRouteConditionForm)
end;
implementation
{$R *.DFM}
{ TfSpaATBP }
initialization
RegisterClass(TfSpaATBP);
end.
Все прекрасно работает
Игорь Шевченко (2005-10-26 16:17:00) [6]В обычном приложении такой код тоже вызовет ошибку, несмотря на то, что класс TForm есть.
А вот если перед этим вызывать RegisterClass(TForm), то ошибки не будет.
> RegisterClass() делает свое дело в "своем" экземпляре RTTI
>
> Если у вызывающего и вызываемого модулей разные RTTI
RegisterClass делает свое дело в своем экземпляре Classes.ClassList, RTTI тут как бы не причем, если речь идет о пакетах
BFG9k (2005-10-26 16:08:00) [7]RTTI один и тот же. Проблему решил - RegisterClass должен вызываться не в том модуле, где этот класс объявляется. Иначе ошибка - класс уже зарегестрирован.
Digitman (2005-10-26 16:05:00) [8]
> BFG9k © (26.10.05 15:58) [2]
RegisterClass() делает свое дело в "своем" экземпляре RTTI
Если у вызывающего и вызываемого модулей разные RTTI, то и ожидать "чудес" от FindЧегоТоТам() не следует.
Reindeer Moss Eater (2005-10-26 16:00:00) [9]>Я регистрирую свой класс в пакете (BPL) с помощью RegisterClass.
Остается проверить, вызывается ли код регистрации класса при загрузке BPL
BFG9k (2005-10-26 15:58:00) [10]Усложним задачу.
Я регистрирую свой класс в пакете (BPL) с помощью RegisterClass. После того как основная программа загрузила пакет с помощью LoadPackage, класс не находится с помощью FindClass. Так и должно быть ?
Leonid Troyanovsky (2005-10-26 15:48:00) [11]
> BFG9k © (26.10.05 15:42)
> Ошибка - Class TForm not found. Но он есть и активно используется
> в программе (и так со всеми классами). В чем дело ?
RTFM: RegistreClass
--
Regards, LVT.