Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизДоступ к методам произвольных форм. Найти похожие ветки
← →
Балбес (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.047 c