![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить класс? [D3, Win2k]
DenK_vrtz © (2002-11-01 15:43:00)Привет, знатокам!
Воросик вот какого плана. В проекте есть форма, и лежит она в Availabes forms.
Как по имени формы получить имя класса этой формы?
И еще! Почему процедура RegisterClasses, регистрирующая класс, должна быть прописана в секции инициализации в модуле, содержащем, скажем, эту форму?
Пробовал прописать в другом модуле - выдает ошибку!!!
Заранее спасибо!
DenK_vrtz (2002-11-04 08:14:00) [1]Всем огромное спасибо! :-)
KSergey (2002-11-04 05:49:00) [2]> DenK_vrtz © (03.11.02 19:17)
> 2 KSergey ©, но дело в том, что проект на этапе разработки
> знает о всех своих формах и их классах!!! Это к тому, что
> "Если форма не создана - нет и ее имени!" Так откуда эту
> информацию можно получить, если это возможно?
Занятный вы человек: дельфи располагает всей информацией о проекте, вот в чем штука. И это естественно. Тем более, что вы сами же ручками имя форме и присваиваете. А это все в DFM хранится. Таким образом можно конечно пойти через задний проход и перевормулировать вопрос "а как определить класс формы, которыя послесоздания будет иметь такое то имя"; возможно покопавшись в ресурсах своего приложения вы это и найдете, но стоит ли оно того и правильно ли это?!
> А задача вот в чем. В таблице хранится имя(не класс!!!)
> формы, которой нужно сделать create (поле строкового типа),
> а форма эта находится в Available forms.
Не буду претендовать на наилучший метод, но делаю такое так: объявляется перечисление с необходимыми классами форм, которые я хочу создавать, а в БД хранится индекс в этом перечислении.
Под руками исходника нет, если что - нпишите письмо - пришлю как это определяется, впрочем это не сложно.
DenK_vrtz (2002-11-03 19:17:00) [3]Спасибо, Господа, что не оставили мой вопрос без внимания!!!!
2 reonid ©, я отлично понимаю, что имя формы отличается от имени класса всего на одну букву!!! :-)) НО, может есть стандартный метод решения проблемы?
2 KSergey ©, но дело в том, что проект на этапе разработки знает о всех своих формах и их классах!!! Это к тому, что "Если форма не создана - нет и ее имени!" Так откуда эту информацию можно получить, если это возможно?
А задача вот в чем. В таблице хранится имя(не класс!!!) формы, которой нужно сделать create (поле строкового типа), а форма эта находится в Available forms.
KSergey (2002-11-01 17:38:00) [4]О, дошло как автору подсказать!
Если форма не создана - нет и ее имени! Вот в чем штука! Есть только класс. Более того, формы одного и того же класса должны будут при одновременном создании иметь разные имена. Чувствуете, к чему я клоню? Нет искомого вами соответствия в принципе.
Лучше опишите что выхотите на самом деле получить, и может найдется решение, доступное в рамках дельфи.
DieHard (2002-11-01 17:24:00) [5]имя_класса_этой_формы:=AForm.ClassName;
reonid (2002-11-01 17:24:00) [6]DenK_vrtz ©
>А как по имени формы??????
Имя формы, созданной дизайнером форм, отличается от
имени класса всего лишь на одну букву.
Надеюсь, не надо говорить, какую :)))
>Screen не видит формы из Available forms
Только ручная регистрация. Иначе, ИМХО, к именам не созданных
форм не подберёшься.
>Так чтоб RegisterClass работал в uses надо имя модуля надо >указывать???
Да (в имплементэйшн).
А что тебе мешает регистрировать форму в её собственном модуле?
Андрей Прокофьев (2002-11-01 17:21:00) [7]2 DenK_vrtz © (01.11.02 17:10)
Я перестал что-либо понимать, извините...
DenK_vrtz (2002-11-01 17:10:00) [8]Как по имени класса create сделать я знаю!
А как по имени формы?????? Все выше перечисленное - это create по имени класса.
Peter Gluhiy, а Screen не видит формы из Available forms. Проверял!!!!
Так чтоб RegisterClass работал в uses надо имя модуля надо указывать???
Спасибо!
reonid (2002-11-01 17:07:00) [9]Андрей Прокофьев © (01.11.02 17:06)
:)))
Андрей Прокофьев (2002-11-01 17:06:00) [10]2 reonid © (01.11.02 17:03)
:)))
reonid (2002-11-01 17:03:00) [11]Регистрируй формы вручную.
Почему у тебя RegisterClass не работает в другом модуле -
не знаю. У меня всё работает.
2Андрей Прокофьев © (01.11.02 16:51)
xF := TForm Class(FindClass("TMyForm")).Create(Self);
Андрей Прокофьев (2002-11-01 17:00:00) [12]Sorry
var
xF : TCustomForm;
begin
xF := TCustomFormClass(FindClass("TForm2")).Create(Self);
xF.Show;
Андрей Прокофьев (2002-11-01 16:51:00) [13]var xF : TForm;
xF := TForm(FindClass("TMyForm")).Create(Self);
xF.Show;
Peter Gluhiy (2002-11-01 16:47:00) [14]Примерно так:
function FindForm(Name: string): TForm;
var
i: Integer;
begin
Result := nil;
for i := 0 to Screen.FormCount-1 do
if AnsiUpperCase(Screen.Forms[i].Name) = AnsiUpperCase(Name) then
begin
Result := TForm(Screen.Forms[i]);
break;
end;
end;
Подходит?
DenK_vrtz (2002-11-01 16:19:00) [15]Может я не правильно объяснил?! НО...
Нужно сделать create форме, находящейся в Available forms, из другой формы по ее строковому имени. Отсюда и вопрос, как по имени формы получить имя класса?
А как применить Tobject.classname я что то не понял!!!
xm (2002-11-01 16:01:00) [16]Как по имени формы получить имя класса этой формы?
метод tobject.classname
Пробовал прописать в другом модуле - выдает ошибку!!!
интересно, какую? только что попробовал - все работает. может ты в uses юнит с формой не прописал?