![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к методам произвольных форм. [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]
> компилятор даже не дает это скомпилировать
Что, так прямо и говорит - "не дам" ?)