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

Вниз

задачка   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.053 c
1-1083213421
M@X
2004-04-29 08:37
2004.05.16
Перевод с СИ


3-1082633043
killer
2004-04-22 15:24
2004.05.16
Про таблицы


8-1077375996
Cerber
2004-02-21 18:06
2004.05.16
Прозрачность.


11-1069465382
azsd
2003-11-22 04:43
2004.05.16
ShowModal Must Close Twice?


1-1083163718
Svetka*
2004-04-28 18:48
2004.05.16
Лабораторная.... помогите девушке!





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