Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.08;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
3-24342
Sash2
2003-08-19 11:56
2003.09.08
Проблема с переносом полей.


1-24515
NewN
2003-08-27 09:38
2003.09.08
Excell, OleVariant


3-24365
kuchumovkv
2003-08-16 23:02
2003.09.08
Выборка по дате


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


14-24654
McLoop
2003-08-20 19:03
2003.09.08
Нужна помощь