Текущий архив: 2004.05.16;
Скачать: CL | DM;
Вниззадачка Найти похожие ветки
← →
Polevi © (2004-04-19 20:45) [40]>VMcL © (19.04.04 20:42) [38]
ты еще ZX Spectrum вспомни, там вместе с ОЗУ 65к было :-)
← →
VMcL © (2004-04-19 20:50) [41]>>Polevi © (19.04.04 20:43) [39]
Ну всё. Теперь у тебя суперпупергипермегафункция, куда там AvtoSheme :)
← →
Юрий Зотов © (2004-04-19 21:07) [42]Рекурсия с пожиранием 64 Кб стека на каждом уровне?
Из которых реально вряд ли и пара Кб потребуется?
Шалуны...
Stack Overflow на вас нет...
:о)
Ладно, вот задачка похитрее. Дана произвольная иерархия классов форм, отнаследованная от TForm. В каждом классе, возможно, есть произвольные обработчики событий произвольных компонентов. Задан класс TSomeForm, принадлежащий этой иерархии. Задача такая - сформировать список всех его обработчиков, включая и все унаследованные. Список нужно поместить в TStrings, по одному обработчику в строку, в виде:
Имя_класса.Имя_обработчика(Список_параметров)
причем список параметров должен быть синтаксически правильным. Пример:
TSomeFormAncestor.SomeMethod(Sender: TObject; Str: string)
Вот. Это похитрее будет, чем просто функции TypInfo вызывать. Пусть даже и рекурсивно.
:о)
← →
VMcL © (2004-04-19 21:08) [43]>>Юрий Зотов © (19.04.04 21:07) [42]
Да ну тебя. 8 вечера уже (Киев) :)
← →
Yanis © (2004-04-19 21:12) [44]<<<---Оффтопик--->>>
Этакий мастерский топик. Одни сливки собрались, ей богу :)
← →
VMcL © (2004-04-19 21:16) [45]>>Yanis © (19.04.04 21:12) [44]
Чтобы не портить "сливочность", твой пост и некоторые другие "лишние" удалят модераторы :D
← →
Yanis © (2004-04-19 21:18) [46]To [45]
Мне не привыкать :)
:)
:)
← →
Юрий Зотов © (2004-04-19 21:18) [47]> VMcL © (19.04.04 21:08) [43]
Нормально. Как раз до утра и выйдет.
:о)
← →
VMcL © (2004-04-19 21:24) [48]>>Юрий Зотов © (19.04.04 21:18) [47]
>Как раз до утра и выйдет.
Какого тысячелетия? :=D
← →
Юрий Зотов © (2004-04-19 21:28) [49]> VMcL © (19.04.04 21:24) [48]
Это уж как получится. Вообще-то, есть шанс стать Маклаудом.
:о)
← →
VMcL © (2004-04-19 21:29) [50]>>Юрий Зотов © (19.04.04 21:28) [49]
Уже стал. Меня так директор иногда называет.
← →
VideoLord © (2004-04-19 22:24) [51]Маклаудом... Хм ;-)
Ну если только нашим "бешенным", хотя мало кто может столько выпить.
← →
Игорь Шевченко © (2004-04-19 23:33) [52]Юрий Зотов © (19.04.04 21:07)
Задан класс или экземпляр класса ?
← →
Igorek © (2004-04-20 11:11) [53]
> Юрий Зотов © (19.04.04 21:07) [42]
> Ладно, вот задачка похитрее. Дана произвольная иерархия
> классов форм, отнаследованная от TForm. В каждом классе,
> возможно, есть произвольные обработчики событий произвольных
> компонентов. Задан класс TSomeForm, принадлежащий этой иерархии.
> Задача такая - сформировать список всех его обработчиков,
> включая и все унаследованные. Список нужно поместить в TStrings,
> по одному обработчику в строку, в виде:
> Имя_класса.Имя_обработчика(Список_параметров)
> причем список параметров должен быть синтаксически правильным.
> Пример:
> TSomeFormAncestor.SomeMethod(Sender: TObject; Str: string)
Если дан класс, то невозможно, по определению, определить обработчики, а только события. На этот раз вам уже точно 2 за вопрос.
← →
Игорь Шевченко © (2004-04-20 11:28) [54]
> Если дан класс, то невозможно, по определению, определить
> обработчики, а только события
Если можно, перевод этой фразы дай пожалуйста.
← →
Igorek © (2004-04-20 11:30) [55]
> Игорь Шевченко © (20.04.04 11:28) [54]
>
> > Если дан класс, то невозможно, по определению, определить
>
> > обработчики, а только события
>
>
> Если можно, перевод этой фразы дай пожалуйста.
На какой язык?
← →
Игорь Шевченко © (2004-04-20 11:34) [56]Igorek © (20.04.04 11:30)
На понятный
← →
Igorek © (2004-04-20 11:37) [57]
> Игорь Шевченко © (20.04.04 11:34) [56]
> Igorek © (20.04.04 11:30)
>
> На понятный
А что конкретно непонятно? Неужели все?
← →
Igorek © (2004-04-20 11:40) [58]Вообще чем дальше, тем больше меня поражают так называемые "мастера".
← →
pasha_golub © (2004-04-20 11:44) [59]Igorek © (20.04.04 11:40) [58]
Зря ты так. Зависть плохое чувство.
← →
Игорь Шевченко © (2004-04-20 11:46) [60]Igorek © (20.04.04 11:37)
Тебе трудно объяснить свою фразу ?
← →
Igorek © (2004-04-20 11:49) [61]Ок, поясняю попу-лярно.
"Если дан класс" - дано скажем TForm, TObject, TCoolGrid..., а не Form1: TForm...
"то невозможно, по определению, определить обработчики, а только события." - обработчики - это фактически указатели на функции. Эти указатели являются полями класса. А поля, как известно имеют значение только при наличии обьекта, а не класса (за исключением статических полей, которые не знаю есть ли в Паскале).
Таким образом, поскольку мы имеем класс, а не обьект, то мы не можем по-определению узнать значения полей (читай обработчики событий).
← →
Igorek © (2004-04-20 11:50) [62]
> pasha_golub © (20.04.04 11:44) [59]
> Igorek © (20.04.04 11:40) [58]
> Зря ты так. Зависть плохое чувство.
С чего ты взял, что я кому-то завидую?
← →
pasha_golub © (2004-04-20 11:52) [63]Igorek © (20.04.04 11:50) [62]
Я не сказал, что ты завидуешь :-)
Просто, констатировал факт, что "Зависть - плохое чувство". ;-)
← →
Igorek © (2004-04-20 11:53) [64]оффтоп, цитата:
"
Мама, мы все тяжело больны...
Мама, я знаю, мы все сошли с ума...
"
В.Цой
← →
Юрий Зотов © (2004-04-20 11:55) [65]> Игорь Шевченко © (19.04.04 23:33) [52]
Дана иерархия классов и входящий в нее класс. Допустим, иерархия сидит в каком-то BPL, или прямо в EXE - неважно.
Задачу можно упростить (суть останется та же, просто код будет менее громоздким за счет меньшего количества рутины) - будем строить список вообще любых published-методов. То есть - всех доступных данному классу, включая и унаследованные.
> Igorek © (20.04.04 11:11) [53]
Оценки будете выставлять, когда решите задачу (если вообще сможете). А до тех пор - LMD. Сначала разберитесь, чему принадлежит код, а чему - данные.
← →
Igorek © (2004-04-20 11:56) [66]
> pasha_golub © (20.04.04 11:52) [63]
> Igorek © (20.04.04 11:50) [62]
> Я не сказал, что ты завидуешь :-)
>
> Просто, констатировал факт, что "Зависть - плохое чувство".
> ;-)
Ты сказал "зря ты так". Что именно зря? И почему зависть плохое чувство? Я например очень сильно завидую уму и знаниям некоторых программистов с этого форума, и из форумов rsdn.ru. И некоторых из них я искренне уважаю.
← →
Igorek © (2004-04-20 11:57) [67]
> Юрий Зотов © (20.04.04 11:55) [65]
> Оценки будете выставлять, когда решите задачу (если вообще
> сможете). А до тех пор - LMD. Сначала разберитесь, чему
> принадлежит код, а чему - данные.
Да я собственно уже решил в [61]
← →
Игорь Шевченко © (2004-04-20 12:04) [68]Igorek © (20.04.04 11:49)
Именно это я и хотел услышать.
hint: привязка обработчиков к событиям формы и ее компонентов является общей для всех экземпляров класса формы и располагается в .dfm
← →
Igorek © (2004-04-20 12:12) [69]
> Игорь Шевченко © (20.04.04 12:04) [68]
> Igorek © (20.04.04 11:49)
> Именно это я и хотел услышать.
> hint: привязка обработчиков к событиям формы и ее компонентов
> является общей для всех экземпляров класса формы и располагается
> в .dfm
Что-то я нервный сегодня (из-за вчерашних событий). Еще "мастера" достают.
По сути:
In Delphi, almost all the code you write is executed, directly or indirectly, in response to events. An event is a special kind of property that represents a runtime occurrence, often a user action. The code that responds directly to an event—called an event handler—is an Object Pascal procedure. Все пошел работать.
---
"Кто имеет уши, тот услышит"
← →
Игорь Шевченко © (2004-04-20 12:24) [70]Юрий Зотов © (20.04.04 11:55)
Тогда уточним задачу:
Есть класс TForm1, у него есть published метод OnCreate. Обработчик его события чаще всего называется TForm1.FormCreate, если его имя не меняется руками.
В задаче требуется для произвольного класса, входящего в иерархию, вывести этот обработчик в виде
procedure TForm1.FormCreate(Sender: TObject);
или в виде
procedure TForm1.OnCreate(Sender: TObject);
?
← →
Юрий Зотов © (2004-04-20 12:54) [71]> Игорь Шевченко © (20.04.04 12:24) [70]
В виде
procedure TForm1.FormCreate(Sender: TObject);
То есть - реальное имя метода. Вообще, можно упростить задачу и просто построить список доступных классу методов (а то тут с понятиями "событие" и "обработчик" не у всех все в порядке - зато с самомнением нет проблем).
Рассмотрим пример. Пусть есть такая иерархия:
TForm1 = class(TForm)
procedure Proc1(...);
procedure Proc2(...);
end;
TForm2 = class(TForm1)
procedure Proc2(...);
procedure Proc3(...);
end;
TForm3 = class(TForm2)
procedure Proc3(...);
procedure Proc4(...);
end;
Для класса TForm3 должен получиться такой список:
TForm3.Proc3(...);
TForm3.Proc4(...);
TForm2.Proc2(...);
TForm1.Proc1(...);
← →
Игорь Шевченко © (2004-04-20 13:08) [72]Юрий Зотов © (20.04.04 12:54)
Тогда я наверное чего-то не понимаю. Список методов я могу достать, список свойств-методов с синтаксисом - тоже. Но привязать их одни к другим без dfm я не могу :)
← →
Igorek © (2004-04-20 13:59) [73]2 Юрий Зотов
Протрите значок мастера и бегом учить азы ObjectPascal.
← →
Игорь Шевченко © (2004-04-20 14:02) [74]Igorek © (20.04.04 12:12)
> The code that responds directly to an event—called an event
> handler—is an Object Pascal procedure
Точнее, метод объекта.
И эта...завязывай перепалку, плз
← →
Igorek © (2004-04-20 15:08) [75]
> Игорь Шевченко © (20.04.04 14:02) [74]
> И эта...завязывай перепалку, плз
Ок. Но истина тебя интересует? Ответь на вопрос "Задача, заданная в (Юрий Зотов © (19.04.04 21:07) [42]), имеет решение?" Да или нет?
← →
Игорь Шевченко © (2004-04-20 15:25) [76]Igorek © (20.04.04 15:08)
> Ответь на вопрос
Пока я вижу решение, связанное с разбором .dfm или с созданием экземпляра класса. Но хочу надеятся, что существует более элегантное. То есть, решение имеется в любом случае.
← →
MBo © (2004-04-20 15:28) [77]> [71]
приспособлено из старых извращений:
procedure ListMethods(Cls: TClass; Strings: TStrings);
var
PVMT: Pointer;
i, Num, len: Integer;
MName: string;
begin
if Cls = nil then Exit;
PVMT := Pointer(Cls);
Inc(PByte(PVMT), vmtMethodtable);
PVMT := Pointer(PVMT^);
if PVMT = nil then Exit;
Num := PWord(PVMT)^;
Strings.Add(Format("класс %s, методов: %d ", [Cls.ClassName, Num]));
Inc(PWord(PVMT));
for i := 0 to Num - 1 do begin
len := PWord(PVMT)^;
Inc(PByte(PVMT),7);
SetLength(MName, len - 7);
Move(PVMT^, MName[1], len - 7);
Strings.Add(Format("%d: %d %s", [i, len, MName]));
Inc(PByte(PVMT), len - 7);
end;
ListMethods(Cls.ClassParent, Strings);
end;
← →
Игорь Шевченко © (2004-04-20 15:31) [78]MBo © (20.04.04 15:28)
А параметры ? :))))
← →
MBo © (2004-04-20 15:33) [79]>Игорь Шевченко
>А параметры ? :))))
Это еще думать надо, а с обходом VMT уже когда-то копался ;))
← →
Vuk © (2004-04-20 15:38) [80]to Игорь Шевченко © (20.04.04 15:31) [78]:
>А параметры ? :))))
Если мне мой склероз не изменяет, нету их тама. :o)
Параметры методов, как они объявлены, можно вытащить только для RTTI-enabled интерфейсов начиная с D6.
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2004.05.16;
Скачать: CL | DM;
Память: 0.62 MB
Время: 0.079 c