Главная страница
    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.008 c
4-24756
miguel1
2003-07-09 13:24
2003.09.08
Ошибка при вызове функции WriteFile?!


14-24688
Ig
2003-08-19 11:00
2003.09.08
Как скрыть файл


1-24415
plotn
2003-08-26 10:22
2003.09.08
Хочется странного модального окна


1-24514
snake1977
2003-08-27 10:23
2003.09.08
свой компонент


3-24366
Bes
2003-08-16 16:35
2003.09.08
Delphi и Access





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