Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.05 c
1-1117784595
аматор
2005-06-03 11:43
2005.06.29
открыть фай


1-1117903325
DimaK
2005-06-04 20:42
2005.06.29
Поиск определенного компонента на форме


1-1117638304
Yandexman
2005-06-01 19:05
2005.06.29
как тип String привести к PWideChar?


1-1118234930
alexa
2005-06-08 16:48
2005.06.29
Как из dll вызвать функцию основной программы?


14-1117365031
Statik_Work
2005-05-29 15:10
2005.06.29
Нравится ли Вам ваша собственная работа?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский