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

Вниз

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

 
Игорь Шевченко ©   (2004-04-21 18:37) [120]

Игорь Шевченко ©   (21.04.04 18:34)

Следует читать: При разборе VMT не имеет значения, есть ли экземпляры класса или нет.


 
Igorek ©   (2004-04-21 18:58) [121]

Еще раз давайте разберемся с понятиями. На самом деле тут легко запутаться. Итак:
1) обработчик события - это процедура Паскаля, которая вызывается при наступлении события;
2) событие наступает только тогда, когда есть обьект, и соотв. код обьекта вызывает обработчик, который записан в поле обьекта;
3) с этого вытекает, что процедура становится обработчиком только тогда, когда ссылка на нее содержится в поле обьекта; до этого момента (допустим обьекта еще нет) процедура (если подходит по сигнатуре) может выступать в роли обработчика события конкретного обьекта
4) обработчиком событий данного класса могут выступать процедуры любого класса, подходящие по сигнатуре;

Теперь ответы:

> McSimm ©   (21.04.04 18:34) [118]
>
> > Просто присвоить их событиям можно только динамически.
>
> классу ?

Исходя из вышесказанного мы присваиваем метод какого-то класса событию какого-то обьекта;


> Игорь Шевченко ©   (21.04.04 18:34) [119]
> В момент разбора VMT нету экземпляров класса, следовательно
> о динамическом присвоении речи быть не может :)

Какая разница, как мы реализуем задачу? Повторю, что задача была "вывести все обработчики класса". Надо было сказать "вывести все методы класса А, которые есть потенциальные обработчики событий обьектов класса В". А может быть равно В. Но даже в такой постановке задача неразрешима, поскольку возможно в классе А есть приватные методы, которые есть потенциальные обработчики событий обьектов класса В (могут стать таковыми в результате динамического присваивания).


 
Юрий Зотов ©   (2004-04-21 19:31) [122]

> Igorek ©   (21.04.04 17:45) [115, 117, 121]

> Однако я смотрю этот вопрос для Вас стал принципиальным.

Почему стал? Он таким и был. Только Вы тут ни при чем - снизьте самооценку, Джо. Дело просто-напросто в том, что, раз уж я в [42] предложил задачу (да еще и с "подковыркой" - вот, мол, попробуйте), то считаю, что должен был дать и свой вариант решения (не сразу, естественно). Оно и раньше всегда было так же, ничего нового.

> Не умаляя достоинств приведенного кода

Браво. Тронут. Плачу. Вы не поверите, насколько для были важна именно ВАША оценка. Сбылось...
"Слеза... стекает... по щеке... на клаву..."
Хотите еще одну задачку - персонально для Вас? В коде, если рассматривать его не как просто пример, а как рабочий код, есть довольно серьезный недостаток. Он был сделан специально, и не просто так, а была на то причина. Надо найти этот недостаток и указать его причину. В идеале - доработать одну из процедур, устранив в ней тот самый недостаток (кстати, объем кода после этого даже уменьшится).

> позволю себе не согласиться, что это решение задачи в
> постановке [42]. Там ничего не говорилось про RTTI.

Там про МЕТОД решения не было сказано вообще НИ-ЧЕ-ГО. Что и естественно. Потому что метод решения задачи оставляется на усмотрение разработчика. Хотите - RTTI юзайте, хотите - выкапывайте Debug Info, хотите - еще как хотите. Дело хозяйское.

> Соотв. был и мой пост [53].

Не будем о грустном.

> Повторю касательно постановки 42. В роли обработчиков могут
> выступать и не публикуемые методы.

Высоко ценю Ваши знания. Однако же, в [42] речь шла о классах, и ТОЛЬКО о классах - а теперь перечитайте [116] и, как знаток основ Паскаля, устыдитесь за [117].

Таким образом, постановку [42] Вы просто элементарно не поняли. Готов согласиться, что формулировка действительно была слишком скупой, но кто хотел уточнить - тот задал вопросы. И в своем посте [53], как и в последующих, Вам ничто не мешало сделать то же самое, а не устраивать очередную склоку.

Вообще, Игорек, Вы уж извините, но если моя персона так патологически раздражающе на Вас действует - то задумайтесь, наконец, почему это так? Кстати, в затеяной Вами же откровенно склочной ветке Вам об этом сказали практически открытым текстом (причем даже и не один человек) - так что есть что перечитать и о чем подумать.

Что касается [121], то вот Вам наводящая задачка. Пусть мы имеем вот такой DFM:
object Form1: TForm1
 OnClose = FormClose
end

и еще не создано ни одного экземпляра TForm1. Теперь ответьте:
1. Является ли этот DFM принадлежностью класса TForm1?
2. Метод FormClose уже существует, или еще нет?
3. Если существует, то чему (кому) он принадлежит?
4. В какой секции он объявлен?
5. Может ли он быть объявлен в другой секции?
6. Назначает ли этот DFM событию OnClose обработчик FormClose?
7. Можно ли назначить событию OnClose другой обработчик, не создавая при этом экземпляра TForm1?


 
Юрий Зотов ©   (2004-04-21 19:58) [123]

> Pasha Golub & other

Помнится, в ветке про тесты по поводу вопроса 1.1 было написано примерно следующее - вопрос чисто теоретический, потому что в реальных разработках подобный код встретиться не может. На что я тогда ответил что-то вроде того, что вопрос этот теоретический до тех пор, пока он не встретится на практике.

Так вот - выше MBo, Игорем и мною приведены вполне практические примеры использования такого кода (скажем, процедура ExtractShortString). Могу еще добавить, что подобныйй код реально использовался при написании одного редактора свойства (собственно, откуда и родилась сама эта задачка - она ведь не только из головы была придумана). И подобный код можно встретить и в VCL, и в других пакетах - например, посмотрите код в "Кладовке", о котором уже упоминалось.

И дело тут вовсе не в том, что стиль кривой. Просто есть вещи, которые по-другому либо вообще не напишешь, либо резко снизится скорость.


 
Igorek ©   (2004-04-22 10:17) [124]


> Хотите еще одну задачку - персонально для Вас? ...

Нет, не хочу. Неинтересная задача. Куда интереснее такая: "сформулировать корректное условие задачи, для которой приведенный код будет решением и в нем не будет ничего лишнего"

> Готов согласиться, что формулировка действительно была слишком
> скупой

Имхо она была некорректной как минимум. А при корректировке к наиболее близкой корректной - неразрешимой.

> Что касается [121], то вот Вам наводящая задачка. Пусть
> мы имеем вот такой DFM: ...

Отвечаю: задача поставлена некорректно и не полно. Кроме того некоторые пункты сами по себе не имеют смысла.


 
Игорь Шевченко ©   (2004-04-22 10:48) [125]


> Отвечаю: задача поставлена некорректно и не полно. Кроме
> того некоторые пункты сами по себе не имеют смысла.


В чем именно некорректность и неполнота ?


 
Igorek ©   (2004-04-22 10:52) [126]

Прикольный пример:
1) создаем новое приложение в Дельфи
2) создаем обработчик главной формы на событие OnShow такой:
procedure TForm1.FormShow(Sender: TObject);
begin
 with TForm1.CreateNew(Application) do
   Show;
end;
3) запускаем...


 
Igorek ©   (2004-04-22 11:04) [127]


>
> Игорь Шевченко ©   (22.04.04 10:48) [125]
> В чем именно некорректность и неполнота ?

Неполнота:
- не приведен код формы, имя модуля, имя файла dfm, проекта
Короче в идеале надо или иметь все исходники или пошаговую инструкцию воспроизведения условия.
- не указан момент, касательно которого вопросы (designtime, точка останова)
Следовательно некорректности:
> 1. Является ли этот DFM принадлежностью класса TForm1?
Какого класса TForm1?
> 2. Метод FormClose уже существует, или еще нет?
Вообще бред.
> 3. Если существует, то чему (кому) он принадлежит?
Бред.
> 4. В какой секции он объявлен?
> 5. Может ли он быть объявлен в другой секции?
Хрен его знает. О каких секциях вообще речь?
> 6. Назначает ли этот DFM событию OnClose обработчик FormClose?
DFM ничего не назначает. Назначает VCL.
> 7. Можно ли назначить событию OnClose другой обработчик,
> не создавая при этом экземпляра TForm1?
Бред.

Не сочтите за грубость - это просто чесно мои мысли.


 
Игорь Шевченко ©   (2004-04-22 11:16) [128]

Igorek ©   (22.04.04 11:04)

Sapienti sat


 
Юрий Зотов ©   (2004-04-22 11:40) [129]

> Igorek © (22.04.04 11:04) [127]

И Вы еще беретесь о чем-то там спорить?

> Игорь Шевченко, McSimm & other

По-моему, бесполезно. Ламер - он как раз потому и ламер, что считает себя знатоком. Воинствующий ламер - хуже втройне. А воинствующий ламер, не сомневающийся в собственных выводах, да еще и с ярко выраженным талантом флудера... страшнеее, наверное, может быть только пулемет.

Поэтому предлагаю оставить этого Анику-воина в покое. Все равно он даже и не пытается понять того, что ему тут хором пытаются объяснить. Да и не только тут.

P.S.
"Не сочтите за грубость - это просто чесно мои мысли".
(с) Igorek © (22.04.04 11:04) [127]


 
Igorek ©   (2004-04-22 11:52) [130]


> Игорь Шевченко ©   (22.04.04 11:16) [128]
> Sapienti sat

Здесь вроде надо только русском.

> Юрий Зотов ©   (22.04.04 11:40) [129]

Мне глубоко пофиг, что говорит толпа, когда нет аргументов. Исключение составляют люди, которых я уважаю. К любому мнению таковых я сразу прислушаюсь даже без аргументов. На этом форуме таковыми для себя считаю: MBo и Е-мое Имя.


 
Юрий Зотов ©   (2004-04-22 12:04) [131]

> Igorek ©   (22.04.04 11:52) [130]

> Мне глубоко пофиг, что говорит толпа, когда нет аргументов.

А также когда они есть, но некто в упор не желает их видеть. О чем и было сказано выше.

> Исключение составляют люди, которых я уважаю. К любому мнению
> таковых я сразу прислушаюсь даже без аргументов. На этом
> форуме таковыми для себя считаю: MBo и Е-мое Имя.

Это заметно. Уже хотя бы по тому, что у одного Вы заимствовали код, а у другого - ведра.

P.S.
"И это все о нем"
(с) То ли книга, то ли фильм, то ли все вместе.


 
Игорь Шевченко ©   (2004-04-22 12:23) [132]

Igorek ©   (22.04.04 11:52)


> Здесь вроде надо только русском.


Хорошо, я переведу: умному достаточно.

---
LMD


 
Cobalt ©   (2004-04-23 12:42) [133]

Надеюсь, я всё правильно понял:

object Form1: TForm1
OnClose = FormClose
end
и еще не создано ни одного экземпляра TForm1. Теперь ответьте:
1. Является ли этот DFM принадлежностью класса TForm1?
-  Да, судя по тому, что при создании формы читается её описание из ресурсов (TCustomForm.Create)
2. Метод FormClose уже существует, или еще нет?
-  Да, он уже описан в VMT (сама процедура)
3. Если существует, то чему (кому) он принадлежит?
-  Он является методом формы (? насколько я знаю)
4. В какой секции он объявлен?
-  В Published.
5. Может ли он быть объявлен в другой секции?
-  При объявлении его в private или public при создании формы  EReadError - "Invalid property value"
6. Назначает ли этот DFM событию OnClose обработчик FormClose?
-   При создании.
7. Можно ли назначить событию OnClose другой обработчик, не создавая при этом экземпляра TForm1?
-  Нет.


 
IGOREK ©   (2004-04-23 18:53) [134]

Вот мои ответы с домысленным условием:
> 1. Является ли этот DFM принадлежностью класса TForm1?
В любом случае не является - ВНИМАТЕЛЬНО см. [126]
> 2. Метод FormClose уже существует, или еще нет?
> -  Да, он уже описан в VMT (сама процедура)
А в виде текста в designtime метод не существует?
> 3. Если существует, то чему (кому) он принадлежит?
Во первых в моем понятии метод не может принадлежать классу, он может только быть его членом. Вот про обьект я могу сказать, что он пренадлежит классу, ибо есть елементом множества, которое класс описывает
> 4. В какой секции он объявлен?
> -  В Published.
При условии, что код компилируется.
> 5. Может ли он быть объявлен в другой секции?
> -  При объявлении его в private или public при создании
> формы  EReadError - "Invalid property value"
Может, тогда код не будет выполняться.
> 6. Назначает ли этот DFM событию OnClose обработчик FormClose?
> -   При создании.
В принципе можно и так выразится, хотя имхо неточно.
> 7. Можно ли назначить событию OnClose другой обработчик,
> не создавая при этом экземпляра TForm1?
Не только нельзя другой, нельзя любой. Нету обьекта - нету обработчика. Есть только методы, которые могут выступать в такой роли. Тоже в принципе буквоедство, но как видим иногда небесполезное.


 
Cobalt ©   (2004-04-24 01:17) [135]

2 IGOREK ©   (23.04.04 18:53) [134]
Ну что, обсудим? Предлагаю конструктивный диалог:

>> 1. Является ли этот DFM принадлежностью класса TForm1?
>В любом случае не является - ВНИМАТЕЛЬНО см. [126]
Тогда как ты прокомментируешь тот факт, что форма при создании (см. TCustomForm.Create) читает себя из ресурсов?
имеется в виду именно Тип класса TForm1 (будем считать, что ресурс с описанием класса в ехе-ке менять не будем).

>> 2. Метод FormClose уже существует, или еще нет?
>> -  Да, он уже описан в VMT (сама процедура)
>А в виде текста в designtime метод не существует?
Хм, не понял :(


 
nikkie ©   (2004-04-24 03:03) [136]

дайте я попробую, что ли...
1. Является ли этот DFM принадлежностью класса TForm1?
имхо - нет. DFM хранится в ресурсах и может быть легко изменена без изменения кода класса.
2. Метод FormClose уже существует, или еще нет?
да.
3. Если существует, то чему (кому) он принадлежит?
классу TForm1.
4. В какой секции он объявлен?
ну там же, где объявлены сами компоненты, в начале класса без ключевого слова private/protected/public/published. поскольку к компонентам формы можно обращаться из вне TForm1 без проблем, значит, это либо public, либо published. хелп данную ситуацию комментирует так:
Members at the beginning of a class declaration that don’t have a specified visibility are by default published, provided the class is compiled in the {$M+} state or is derived from a class compiled in the {$M+} state; otherwise, such members are public.
кроме того, в другом месте написано
A class cannot have published members unless it is compiled in the {$M+} state or descends from a class compiled in the {$M+} state. Most classes with published members derive from TPersistent, which is compiled in the {$M+} state, so it is seldom necessary to use the $M directive.
значит, published. эксперимент показывает, что попытка объявить их как public приводит в ран-тайме к ошибке создания формы. а с published все в порядке. кроме того, если чуть еще подумать и посмотреть, как хранятся ссылки на обработчики событий в откомпилированном DFM, то видно, что они хранятся как имена. значит при загрузке формы используется RTTI и это должна быть published секция.
5. Может ли он быть объявлен в другой секции?
нет.
6. Назначает ли этот DFM событию OnClose обработчик FormClose?
ну не то, чтобы назначает. скорее описывает, что назначить. реальное назначение происходит при загрузке формы, где-то внутрях TReader, наверное.
7. Можно ли назначить событию OnClose другой обработчик, не создавая при этом экземпляра TForm1?
ну если отбросить непосредственное исправление ресурса, то вероятно можно (в том же смысле, в каком DFM "назначает") - для этого надо вклиниться в процесс создания формы, переписав TReader, наверное.


 
Sha ©   (2004-04-24 12:49) [137]

Хорошая получилась ветка.
Могла бы быть еще лучше, если бы, субъекты, препарирующие Delphi, обсуждали только ее внутренности.
Да и число участников было бы больше, если бы градус обсуждения был пониже.


 
Игорь Шевченко ©   (2004-04-24 18:33) [138]


> 1. Является ли этот DFM принадлежностью класса TForm1?
> имхо - нет. DFM хранится в ресурсах и может быть легко изменена
> без изменения кода класса.


Является. Имя ресурса совпадает с именем класса формы. Если изменить имя ресурса извне форма будет являться принадлежностью другого класса.


 
Sha ©   (2004-04-24 19:18) [139]

Игорь Шевченко ©   (24.04.04 18:33) [138]
> 1. Является ли этот DFM принадлежностью класса TForm1?
> имхо - нет. DFM хранится в ресурсах и может быть легко изменена
> без изменения кода класса.

Не является. Что мешает зачитать ресурс с именем класса формы из потока, созданного в runtime?


 
Юрий Зотов ©   (2004-04-24 19:34) [140]

> Sha ©   (24.04.04 19:18) [139]

Ничто не мешает. Но и ничего не меняет. Ресурс класса формы так и останется ресурсом класса формы. Хоть вообще его не читай, хоть читай как угодно и для чего угодно.


 
Игорь Шевченко ©   (2004-04-24 19:50) [141]

Sha ©   (24.04.04 19:18)


> Не является. Что мешает зачитать ресурс с именем класса
> формы из потока, созданного в runtime?


Глупый вопрос: а зачем ?


 
Sha ©   (2004-04-24 20:11) [142]

Еще можно спросить: "является ли компонент Button1 принадлежностью класса TForm1?". Ясное дело, нет. Компонент с таким именем может быть в любом DFM и даже в том, которого еще нет в design time и который будет создан в run time.
Таким образом, классу TForm1 принадлежат все существующие и будущие DFM, содержащие ресурс с таким именем, а также все созданные в run time потоки, содержащие ресурс с таким именем.
А это значит, что этому классу никакой конкретный DFM не принадлежит, а только может принадлежать, после того, как будет прочитан TReader"ом.


 
Игорь Шевченко ©   (2004-04-24 20:28) [143]


> классу TForm1 принадлежат все существующие и будущие DFM,
> содержащие ресурс с таким именем


Тут такой момент - ресурс может быть только один :)


 
Юрий Зотов ©   (2004-04-24 20:28) [144]

> Sha © (24.04.04 20:11) [142]

А еще можно говорить, что файл kernel32.dll библиотекой ядра не является, а только МОЖЕТ ею являться.

Но стоит ли?


 
Sha ©   (2004-04-24 20:41) [145]

> Игорь Шевченко ©   (24.04.04 20:28) [143]
> Тут такой момент - ресурс может быть только один :)

Ничто не мешает хранить ресурсы в отдельных файлах или создавать динамически.

> Юрий Зотов ©   (24.04.04 20:28) [144]
> А еще можно говорить, что файл kernel32.dll библиотекой ядра не является, а только МОЖЕТ ею являться.
> Но стоит ли?

Спор чисто терминологический: что значит "принадлежит"?
Если это означает совпадение имен и возможность загрузки ресурса, то принадлежит.
Если же это означает собственно загрузку ресурса, то не принадлежит.
Мне больше симпатична вторая точка зрения, потому что окончательный вид формы в run time определяется только после загрузки ресурса. До этого формы просто не существует.

В общем, стоит сначала определиться с терминами. Каждая из этих точек зрения может оказаться верной при соответствующей трактовке терминов.


 
Юрий Зотов ©   (2004-04-24 20:51) [146]

> Sha © (24.04.04 20:11) [142]

Наверное, нужно пояснить, что я имел в виду в [144]. Конечно, можно понасоздавать 100 потоков, а в них программно нагенерить 100 одноименных ресурсов. Можно сделать еще вообще что угодно, хоть ОС переписать.

Однако же, когда задача ставится, например, так "Найти сумму углов треугольника", то мы понимаем, что речь идет о геометрии Эвклида, а не Лобачевского. Причем на плоскости, а не на сфере или еще на чем-то.

И подобного рода дефолты имеют место всегда. То есть - если явно не оговорено ничего другого, то подразумевается некий стандарт. В нашем случае таким стандартом является единственный ресурс с именем TForm1, находящийся в теле EXE и из него же загружаемый.

Помните анекдот, как программист ходил в магазин? Жена сказала ему: "Купи батон хлеба и если есть яйца, то десяток". Далее произошел такой диалог с продавцом:
- У Вас яйца есть?
- Есть.
- Тогда десяток батонов хлеба.

В словах жены подразумевался тот самый дефолт, но программист поступил, как машина, а не как человек.

Мы будем поступать так же? Будем придираться к словам друг друга, или все же будем понимать, что если что-то не оговорено явно, то имеется и виду стандарт?

Вот что имелось в виду в [144].


 
Sha ©   (2004-04-24 20:57) [147]

Я не придирался, а просто решал задачу в общей постановке.
Теперь понятно, что имелось ввиду :)


 
IGOREK ©   (2004-04-26 13:00) [148]

> >> 1. Является ли этот DFM принадлежностью класса TForm1?
> >В любом случае не является - ВНИМАТЕЛЬНО см. [126]
> Тогда как ты прокомментируешь тот факт, что форма при создании
> (см. TCustomForm.Create) читает себя из ресурсов?
Да не знаю что и сказать. Читает себе и все.
А как Вы прокомментируете [126]?

> >> 2. Метод FormClose уже существует, или еще нет?
> >> -  Да, он уже описан в VMT (сама процедура)
> >А в виде текста в designtime метод не существует?
> Хм, не понял :(
Ну вот я решаю задачу по программированию. Надо написать метод. И вот я уже знаю, как решить задачу - весь метод у меня в голове. Вопрос: этот метод существует?


 
Polevi ©   (2004-04-26 13:08) [149]

несомненно


 
Sha ©   (2004-04-26 14:37) [150]

Сначала надо дать определение: "Говорят, что метод существует, если выполнены следующие условия: ...", а после этого начинаем проверять, выполнены ли указанные условия.
Весь сыр-бор в конце концов сводится к тому, чьи определения лучше.


 
pasha_golub ©   (2004-04-26 15:35) [151]

2ЮЗ
Я прошу прощения, но я не нашел куска Вашего кода, который под чистую совпадает с примером 1.1

Лично для меня, пожалуйста, запостите его. Спасибо.


 
Юрий Зотов ©   (2004-04-26 18:01) [152]

> pasha_golub ©   (26.04.04 15:35) [151]

Подчистую - конечно, не совпадает. А вот по смыслу (адресная арифметика) и по использованным приемам ("хитрое" получение данных по адресу) - совпадает. См., например, функцию ExtractShortString.

> Sha ©   (26.04.04 14:37) [150]

Условия очевидны - исходный текст программы содержит данный метод, программа откомпилирована и запущена, но ни один объект класса TForm1 в ней еще не создан.


 
Sha ©   (2004-04-26 18:09) [153]

Юрий Зотов ©   (26.04.04 18:01) [152]

Ну, тогда метод существует, пока программа работает в ОП, но ни один объект класса TForm1 в ней еще не создан :))



Страницы: 1 2 3 4 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.83 MB
Время: 0.045 c
3-1082626833
rserg
2004-04-22 13:40
2004.05.16
FibPlus и загрузка процессора при долгой работе программы


1-1082987982
Alex Bakulin
2004-04-26 17:59
2004.05.16
TXMLDocument


1-1083128507
din
2004-04-28 09:01
2004.05.16
Lookup в гриде


1-1083316937
tlan
2004-04-30 13:22
2004.05.16
как работать с Zlib?


6-1080149734
hexbat
2004-03-24 20:35
2004.05.16
Как можно закачать xml запрос на сайт?





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