![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Здравствуйте. Помогите пожалуйста..
Вообщем есть массив. в каждом элементе храниться информация типа: abc def Где abcdef - числа. В первой и второй строке может быть от 2 до 6 символов. Мне нужно взять из одного элемента массива первую строку и распределить все 6 цифр. То есть если там есть цифра 1, то активировать чекбокс, если 2 - активировать второй чекбокс и т.д. Я сделал такой цикл: Код:
Ans[Number] := '123456' + #13#10 + '135'; o := Length(Ans[Number]); If Length(Ans[Number]) > 1 Then Begin For i := 1 To o Do Begin If Ans[Number][i] = #13 Then p := False; If p = True Then Begin If Ans[Number][i] = '1' Then Test.Ans11.Checked := True; If Ans[Number][i] = '2' Then Test.Ans21.Checked := True; If Ans[Number][i] = '3' Then Test.Ans31.Checked := True; If Ans[Number][i] = '4' Then Test.Ans41.Checked := True; If Ans[Number][i] = '5' Then Test.Ans51.Checked := True; If Ans[Number][i] = '6' Then Test.Ans61.Checked := True; End; end; end; Но у меня какой-то бред получается. Всегда выдает не то! Сначала вообще не работало, после перезагрузки компилятора стал активировать только 1 чек бокс. Помогите, пожалуйста. Может быть проблема в Ans[Number][i], и i показывает не номер символа а что-нибудь еще, связанное с массивами? Но я пробовал и через Copy. Эффект такой же.. |
#2
|
||||
|
||||
![]() Задание не совсем ясное, но этот исходный код можно сократить до примерно такого варианта:
Код:
Ans[Number] := '123456' + #13#10 + '135'; for i := 1 to Length(Ans[Number]) do begin case Ans[Number][i] of '1': Test.Ans11.Checked := True; '2': Test.Ans21.Checked := True; '3': Test.Ans31.Checked := True; '4': Test.Ans41.Checked := True; '5': Test.Ans51.Checked := True; '6': Test.Ans61.Checked := True; #13: p := False; end; end; Или же можно наоборот, перебирать в цикле чекбоксы и смотреть нет ли нужного символа в строке. |
#3
|
||||
|
||||
![]() Спасибо, сейчас попробую..
Цитата:
![]() Цитата:
156 123 Мы должны просмотреть только первую строку, то есть 156, и выделить чекбоксы, которые соответствуют цифрам 1, 5 и 6. ... Проверил.. Эффект такой же.. Активирует ТОЛЬКО 1 чекбокс. Если ставлю в условии сначала на проверку 2, а потом 1, 3, 4, 5, 6, то выделяет только 2 чекбокс.. ... Все! Я сделал следующее. Сначала ввел в переменную содержание массива, а затем работал уже с переменной. Все работает отлично! Код:
Ans[Number] := '123456' + #13#10 + '123'; s := Copy(Ans[Number], 1, Pos(#13, Ans[Number]) -1); for i := 1 to Length(s) do begin case s[i] of '1': Test.Ans11.Checked := True; '2': Test.Ans21.Checked := True; '3': Test.Ans31.Checked := True; '4': Test.Ans41.Checked := True; '5': Test.Ans51.Checked := True; '6': Test.Ans61.Checked := True; end; end; Вот так все работает. Только вот теперь думаю.. Почему так с массивами происходило? Последний раз редактировалось ___toha___, 29.12.2013 в 20:03. |
#4
|
||||
|
||||
![]() Цитата:
Код:
#13: p := False; Код:
#13: Break; |
#5
|
||||
|
||||
![]() Судя по названиям переменных и использованию чекбоксов - это тест.
Поэтому хоть убей, не пойму - зачем тут делать строку. Приведенный код вроде нормальный. Может ошибка где-то еще. jmp $ ; Happy End! The Cake Is A Lie. |
#6
|
||||
|
||||
![]() Спасибо за ответ) Разобрался) Информация в предпоследнем посте)
Цитата:
Сам не знаю! Я уже второй день сам мучаю голову.. Может что с компилятором.. Но не работал он, не работал.. Пробовал на других проектах, на новых, такая же фигня была.. Сделал через переменную - без ошибок) С этими массивами одни проблемы.. Вот опять же.. Продолжаю делать.. Опять ошибка в массивах.. Сначала пишет одно, затем другое.. Зависимости ни как не пойму.. Может кто поймет, в чем ошибка.. Я делаю что-то типа тестов. Многое я уже сделал, а тут что-то застрял хорошенько. Расскажу вкратце.. Есть TreeView.. Оно здесь работает как ListBox, просто красивее ![]() Ну так вот.. В каждой строке есть как бы название вопроса. При нажатии на ячейку с вопросом переменной Number дается значение выделенной ячейки. Далее открывается панель с 6 чекбоксами. При нажатии на каждый из нах происходит следующее: Код:
Ans[Number] := Otvet2 + #13#10 + TextQ.Lines.Strings[7]; Где Otvet2 - это функция: Код:
If Test.Ans11.Checked = True Then s := s + '1'; If Test.Ans21.Checked = True Then s := s + '2'; If Test.Ans31.Checked = True Then s := s + '3'; If Test.Ans41.Checked = True Then s := s + '4'; If Test.Ans51.Checked = True Then s := s + '5'; If Test.Ans61.Checked = True Then s := s + '6'; result := s; То есть элементу массива, с номером выделенной строки, дается строка с выделенными чекбоксами. При нажатии на другой элемент TreeView произойдет все точно так же, только Number будет другой, а следовательно, значение дастся уже другому элементу массива. При открытии вопроса, то есть при нажатии на элемент TreeView произойдет очистка чек боксов, то есть все Checked будут равны False, а затем код: Код:
s := Copy(Ans[Number], 1, Pos(#13, Ans[Number]) -1); for i := 1 to Length(s) do begin case s[i] of '1': Test.Ans11.Checked := True; '2': Test.Ans21.Checked := True; '3': Test.Ans31.Checked := True; '4': Test.Ans41.Checked := True; '5': Test.Ans51.Checked := True; '6': Test.Ans61.Checked := True; end; end; Вроде как бы все нормально должно работать. Но почему-то все время разные чекбоксы выделяет, то вообще не выделяет, то через раз.. Код на самом деле в разы больше, но, вроде, что касается этого я изъявил.. Последний раз редактировалось M.A.D.M.A.N., 30.12.2013 в 13:03. |
#7
|
|||
|
|||
![]() Код, вроде, нормальный.
Ставь точку останова на первую строчку последнего куска кода и смотри что у тебя в переменных. Ну и по шагам пройди код. |
#8
|
||||
|
||||
![]() Цитата:
Все так и делаю.. Заметил одну ОООЧЕНЬ интересную хреновину, которую вижу первый раз в жизни)) Вообщем, я поставил 1 ShowMessage, который показывает мне содержимое Ans[Number]. Я выделяю все 6 чекбоксов, нажимаю на TreeView иии.. Мне подряд высвечиваются 6 сообщений!!! Откуда?! У меня нету циклов и только один ShowMessage! Но тут есть и что-то еще интересней! Эти сообщения по содержанию различаются на 1 символ! Сначала высвечивается 123456, как и должно быть! Но затем 23456 (один чекбокс уже убирается), затем 3456, 456, 56, 6 и наконец все! все чекбоксы деактивируются! Я уже не знаю.. Может у меня компилятор скурил что-то.. ОООчень странно ведет себя) Сейчас проверил полностью код, showmessage есть только в процедурах нажатий чекбоксов.. КАК?! То есть у меня они сами нажимаются?!!!? Последний раз редактировалось ___toha___, 29.12.2013 в 21:14. |
#9
|
|||
|
|||
![]() Ага, дело в том, что OnNodeChange (или как его там) вызывается несколько раз. Надо проверять, что текущий узел действительно поменялся и только в этом случае запускать свой код.
|
#10
|
||||
|
||||
![]() Цитата:
Я тоже так подумал, сначала, но я-то вызываю не OnNodeChange, а OnClick.. По моим "экспериментам" я понял, что при нажатии на TreeView у меня нажимаются и CheckBox'ы, не всегда, а только в некоторых случаях (пока не понял, в каких).. Не знаю, что на это может влиять.. Врятли это из-за BringToFront у панели, которая показывается при нажатии... Последний раз редактировалось ___toha___, 30.12.2013 в 00:41. |