Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Как проверить является ли экземпляр потомком класса   Найти похожие ветки 

 
Andrey Kononov ©   (2005-06-06 16:58) [0]

Доброго времени суток.

Как можно проверить является ли экземпляр окна, хранимого в ActiveMDIChild потомком некоторого класса?

Есть класс TBaseForm от которого делается несколько дочерних форм в приложении. Есть дочерние приложения сделанные от TForm.

Как мне сделать такую проверку

if not (ActiveMDIChild is TBaseForm) then
begin
 ......
 Exit;
end;

Конструкция всегда показывает, что ActiveMDIChild никогда не бывает наследником TBaseForm, хотя это не так.

Что можно сделать?


 
Skier ©   (2005-06-06 17:00) [1]


> хотя это не так

Как проверял ?


 
Sergey_Masloff   (2005-06-06 17:00) [2]

TObject:
class function InheritsFrom(AClass: TClass): Boolean;


 
Digitman ©   (2005-06-06 17:02) [3]


> Есть дочерние приложения сделанные от TForm


галиматья какая-то ..

и немудрено что


> ActiveMDIChild никогда не бывает наследником TBaseForm


 
Andrey Kononov ©   (2005-06-06 17:07) [4]

>> Как проверял?

В коде делал комментарии и проверял. Всегда наследник от TForm.

 if not (ActiveMDIChild is TForm) then
//  if not (ActiveMDIChild is TBaseForm) then
 begin
   Exit;
 end;

> Sergey_Masloff:

 Так тоже не работает. Или что-то не так сделал?

 if not ActiveMDIChild.InheritsFrom(TBaseForm) then
 begin
   Exit;
 end;


 
Andrey Kononov ©   (2005-06-06 17:11) [5]

>Digitman

>галиматья какая-то ..

Сорри. Дочерние окна.
Но как быть-то, когда надо проверить? Неужели надо писать все окна от одного класса, или вводить какой-нибудь флаг в главной форме, который будет следить за типом активной формы?


 
evvcom ©   (2005-06-06 17:29) [6]


> Сорри. Дочерние окна.

Не дочерние окна, а дочерние классы. Все должно работать, если это не опять работа с dll без галки "build with run-time packages"


 
Abessalom   (2005-06-06 20:36) [7]


> Sergey_Masloff   (06.06.05 17:00) [2]

оператор is в конечном счете вызывает этот самый инхериц фром.


> Andrey Kononov ©

Вроде у тебя все правильно, только каким образом ты все-таки определяешь, что у тебя не работает?

if not (ActiveMDIChild is TForm) then
//if not (ActiveMDIChild is TBaseForm) then
begin
  Exit;
end;
//A.: а здесь у тебя, ну, например, сообщение? О чем?


Не в логике ли потери? Создай две формы. Одна со стилем fsMDIForm (Form1), fsMDIChild(Form2). В проект добавь новую форму - наследника TForm2 - это будет TForm3. Обе формы - в список автоматического создания. Нижеприведенный код работает, как часы:

uses Unit2, Unit3;

{$R *.dfm}

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
 if ActiveMDIChild is TForm3 then
   ShowMessage("TForm3")
 else if ActiveMDIChild is TForm2 then
   ShowMessage("TForm2");
end;


 
Andrey Kononov ©   (2005-06-07 09:17) [8]

> evvcom

> Все должно работать, если это не опять работа с dll без галки "build with run-time packages"

Это работа с dll только с галкой "build with run-time packages"  пакеты "vcl". Здесь можно что-нибудь сделать?

> Abessalom

Пример попробовал - все работает. А в моем приложении не хочет.

Делаю так:



procedure TfrmMain.ItemClick(Sender: TObject);
begin
if ActiveMDIChild is TBaseForm then
  ShowMessage("Is TBaseForm")
else
  ShowMessage("It is not TBaseForm")
end;



Может вопрос действительно в том, что я использую dll?


 
evvcom ©   (2005-06-07 11:05) [9]

Че-то мне телепатор более ничего не подсказывает.


 
Andrey Kononov ©   (2005-06-07 12:30) [10]

Нашел решение. Правда некрасивое, но все-таки...


if UpperCase(ActiveChildForm.ClassParent.ClassName) = "TBASEFORM" then
begin
 ...
end;


 
Digitman ©   (2005-06-07 13:54) [11]


> Нашел решение. Правда некрасивое, но все-таки...


действительно некрасивое

ниже - то же самое, только чуть "красивей"

if ActiveChildForm.ClassParent = TBASEFORM then

и уж если эти "некрасивое" и "чуть более красивое" решения работают, то должно работать и решение с is, потому как этот оператор неявно обращается все к тому же ClassParent


 
evvcom ©   (2005-06-07 14:30) [12]

А где у тебя TBaseForm реализован? Описан в unit, который потом сидит в uses и в exe, и в dll?


 
Andrey Kononov ©   (2005-06-07 17:38) [13]


> evvcom ©   (07.06.05 14:30) [12]
> А где у тебя TBaseForm реализован? Описан в unit, который
> потом сидит в uses и в exe, и в dll?


Да. Именно так.


> Digitman ©   (07.06.05 13:54) [11]
>
> ниже - то же самое, только чуть "красивей"
>
> if ActiveChildForm.ClassParent = TBASEFORM then
>


Не работает такая конструкция. Пробовал.


 
evvcom ©   (2005-06-07 17:42) [14]

Где-то недавно Digitman уже писал такую примерно фразу:
"Класс в exe и класс в dll - это совершенно разные классы!" Да и я уже устал повторять это. Хоть эти классы и имеют идентичный код и один и тот же ClassName, но код класса присутствует и в exe, и в dll, и адреса разные!


 
Andrey Kononov ©   (2005-06-07 17:56) [15]

Понятно. Спасибо за участие.


 
Abessalom   (2005-06-07 23:35) [16]

Использовать формы из длл не очень-то рекомендуется, лучше использовать для этих целей run-time пакеты по многим причинам, в том числе по причине обязательной "одинаковости" реализации классов и значений глобальных переменных, таких как Application. Пачеко+Тексрейра указывают на то, что использовать классы, расположенные и реализованные в длл все-же можно при соблюдении четырех условий (одно из них то, что все методы объекта в длл д.б. виртуальными) - они приведены в главе 6 книги о Д6 Exporting Objects from DLLs - стр.287. Главу (172К) можно скачать здесь: webfile.ru/341948, пример к статье (13К) здесь - webfile.ru/341911


 
Ученик   (2005-06-07 23:57) [17]

На всякий случай :-)

function IsClass(A : TObject; const ClassName : string) : Boolean;
var
C : TClass;
begin
C := A.ClassType;
while (C <> nil) and (C.ClassName <> ClassName) do
  C := C.ClassParent;
Result := C <> nil
end;



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
11-1099458028
miek
2004-11-03 08:00
2005.06.29
проблема с комбобоксами


14-1117834399
Profi
2005-06-04 01:33
2005.06.29
СтоИт ли?


8-1109817542
dr_sollo
2005-03-03 05:39
2005.06.29
Как изменить размер картинки в DSPack


1-1118234991
Just3r~
2005-06-08 16:49
2005.06.29
Переход на новую версию


11-1086540713
Deimos
2004-06-06 20:51
2005.06.29
Linux