Форум: "Основная";
Текущий архив: 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.013 c