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

Вниз

Доступ к методам произвольных форм.   Найти похожие ветки 

 
Балбес   (2007-08-09 14:07) [0]

Ситуация такая. Есть главная форма и несколько других форм, у которых есть метод с общим названием. Нужно из главной формы основываясь на значении некоторой переменной, которая хранит название класса другой формы, обратитьcя к методу этой формы (желательно без использования сообщений). Из ООП имею очень и очень базовые знания. Пытался сделать в главном модуле класс TClientForm на основе TForm с виртуальным описанием общего метода но компилятор даже не дает это скомпилировать :( Наверняка есть простой способ сделать вышеизложенное гораздо проще, подскажите пожалуйста.


 
Сергей М. ©   (2007-08-09 14:09) [1]


> компилятор даже не дает это скомпилировать


Что, так прямо и говорит - "не дам" ?)


 
Сергей М. ©   (2007-08-09 14:11) [2]


> есть простой способ сделать вышеизложенное гораздо проще


Проще - вряд ли, но вот изящней и универсальней можно.

Способ это подразумевает использование интерфейсов, но вряд ли ты это сейчас потянешь, так что разберись сначала с виртуальными методами - оно в любом случае на пользу будет.


 
Балбес   (2007-08-09 14:38) [3]

С виртуально-абстрактными методами разобрался. Создал класс наследник TForm с виртуальным методом в отдельном юните, заменил классы форм (кроме главной) на мой класс, в формах описал нужный метод. Но дальше - все, стоп машина, мыслей нет (где же мой кофе...). Как, собсно, руководствуясь лишь названием класса нужной формы (которая потомок моего класса) обратиться к ее методу?


 
oxffff ©   (2007-08-09 14:43) [4]


> с виртуальным методом в отдельном юните


Как ты это сделал?


 
Сергей М. ©   (2007-08-09 14:47) [5]


> Как, собсно, руководствуясь лишь названием класса нужной
> формы


За каким лешим тебе знать название этого класса, если он у тебя все равно наследник общего базового класса, от которого унаследованы все прочие классы форм, и у которого есть виртуальный метод ?

Смысл и логику использования/работы виртуальных методов ты вообще понимаешь ли ?

Поясни, как ты это понимаешь .. Здесь ведь и собака зарыта, пожалуй) ..


 
Сергей М. ©   (2007-08-09 14:53) [6]

если

TSomeBaseForm = class(TForm)
..
 procedure CommonMethod; virtual; abstract;
..
end;

TSomeDescendant1OfBaseForm = class(TSomeBaseForm)
..
 procedure CommonMethod; override;
..
end;

TSomeDescendant2OfBaseForm = class(TSomeBaseForm)
..
 procedure CommonMethod; override;
..
end;

то вызов

SomeUnknownBaseFormInstance.CommonMethod

приведет к вызову

TSomeDescendant1OfBaseForm.CommonMethod

если  SomeUnknownBaseFormInstance есть экз-р TSomeDescendant1OfBaseForm

и к вызову

TSomeDescendant2OfBaseForm.CommonMethod

если  SomeUnknownBaseFormInstance есть экз-р TSomeDescendant2OfBaseForm


 
umbra ©   (2007-08-09 14:55) [7]


> Как, собсно, руководствуясь лишь названием класса нужной
> формы

не названием надо руководствоваться, а ссылкой на класс


 
Балбес   (2007-08-09 14:58) [8]

Кхм, попробуем начать сначала и немножко проще :) Помоему я правда не туда копаю. Вообще не туда...
Есть главная форма и несколько других MyForm1, MyForm2, MyForm3... У них у всех есть общая процедура MyProcedure(). Есть так же переменная с названием нужной формы f. Допустим f имеет значение "MyForm2" поэтому мне нужно вызвать MyProcedure() второй формы. Но не буду же я сидеть и If-ами перебирать все возможные варианты значения f что бы явно обратиться через MyForm2.MyProcedure().
С компонентами этот фокус легко проделывается с помощью FindComponent, и я наивно верю, что в дельфи есть подобное для форм. Как-то же можно в run-time обратиться к списку форм?


 
Сергей М. ©   (2007-08-09 15:07) [9]


> С компонентами этот фокус легко проделывается с помощью
> FindComponent


Форма - это тоже компонент, ибо она есть непрямой наследник класса TComponent.
Это для тебя откровение ?


 
Leonid Troyanovsky ©   (2007-08-09 15:08) [10]


> Балбес   (09.08.07 14:58) [8]

> С компонентами этот фокус легко проделывается с помощью
> FindComponent, и я наивно верю, что в дельфи есть подобное
> для форм. Как-то же можно в run-time обратиться к списку
> форм?

Если у всех форм owner = Application, то Application.FindComponent
А, вообще - Screen.Forms.

--
Regards, LVT.


 
Балбес   (2007-08-09 15:09) [11]

VCL выше TForm как и для любого чайника для меня темный лес :) Попробую, однако помоему от этого программа вываливалась...


 
Сергей М. ©   (2007-08-09 15:09) [12]


> Как-то же можно в run-time обратиться к списку форм?


Да оч просто - список Screen.Forms содержит ссылки на все существующие в приложении объекты-формы (на момент обращения к списку) вне зависимости от того, кто является их владельцем.


 
Балбес   (2007-08-09 15:10) [13]

Пока писал [11] пришло новое :) Спасибо вам, буду пробовать.


 
Сергей М. ©   (2007-08-09 15:11) [14]


> VCL выше TForm как и для любого чайника для меня темный
> лес


TComponent в иерархии наследования стоит ниже TForm, так что отмазка не принимается)



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

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

Наверх




Память: 0.5 MB
Время: 0.023 c
15-1186482650
sql_
2007-08-07 14:30
2007.09.02
function


2-1186653976
kukuikar
2007-08-09 14:06
2007.09.02
Как спрятать значок из SystemTray чужого приложения


15-1185889229
Alkid
2007-07-31 17:40
2007.09.02
Фриварный антивирус


3-1178351086
RomanH
2007-05-05 11:44
2007.09.02
Случайный disconect c СУБД


2-1186565147
russo@78
2007-08-08 13:25
2007.09.02
поблемы с подключение к Word