Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.049 c
15-1186059055
Dib@zol
2007-08-02 16:50
2007.09.02
Fraps must die


2-1186662201
alex_tonk
2007-08-09 16:23
2007.09.02
Сохранить как DBF файл


15-1186130415
исследователь
2007-08-03 12:40
2007.09.02
Непонятная строчка кода


4-1173891446
VirEx
2007-03-14 19:57
2007.09.02
передача данных/строк из Dll приложению


2-1186495479
Pal
2007-08-07 18:04
2007.09.02
глюк с Oracle





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский