Главная страница
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.029 c
8-1164867476
Павел123456
2006-11-30 09:17
2007.09.02
Как "склеить" Bitmap-ы в видео?


15-1186465107
@!!ex
2007-08-07 09:38
2007.09.02
telnet цвет текста.


3-1178662208
Мурзилка
2007-05-09 02:10
2007.09.02
отображение валюты в QuantumGrid


15-1186039685
nosfik
2007-08-02 11:28
2007.09.02
Пути к библиотекам


2-1186397737
Dmitry_177
2007-08-06 14:55
2007.09.02
какие таблицы лучше использовать для локальной БД?