Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Вниз

Наличие метода в классе   Найти похожие ветки 

 
FoxBox   (2003-08-25 15:37) [0]

Стоит проблема определения наличия метода в классе. Функция MethodAddress упорно возвращает NIL для любого названия метода. Может кто знает, как побороть Дельфу в этом? Заранее спасибо


 
MBo   (2003-08-25 15:38) [1]

MethodAddress только для Published методов.


 
clickmaker   (2003-08-25 15:39) [2]

Она ищет только published-методы


 
FoxBox   (2003-08-25 18:49) [3]

Ну хорошо, как определить наличие метода "SetFocus" в объекте "TMyForm", экземпляр "MyForm"? Может быть так более понятно будет... Ессно MyForm.MethodAddress("SetFocus") даст NIL (не описан в PUBLISHED). Но реально этот метод существует. В модуле TypInfo есть работа со свойствами через таблицу размещения объекта (RTTI), но вот как оттуда (из RTTI) вытащить методы (адреса вызова)?


 
vuk   (2003-08-25 19:03) [4]

MethodAddress именно из RTTI информацию и берет.


 
Юрий Федоров   (2003-08-25 19:16) [5]

конкретно наличие метода SetFocus можно определить по тому, является ли объект потомком TWinControl


 
default   (2003-08-25 22:31) [6]

читай Пачеку там есть про RTTI + сам модуль typinfo.pas смотри если поймёшь чего...в принципе там всё просто генерится инфа
в RAM-е для - всё остальное лишь удобный доступ к этой общирной инфе не более хотя в этом модуле вообще много чего интересного...


 
___Nikolay   (2003-08-26 06:56) [7]

Мож эт поможет:

function HasProperty(Obj: TObject; Prop: string) : PPropInfo;
begin
Result := GetPropInfo(Obj.ClassInfo, Prop);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
p : pointer;
begin
p := HasProperty(Button1, "Color");
if p <> nil then
SetOrdProp(Button1, p, clRed)
else
ShowMessage("Button has no color property");
p := HasProperty(Label1, "Color");
if p <> nil then
SetOrdProp(Label1, p, clRed)
else
ShowMessage("Label has no color property");
p := HasProperty(Label1.Font, "Color");
if p <> nil then
SetOrdProp(Label1.Font.Color, p, clBlue)
else
ShowMessage("Label.Font has no color property");
end;


 
___Nikolay   (2003-08-26 06:56) [8]

Иль так:

TypInfo.GetPropInfo (My_Component.ClassInfo, "Hint") <> nil


 
FoxBox   (2003-08-26 10:11) [9]


> ___Nikolay

Если скормить свойство, например "Enabled" или тот же "Hint" как у тебя, ессно getpropinfo выдаст адрес, а теперь то же самое, но для CanFocus, SetFocus, Close, Show, Hide и т.д. нужно. Почувствовал разницу? Наверняка есть какие-то реализации... Может кто сталкивался...


 
Юрий Федоров   (2003-08-26 10:16) [10]

>>FoxBox (26.08.03 10:11) [9]
Эти методы не published, через RTTI информацию о них не получить, потому что ее там нет.
Может поделишься, зачем это нужно?


 
FoxBox   (2003-08-26 10:49) [11]

Это своего рода страховка. Есть некие внешние для меня модули. Если эти модули умеют работать с моим через стандартный (для меня) интерфейс, работаем. Если нет, я даже не вызываю их. Ессно, внешние модули нужно создать (создается, используя механизм RegisterClass). Далее стоит спросить экземпляр, знает ли он такой-то интерфейс взаимодействия. Если ДА, мы - самые лучшие друзья: мой модуль знает, что нужно получить, внешний знает что нужно передать. В противном случае обидеться. И без всяких try..except. Вот такая постановка...


 
MBo   (2003-08-26 10:51) [12]

хм...
Звучит как описание COM-интерфейсной модели


 
FoxBox   (2003-08-26 11:05) [13]

Ну, можно пойти через COM, но зачем, если все дельфийское, правда все хранится в bpl-ках (соответственно одна и та же bpl-ка может содержать различные версии одной и той же формы/объекта в зависимости от поставки). А список вызываемых модулей динамический. Проще спросить у модуля наличие у него того или иного метода. Конечно, можно пойти через property, а всю обработку повесить на методы read и Write данного свойства. Но в этом случае я зажимаюсь только одним параметром. Хотя меня это спасет сейчас, но жизнь многограннее... Лучше сразу делать все путем...


 
Юрий Федоров   (2003-08-26 11:17) [14]

можно пойти по пути интерфейсов (без COM)
просто QueryInterface, и будет полная радость и взаимопонимание


 
Skier   (2003-08-26 11:19) [15]

А мне почему-то plug-in мерещится.


 
www   (2003-08-26 12:55) [16]

А если попробывать примерно так:
var
OfObject:boolean;
obj :TObject;
begin
OfObject:=true;
try
obj:=TMethod("SomeMethod").Data;
except
OfObject:=false;
end;
end;


 
FoxBox   (2003-08-26 13:04) [17]


> www

Да, это сработает, но зачем использовать вандальный способ? Понимаю, что исключение - дело хорошее, но некрасивое. Не очень хорошо осознанно нарываться на исключения.


 
www   (2003-08-26 13:07) [18]

да нет, не сработает, по-моему. Если метода нет, то прога и не компильнется ;-)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
3-24343
Groove_SQL
2003-08-18 08:45
2003.09.08
ORDER BY вычисляемое поле


14-24616
Jao
2003-08-17 17:12
2003.09.08
Нет бардаку на винте!!! Оставь свое мнение.


1-24535
VISA
2003-08-26 13:00
2003.09.08
Запрет максимизации окна...


4-24740
Danchik
2003-07-08 13:59
2003.09.08
работа с Dll


1-24437
grusty
2003-08-25 17:56
2003.09.08
Вставка текста в определенное место RichEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский