powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCustomFormClass. Вопрос на засыпку, уважаемые.
19 сообщений из 19, страница 1 из 1
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32138525
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
var 
DocClass:TCustomFormClass;
DocEditor:TCustomForm;
begin
DocClass: TMyDocForm;
DocEditor:=DocClass.Create(Self)
end


А теперь вопрос, как мне это сделать, если я имею "TMyDocForm" в строковом формате.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32138534
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Если я тебя правильно понял, то RTFM:

Finds and returns a class that is derived from TPersistent.

function FindClass(const ClassName: string): TPersistentClass;

Description

Call FindClass to locate a class type by name. FindClass searches the classes that the streaming system knows about. Form classes and component classes that are referenced in a form declaration (instance variables) are automatically registered with the streaming system. Other classes can be registered (with a call to RegisterClasses) so that the streaming system will recognize that class in a stream and know how to construct it.

If the requested class name cannot be found, FindClass raises an exception.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32138656
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я это читал в хелпе, но как это реализовать, я не понял.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32139186
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
type
TXClass=class of TCustomForm;
var
trikuku: TXClass;
MyForm:TCustomForm;
begin
trikuku:=TXClass(FindClass("TMyForm"));
MyForm:=trikuku.Create(Application);

Реально ты получишь в результате в MyForm экземпляр класса TMyForm.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32139266
-Eugene-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для использования функций FindClass и GetClass необходимо сначала зарегистрировать пользовательский класс функцией RegisterClass или RegisterClasses. Их описание приведено в хелпе. Обычно регистрация выполняется в секции initialization модуля. Хорошем стилем в секции finalization добавить парную UnRegisterClass. Пример можно посмотреть в самом VCL, выполнив поиск в исходниках VCL по RegisterClass.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32139282
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Ну, ясен пень, надо RegisterClass вызывать... Куда ж без него. Но это как раз в хелпе написано, а человек не может понять, как то, что написано в хелпе, реализовать.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32145118
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все сделал, регистрирую класс в initialization в модуле класса. Но при команде findclass, выдает: не могу найти класс.
Что делать?
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32149701
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Назвали "дураком", а на вопрос не ответили!!
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32150528
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Точно напиши, как ты его зарегистрировал.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32150572
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я вставлял в разные модули, эфект один и тот же:
Код: plaintext
1.
initialization
RegisterClass(TfrmDoc1002);


Затем где-нить:
Код: plaintext
1.
2.
3.
4.
function TfrmDocBook.GetClassForm():TCustomFormClass;
begin
Result:=TCustomFormClass(FindClass('TfrmDoc1002'));
end

Не работает, выдает "не могу найти класс".
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32150586
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Надо писать не просто RegisterClass, а Classes.RegisterClass.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32150640
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помогло
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32150659
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Попробуй на тестовом приложении сделать. На TFORM1 нового только что созданного проекта.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32152964
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал.
На тестовом работает, а в моем проекте нет. Ничего не помимаю.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32153848
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Давай по шагам.

Сначала вызови FindClass в своем проекте непосредственно после RegisterClass.

Потом отключи все findclass, Которые есть и сделай findclass либо в OnCreate формы, которая является экземпляром этого класса, либ сразу после создания этой формы.

И это... я надеюсь, у тебя код и ресурс формы не в DLL? (или RegisterClass - в DLL, а код и ресурс класса формы - в основном модуле).
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32153938
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все попробовал, даже вот так сделал:
Код: plaintext
1.
2.
initialization
RegisterClass(TfrmMain);
FindClass('TfrmMain');

Все это я делаю в основной форме. Все равно пишет, что класс не найден.

А что насчет DLL, если я подключаю DLL, в которой есть класс который я хочу подключить, там система та же?
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32154018
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Ну-ка создай новый пустой проект, там в юните основной формы вставь секцию инициализации:

Код: plaintext
1.
2.
3.
4.
initialization

 Classes.RegisterClass(TForm1);
 if Classes.FindClass('TForm1')=nil then
   raise Exception.Create('Suxxxxx');


И проверь.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32154839
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну проверял ведь, на новом проекте все работает.
А в моем не рабоатет. Этот проект я не сначала делал, т.е. я перенял в процессее. Некоторые формы я не трогал, но знаю что там планировалось работать с DLL'шками. Вот и вопрос, что в этом проеке может быть, что мешает работать связке RegisterClass, FindClass.
...
Рейтинг: 0 / 0
TCustomFormClass. Вопрос на засыпку, уважаемые.
    #32155071
WO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WO
Гость
Если у тебя форма (т.е., код её юнита и её ресурс) в DLL, а FindClass делаешь в приложении - не покатит. DLL - это ж весчь в себе. И копия VCL на каждую из них - своя. Ну и переменная Classes.ClassList типа TThreadList, в которой и хранится список зарегистрированных классов - тоже у каждой DLL - своя. И если ты RegisterClass делаешь из DLL при загрузке этой DLL, а FindClass - из самого приложения, то ты обращаешься к той переменной, которая находится в приложении.
В этом случае СОДР одно из трех:
1) Немедленное сэппоку. Эффективно очень. Попробуй.
2) Runtime Packages
3) Спец. экспортируемая функция в каждой DLL (с предопределенным именем, напр.), которая по имени класса будет вызывать Findclass внутри DLL и возвращать указатель на класс в вызывающее приложение.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCustomFormClass. Вопрос на засыпку, уважаемые.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]