Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.014 c
1-1122536697
Kolan
2005-07-28 11:44
2005.08.14
Как правильно прекратить работу потока?


4-1119342275
SamProf
2005-06-21 12:24
2005.08.14
По Handle получить класс


1-1122121140
-virus-
2005-07-23 16:19
2005.08.14
OpenGL графика в проектах Delphi (книга)


1-1122464533
Русланка
2005-07-27 15:42
2005.08.14
А можно как то осортировать строки в DBComboBox


3-1120963400
Rasa
2005-07-10 06:43
2005.08.14
Подстановка ключевого поля





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