Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 4698
Рейтинг: 426
#1: 2010-07-01 15:32:54 ЛС | профиль | цитата
Нужно было сделать свое главное меню в программе, решил сделать с помощью компонента MenuEx. В скрытых точках нашел пункт doIdxCheck (ставитснимает флажок с индексом ARG(Index,State) ), решил проверить его работу таким образом: code_19164.txt, на что оно мне ответило фигой, сначала думал я что-то не так делаю, полез в коды XPMenus.pas, нашел нужный метод:
#pas
procedure TXPMenu._work_doIdxCheck;
var
Idx: integer;
begin
Idx := ReadInteger(_Data,_data_Index,_prop_Index);
if (Menu.Count > 0) and (Idx >= 0 ) and (Idx < Menu.Count) then
if Menu.ItemChecked[Idx] then
Menu.ItemChecked[Idx] := ReadBool(_Data);
end;
И сразу все стало понятно, зачем там проверка if Menu.ItemChecked[Idx] В описании точки об том, что метод работает только при уже с флажком пункте меню, ни слова (тем более что остальные методы doIdxXXXX работают без этого условия, что видно в исходниках), лечится стандартным закомментированием или удалением полностью этой проверки, вопрос только в заливании на SVN
карма: 10
1
файлы: 1code_19164.txt [917B] [222]
Голосовали:nesco
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2010-07-01 15:44:31 ЛС | профиль | цитата
похоже на ошибку
карма: 26
0
Разработчик
Ответов: 26324
Рейтинг: 2147
#3: 2010-07-01 16:25:02 ЛС | профиль | цитата
Dilma писал(а):
похоже на ошибку

Действительно, в упор не помню, зачем я его там поставил
------------ Дoбавленo в 16.25:
Исправлено
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#4: 2010-07-01 16:28:07 ЛС | профиль | цитата
ошибки подобного рода как правило получаются путем копирования кусков кода из других мест. Ну к примеру простым поиском находим еще один столько же загадочный метод:
#pas
procedure TXPMenu._work_doCheckIdx;
var Idx:integer;
begin
Idx:= ReadInteger(_Data,_data_Index,_prop_Index);
if (Menu.Count > 0) and (Idx >= 0 ) and (Idx < Menu.Count) then
if Menu.ItemChecked[Idx] then
Menu.ItemChecked[Idx]:= not Menu.ItemChecked[Idx] // <--- why not false?
else
Menu.RadioCheck(Idx);
end;
карма: 26
0
Разработчик
Ответов: 4698
Рейтинг: 426
#5: 2010-07-01 16:32:30 ЛС | профиль | цитата
Dilma, там в описании этой точки сказано, что он изменяется состояние на противоположное и загадочен здесь метод после else, а не после then
------------ Дoбавленo в 16.32:
Хотя это тоже интересно, все решается простым способом
#pas
procedure TXPMenu._work_doCheckIdx;
var Idx:integer;
begin
Idx:= ReadInteger(_Data,_data_Index,_prop_Index);
if (Menu.Count > 0) and (Idx >= 0 ) and (Idx < Menu.Count) then
Menu.ItemChecked[Idx]:= not Menu.ItemChecked[Idx];
end;
карма: 10
0
Разработчик
Ответов: 26324
Рейтинг: 2147
#6: 2010-07-01 16:34:14 ЛС | профиль | цитата
Dilma писал(а):
еще один столько же загадочный метод

Там обычный триггер стоит, если "ДА", то сделать "НЕТ", а RadioCheck(idx) стоит для класса флажкак RadioCheck
------------ Дoбавленo в 16.34:
Assasin, на радиокнопках попробуй
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#7: 2010-07-01 16:36:17 ЛС | профиль | цитата
nesco писал(а):
Там обычный триггер стоит, если "ДА", то сделать "НЕТ", а RadioCheck(idx) стоит для класса флажкак RadioCheck

Но как-то неправильно делать вывод о том, что это радиокнопка, если не стоит флажок
карма: 10
0
Разработчик
Ответов: 26324
Рейтинг: 2147
#8: 2010-07-01 16:39:30 ЛС | профиль | цитата
Assasin писал(а):
Но как-то неправильно делать вывод о том, что это радиокнопка, если не стоит флажок

Если я не ошибаюсь, то на обычную кнопку это никак не влияет, а вот радио переключает нормально, иначе, радиокнопка отказывалась переключаться. Ты вот проверь, а потом расскажешь, работает или нет
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#9: 2010-07-01 16:40:45 ЛС | профиль | цитата
nesco писал(а):
Там обычный триггер стоит, если "ДА", то сделать "НЕТ",

тригер это замечательно, но "not Menu.ItemChecked[Idx]" в контексте указанного метода тождественно равен false и ничему более.
+
Assasin писал(а):
Но как-то неправильно делать вывод о том, что это радиокнопка, если не стоит флажок

карма: 26
0
Разработчик
Ответов: 4698
Рейтинг: 426
#10: 2010-07-01 16:40:54 ЛС | профиль | цитата
некогда мне сейчас проверять
карма: 10
0
Разработчик
Ответов: 26324
Рейтинг: 2147
#11: 2010-07-01 16:45:12 ЛС | профиль | цитата
Dilma писал(а):
но "not Menu.ItemChecked[Idx]" в контексте указанного метода тождественно равен false и ничему более

Очень интересно, а почему же это тогда работает
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#12: 2010-07-01 16:49:09 ЛС | профиль | цитата
nesco писал(а):
а почему же это тогда работает

всмысле? никто и не утверждал, что строка
"Menu.ItemChecked[Idx]:= not Menu.ItemChecked[Idx]"
не работает. Утверждалось, что ее можно сделать короче и проще:
"Menu.ItemChecked[Idx]:= false"
карма: 26
0
Разработчик
Ответов: 26324
Рейтинг: 2147
#13: 2010-07-01 17:42:51 ЛС | профиль | цитата
Исправил. Но RadioCheck(idx) убирать нельзя, иначе, радиокнопки переключаться не будут, а отдельного метода для определения принадлежности флажка к радио или обычному чеку нет
карма: 22

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)