Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.64 MB
Время: 0.03 c
8-1078273036
Jaine
2004-03-03 03:17
2004.05.16
Смена иконки (Glyph) на кнопке типа BitBtn or Speedbutton


3-1082484394
I.Ru.Ru
2004-04-20 22:06
2004.05.16
Связывание одной дочерней таблицы с двумя родительскими


1-1083004080
Nvart
2004-04-26 22:28
2004.05.16
Ошибка при чтении потока


8-1076921082
AlexV
2004-02-16 11:44
2004.05.16
Как получить размер изобр jpg,bmp файлов,не загружая их в память?


1-1083548734
Marat_D
2004-05-03 05:45
2004.05.16
Проблема с дельфой!!!