Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не работает 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо