Форум: "Потрепаться";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизЗагадка программерам от Питера :) Найти похожие ветки
← →
Piter © (2005-07-18 19:24) [0]Есть у нас форма. На форме две радиокнопки: rbOn и rbOff. Также есть таймер: Timer1. Больше ничего нету.
Код:procedure TForm1.rbOnClick(Sender: TObject);
begin
Timer1.Enabled := true;
end;
procedure TForm1.rbOffClick(Sender: TObject);
begin
Timer1.Enabled := false;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
rbOff.Checked := true;
MessageBox(Handle, "Prosto tak", nil, 0);
end;
Изначально Таймер выключен, помечена rbOff.
Что будет, если включить rbOn? По идее, она запустит таймер, через секунду событие таймера начнет выполняться - включится rbOff, таймер будет остановлен, выведется текстовое сообщение. Система придет в начальное состояние.
А на самом деле не так :)
Кому лень набивать код - вот ссылка на готовый файл проекта, D7: http://piter.pechora.org/other/Zagadka.zip (1 KByte)
← →
jack128 © (2005-07-18 19:55) [1]Хе. Борланды перемудрили, конечно. Нужно было в GetChecked что типа такого написать
if HandleAllocated then
Result := SendMessage(Handle, BM_GETCHECK, 0, 0) = BST_CHECKED
else
Result := FChecked;
ну и в DestroyWnd сохранять свойство Checked в поле. Короче как это обычно делается...
← →
pasha_golub © (2005-07-19 02:04) [2]И че?
Уважаемый, приведите реальный случай использования. А то, я тоже могу на заборе слово "XYZ" написать... В чем сокровенный смысл?!
← →
БарЛог © (2005-07-19 08:30) [3]> А то, я тоже могу на заборе слово "XYZ" написать... В чем сокровенный смысл?!
Еще раз указываешь, что мы живем в трехмерном пространстве :)
← →
sniknik © (2005-07-19 10:50) [4]а я бы делал так, и даже не заметил бы несоответствий (обычный стиль), впрочем так и не замечал пока не показали. ;о))
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with timer1 do
if tag = 0 then begin
tag:= 1;
MessageBox(Handle, "Prosto tak", nil, 0);
rbOff.Checked := true;
tag:= 0;
end;
end;
← →
Плохиш © (2005-07-19 11:20) [5]
> Piter © (18.07.05 19:24)
Разве кто-то обещал, что при изменении свойства Checked у радиокнопок будет вызван обработчик OnClick?
← →
Piter © (2005-07-19 14:00) [6]Народ, вы хоть поняли в чем дело то? У меня такое ощущение, что нет. и пример выложил - могли бы и посмотреть.
Разве кто-то обещал, что при изменении свойства Checked у радиокнопок будет вызван обработчик OnClick
Обещал, не обещал - но это происходит. При Checked := True - происходит вызов OnClick.
Но не в этом дело.
Дело в том, что после нажатия rbOn - включится таймер. При возникновении события таймера включится rbOff, таймер отключится. А после показа MessageBox, опять включится rbOn и включится таймер!
Могли бы и посмотреть на работу пример, коли я уж выложил его!
Просто так что ли?
← →
evvcom © (2005-07-19 14:27) [7]Многие ошибки исправляются на этапе тестирования. А если не было прецедента, то как бы нет и ошибки. Проблема этого глюка/фичи в том, что при смене Checked фокус остается на старом объекте, потом форма теряет фокус, а при восстановлении фокуса форма дает его своему контролу, при этом его свойство Checked и меняется опять на True.
← →
Piter © (2005-07-19 15:37) [8]evvcom © (19.07.05 14:27) [7]
ага :)
Но выглядит все достаточно необычно :)
Дело как раз в этом, при Checked = True вызывается событие OnClick, но это не тоже самое что щелкнуть по кнопке. При щелчке по кнопке еще и фокус перемещается.
← →
tesseract © (2005-07-19 16:40) [9]to >>>Piter
procedure TCustomCheckBox.SetChecked(Value: Boolean);
begin
if Value then State := cbChecked else State := cbUnchecked;
end;
Где здесь вызов onClick????? кто тебе сказал что onClick срабатывает?.
← →
Anatoly Podgoretsky © (2005-07-19 16:43) [10]Зачем постить кривой код, тебе уже в Фидо все ошибки объяснили, ты продолжаешьс удивдяться и так уже не первый раз, с другими подозрительными кодами было тоже самое.
Пиши нормальный код и место для удивления не будет. Не осталяй места для проблем, пиши надежный код и тестируй его во всех режимах.
← →
DiamondShark © (2005-07-19 16:47) [11]
> tesseract © (19.07.05 16:40) [9]
А где здесь радиобатон?
← →
han_malign © (2005-07-19 17:18) [12]>tesseract © (19.07.05 16:40) [9]
>DiamondShark © (19.07.05 16:47) [11]
>> tesseract © (19.07.05 16:40) [9]
>А где здесь радиобатон?
да даже без "радиобатона":procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
if FState <> Value then
begin
FState := Value;
if HandleAllocated then
SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
if not ClicksDisabled then Click;
end;
end;
← →
Piter © (2005-07-19 18:52) [13]tesseract © (19.07.05 16:40) [9]
Где здесь вызов onClick????? кто тебе сказал что onClick срабатывает?.
Почему бы не посмотреть исходники VCL? Почему бы не поэкспериментировать, прежде чем на двух форумах тупость постить?
Anatoly Podgoretsky © (19.07.05 16:43) [10]
Зачем постить кривой код, тебе уже в Фидо все ошибки объяснили, ты продолжаешьс удивдяться
А вы, уважаемый Анатолий, как и 65% народу абсолютно не поняли в чем фишка кода. И в ФИДО не поняли, кроме одного человека :)
Может вы попробуете, а?
и так уже не первый раз, с другими подозрительными кодами было тоже самое.
понимаю ваше стремление меня задеть, да только сейчас вы попали впросак.
Пиши нормальный код и место для удивления не будет
код нормален. Предлагаю вам все таки разобраться в ситуации. После тако как разберетесь, с удовольствием выслушаю, чем код вам так не понравился.
← →
Igorek © (2005-07-19 19:27) [14]Piter © (18.07.05 19:24)
Я вот не могу понять постановку задачи. В чем конкретно вопрос?
Этот?
> Что будет, если включить rbOn?
Вроде пояснили.
Или как реализовать поведение?
Piter © (18.07.05 19:24)
По идее, она запустит таймер, через секунду событие таймера начнет выполняться - включится rbOff, таймер будет остановлен, выведется текстовое сообщение. Система придет в начальное состояние.
Тоже пояснили.
Какое поведение тебе нужно:
- от программы
- от ВЦЛ
?
← →
Piter © (2005-07-19 19:36) [15]Igorek © (19.07.05 19:27) [14]
В чем конкретно вопрос?
какой вопрос? Вопроса нет - я предложил загадку.
Только не утверждай, что каждый без разбирательств может сказать, что на самом деле происходит.
Первым в загадку здесь въехал evvcom, с чем его и поздравляю :)
← →
Anatoly Podgoretsky © (2005-07-19 20:39) [16]Piter © (19.07.05 18:52) [13]
Не буду, что мне делать нечего. А насчет задеть, не так это, не первый раз ты подобное постишь.
← →
Piter © (2005-07-20 00:18) [17]Anatoly Podgoretsky © (19.07.05 20:39) [16]
не первый раз ты подобное постишь
подобное? Вот здесь я на 100% уверен, что все ок.
Более того, на 90% я уверен, что вы до сих пор не понимаете в чем фокус приведенного мной примера. Тогда о чем говорить...
Говорю же, хотите сделать мнение - посмотрите пример.
Иначе просто не поймете. Не доагадетесь сами, что происходит. Если только по ответам еще не поняли...
← →
DrPass © (2005-07-20 00:25) [18]
> Дело в том, что после нажатия rbOn - включится таймер. При
> возникновении события таймера включится rbOff, таймер отключится.
> А после показа MessageBox, опять включится rbOn и включится
> таймер!
Ну я так понимаю, что если ты имеешь дело с RadioButton, то после изменения состояния и срабатывания OnClick на одной, то же самое произойдет и с другой (в код VCL смотреть лень). Поэтому в обработчике хорошо бы еще и состояние проверять. if rbOn.Checked then Timer1.Enabled:=...
← →
Piter © (2005-07-20 01:17) [19]DrPass © (20.07.05 0:25) [18]
после изменения состояния и срабатывания OnClick на одной, то же самое произойдет и с другой
нет, OnClick происходит только при присвоении Checked := True
Ну посмотри ты наконец пример, неужели так сложно? :)
Сразу все и увидешь :)
← →
evvcom © (2005-07-20 08:47) [20]
> Я вот не могу понять постановку задачи. В чем конкретно
> вопрос?
Да нет никакой задачи. Человеку потрепаться захотелось на тему глюков борландового кода, вот и все. Мне тоже не нравится вызов OnClick при присваивании Checked, ведь не было никакого Click. Лучше бы событие OnChange сделали, было бы логичнее, но как говорится, не надо трогать генофонд, надо воспринимать его таким какой он есть.
← →
Piter © (2005-07-20 13:07) [21]evvcom © (20.07.05 8:47) [20]
Человеку потрепаться захотелось на тему глюков борландового кода, вот и все
ну практически. Не потрепаться, а просто загадать задачку.
Блин, ну это по типу что MBo загадывает. Просто задачка и надо понять ПОЧЕМУ ТАК.
Кто захотел - разобрался и понял. КТо-тоуперся и не захотел - ну и ладно :)
← →
Piter © (2005-07-20 13:08) [22]Отчет: :)
Ну да, все теперь верно :)
В общем, на SQL.ru самые нормальные ответы.
Конечно, поначалу тоже пытались обвинить, что я не знаю как останавливать таймер, что Checked =True не приводт к вызову OnClick (нет бы самим попробовать), но в общем ок :)
Хуже на Delphimaster, там профы программирования тоже, естественно, не въехали в этот по их мнению простенький пример, но никто не признал потом своего непонимания :)
Все в стиле "ну и в чем загвоздка, что ты хотел доказать - мы не понимать"
На Королевстве Дельфи аналогично.
(сразу хочу сказать, что ничего доказывать не собирался - просто загадал загадку и все. Кому интересно - тот порешал :)
Но самая жесткая ситуация, конечно, в ФИДО :)
Там наибольшее количество профессионалов, очень высокий уровень.
Поэтому свою ошибку не признал НИКТО :) Хотя лоханулись также - и говорили что Checked=true не приводит к вызову OnClick, и что мне надо в Delphi.chainik и все в таком духе.
Когда догнали - стандартно "я на работе не ем, работаю по 16 часов, поэтому все спутал" :)
Следят за репутацией - молодцы :)
Вот такое мое имхо в маленьком исследовании :)))
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.013 c