Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Доступ к методам произвольных форм. [D7, WinXP]


Балбес ©   (2007-08-09 14:07:00) 

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


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


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


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


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

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


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

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


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


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


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


Leonid Troyanovsky   (2007-08-09 15:08:00) [5]


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

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

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

--
Regards, LVT.


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


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


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


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

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


umbra   (2007-08-09 14:55:00) [8]


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

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


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

если

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


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


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


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

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

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


oxffff   (2007-08-09 14:43:00) [11]


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


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


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

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


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


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


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

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


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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо