![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
sheka |
![]()
Сообщение
#1
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Продолжнение "Вызывает антирес и такой ишо разрез"
Как можно осуществить событие для динамически созданного компонента? Проблема в том, что программа модульная и "процедура не описана как метод формы". procedure MyOnClick(Sender: TObject); Сама программа: ![]() Сообщение отредактировано: sheka - 31.07.2010 23:24 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Как можно осуществить событие для динамически созданного компонента? Легко:procedure CreateSubMenu(MainMenu: TMainMenu; p: TP);Работоспособность твоего кода не проверял, ибо не надо использовать нестандартных компонентов ![]() Добавлено через 2 мин. Да, кстати, на предупреждения компилятора тоже обращай внимание, ладно? У тебя будет как минимум одно предупреждение, связанное с некорректной работой с переменными цикла (хоть проект и не открылся в Дельфи, но как текстовый файл я его просмотрел, это предупреждение видно невооруженным взглядом). |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Итак, я нашел, что не давало открывать проект в D2009 - одно из свойств TIdHTTP уже отсутствует, поэтому проект не открывался. Открыл. Посмотрел... Могу подсказать, что надо будет сделать, чтобы оно заработало в 2009/2010, если тебя интересует (в том виде, в котором это сейчас - оно не очень-то работает, только при совпадении некоторых условий, а это плохой стиль программирования). Но это - не главное, что я хотел сказать. Главное - в другом.
У тебя парсинг сделан "в лоб". А зачем? Можно же воспользоваться средствами, которые тебе предоставляет Дельфи, и тогда вот это: Цитата procedure FindWreckersOnline(var Memo: TMemo;source: string); procedure FindWreckersOnline(var Memo: TMemo; source: string);Ошибиться, как видишь, практически негде... Работает абсолютно так же, как твой код, только я один пробел (между фамилией и баллом, добавил, чтоб лучше смотрелось) ![]() |
sheka |
![]()
Сообщение
#4
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Цитата Легко Да...![]() А я то думал они есть и были у всех, кроме меня.. ![]() Я видел это предупреждение(это там где for i:=i to.., да?), но подумал, раз я его нигде не использую - то ничего страшного. А чем это может быть опасно? Как можно вручную открыть окно "Мessages"? |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата А я то думал они есть и были у всех, кроме меня.. А я думал, что у меня более новая версия (Indy 10), в которой НЕТ свойства MaxLineAction. Я что, должен теперь установить более старую версию? ![]() Цитата Как можно вручную открыть окно "Мessages"? Нажать на Alt+F7 или Alt+F8 (переход к предыдущей/следующей ошибке), при этом должно появиться и окно Messages, если ошибки/предупреждения были, конечно.Цитата Я видел это предупреждение(это там где for i:=i to.., да?), но подумал, раз я его нигде не использую - то ничего страшного. Ау.... Кто и чего где не использует? Ты получил предупреждение? Так вот тебе надо сделать так, чтоб твоя программа компилировалась без предупреждений. Чем опасно? Вот этим:http://www.delphibasics.co.uk/RTL.asp?Name=For Цитата Notes Теперь понимаешь, в чем проблема?The loop Variable value is not guaranteed by Delphi at loop end. So do not use it! for i:=prev to PosEx('">',poem,prev)-1 do После окончания первого цикла у тебя i может быть не равно PosEx('">',poem,prev)-1 (на что ты рассчитываешь), тогда весь твой второй цикл улетит в тартарары... Будет незнамо где начинаться (и неизвестно где заканчиваться, потому как конечное значение второго цикла тоже вычисляется с учетом i). Дельфи гарантирует, что i будет принимать какое-то осмысленное значение ТОЛЬКО тогда, когда цикл закончился Break-ом, тогда то значение переменной, при котором произошел Break, сохранится и после цикла. У тебя Break отсутствует так что ничего определенного по поводу значения i сказать нельзя. Не зря во многих языках управляющая переменная цикла видима только внутри самого цикла, чтоб к ней потом нельзя было обратиться. |
sheka |
![]()
Сообщение
#6
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
procedure TForm1.FormCreate(Sender: TObject); А что делать если в MyOnClick нужно еще передать дополнительные параметры? MyOnClick(Sender: TObject;n: integer;var SourceVisual: TSourceVisual); |
sheka |
![]()
Сообщение
#7
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Цитата Могу подсказать, что надо будет сделать, чтобы оно заработало в 2009/2010, если тебя интересует (в том виде, в котором это сейчас - оно не очень-то работает, только при совпадении некоторых условий, а это плохой стиль программирования) Подскажите, пожалуйста. |
Unconnected |
![]()
Сообщение
#8
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Цитата The loop Variable value is not guaranteed by Delphi at loop end. So do not use it! Ого, я тоже всегда считал, что если цикл завершился, то "loop variable" будет равна конечному параметру.. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата Подскажите, пожалуйста. Вот так:procedure FindWreckersOnline(var Memo: TMemo;source: string); ... при этом работу по перекодировке из 1251 (или любой другой кодировки, которая указана в TStringStream.Create вторым параметром) возьмет на себя Дельфи. Цитата Ого, я тоже всегда считал, что если цикл завершился, то "loop variable" будет равна конечному параметру.. Очень плохо. Я тысячу раз говорил, что это не так, ни в Дельфи ни в Паскале, нигде это не должно подразумеваться, но никто ж не слушает... И в Турбо Паскале тоже нельзя было полагаться на подобное поведение, но на это тоже всем наплевать, здесь и сейчас работает и ладно.Цитата А что делать если в MyOnClick нужно еще передать дополнительные параметры? Подумать, так ли они нужны на самом деле. Потому что обработчик события OnClick имеет строго определенную сигнатуру:Цитата type TNotifyEvent = procedure (Sender: TObject) of object; |
sheka |
![]()
Сообщение
#10
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Все, конечно же, можно обойти, но так было бы чуть короче:
Код (Показать/Скрыть)
Ну и сам проэкт ![]() Добавлено через 8 мин. А вот ответ на Ваш код srvReply := TStringStream.Create('', 1251); Цитата [Error] Too many actual parameters |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата А вот ответ на Ваш код Цитата Могу подсказать, что надо будет сделать, чтобы оно заработало в 2009/2010 , если что:![]() Так что Дельфи 2009 обрабатывает совершенно нормально мой код (предупреждения о CharInSet - не в счет, я их пока не исправлял, и они выше по тексту) Цитата но так было бы чуть короче: И сильно неправильнее, кстати. Я ж тебе сказал, какую сигнатуру имеет TNotifyEvent, а ты опять за свое. КАК ТЫ ОБЪЯСНИШЬ Дельфи, что функция с двумя параметрами должна втиснуться в то, что Дельфи с рождения знает, как TNotifyEvent - то есть, в функцию с одним параметром? Покажи мне, не как ты обходишь то, что наворотил, а как Дельфи принимает вместо одного параметра два, и как именно ты к этим параметрам обращаешься при выполнении кода. (Очень удачно ты сделал, да? Сначала выбрал неправильную структуру программы, потом обошел еще более неправильным костылем, и вроде бы даже и прав остался? Сейчас все работает, а потом - хоть потоп? Ну, разубеждать тебя не буду, дел у меня других нет что-ли... Потом сам придешь спрашивать. Я даже знаю, что именно. Но это уже, извини, без меня. Я больше на твои вопросы не отвечаю...)Удачи... |
![]() ![]() |
![]() |
Текстовая версия | 14.07.2025 0:15 |