Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.12.2013, 16:48
Аватар для ___toha___
___toha___ ___toha___ вне форума
Прохожий
 
Регистрация: 18.12.2012
Адрес: Сасово
Сообщения: 23
Версия Delphi: 7
Репутация: 10
Вопрос Распределение по граппам

Здравствуйте. Помогите пожалуйста..
Вообщем есть массив. в каждом элементе храниться информация типа:

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  
Старый 29.12.2013, 19:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Задание не совсем ясное, но этот исходный код можно сократить до примерно такого варианта:
Код:
  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;
p.s. И ещё перед этим циклом неплохо бы сбросить отметку с этих чекбоксов.
Или же можно наоборот, перебирать в цикле чекбоксы и смотреть нет ли нужного символа в строке.
Ответить с цитированием
  #3  
Старый 29.12.2013, 19:54
Аватар для ___toha___
___toha___ ___toha___ вне форума
Прохожий
 
Регистрация: 18.12.2012
Адрес: Сасово
Сообщения: 23
Версия Delphi: 7
Репутация: 10
По умолчанию

Спасибо, сейчас попробую..

Цитата:
И ещё перед этим циклом неплохо бы сбросить отметку с этих чекбоксов
Это у меня есть Просто сам код очень длинный, поэтому скопировал только эту часть..

Цитата:
Задание не совсем ясное
Вообщем. Например в данном элементе массива такая строка:
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  
Старый 29.12.2013, 19:58
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ___toha___
Вообщем. Например в данном элементе массива такая строка:
156
123
МЫ должны просмотреть только первую строку, то есть 156, и выделить чекбоксы, которые соответствуют цифрам 1, 5 и 6.
Тогда в моём коде замени эту строку:
Код:
    #13: p := False;
на такую:
Код:
    #13: Break;
(Зачем нужна переменная p я всё равно не понял)
Ответить с цитированием
  #5  
Старый 29.12.2013, 20:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Судя по названиям переменных и использованию чекбоксов - это тест.
Поэтому хоть убей, не пойму - зачем тут делать строку.
Приведенный код вроде нормальный. Может ошибка где-то еще.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #6  
Старый 29.12.2013, 20:04
Аватар для ___toha___
___toha___ ___toha___ вне форума
Прохожий
 
Регистрация: 18.12.2012
Адрес: Сасово
Сообщения: 23
Версия Delphi: 7
Репутация: 10
По умолчанию

Спасибо за ответ) Разобрался) Информация в предпоследнем посте)

Цитата:
Сообщение от Bargest
Судя по названиям переменных и использованию чекбоксов - это тест.
Поэтому хоть убей, не пойму - зачем тут делать строку.
Приведенный код вроде нормальный. Может ошибка где-то еще.


Сам не знаю! Я уже второй день сам мучаю голову.. Может что с компилятором.. Но не работал он, не работал.. Пробовал на других проектах, на новых, такая же фигня была.. Сделал через переменную - без ошибок)

С этими массивами одни проблемы.. Вот опять же.. Продолжаю делать.. Опять ошибка в массивах.. Сначала пишет одно, затем другое.. Зависимости ни как не пойму..

Может кто поймет, в чем ошибка..
Я делаю что-то типа тестов. Многое я уже сделал, а тут что-то застрял хорошенько. Расскажу вкратце..
Есть 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  
Старый 29.12.2013, 20:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код, вроде, нормальный.
Ставь точку останова на первую строчку последнего куска кода и смотри что у тебя в переменных. Ну и по шагам пройди код.
Ответить с цитированием
  #8  
Старый 29.12.2013, 21:05
Аватар для ___toha___
___toha___ ___toha___ вне форума
Прохожий
 
Регистрация: 18.12.2012
Адрес: Сасово
Сообщения: 23
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Код, вроде, нормальный.
Ставь точку останова на первую строчку последнего куска кода и смотри что у тебя в переменных. Ну и по шагам пройди код.


Все так и делаю.. Заметил одну ОООЧЕНЬ интересную хреновину, которую вижу первый раз в жизни))

Вообщем, я поставил 1 ShowMessage, который показывает мне содержимое Ans[Number].

Я выделяю все 6 чекбоксов, нажимаю на TreeView иии.. Мне подряд высвечиваются 6 сообщений!!! Откуда?! У меня нету циклов и только один ShowMessage! Но тут есть и что-то еще интересней! Эти сообщения по содержанию различаются на 1 символ! Сначала высвечивается 123456, как и должно быть! Но затем 23456 (один чекбокс уже убирается), затем 3456, 456, 56, 6 и наконец все! все чекбоксы деактивируются! Я уже не знаю.. Может у меня компилятор скурил что-то.. ОООчень странно ведет себя)

Сейчас проверил полностью код, showmessage есть только в процедурах нажатий чекбоксов.. КАК?! То есть у меня они сами нажимаются?!!!?

Последний раз редактировалось ___toha___, 29.12.2013 в 21:14.
Ответить с цитированием
  #9  
Старый 30.12.2013, 00:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ага, дело в том, что OnNodeChange (или как его там) вызывается несколько раз. Надо проверять, что текущий узел действительно поменялся и только в этом случае запускать свой код.
Ответить с цитированием
  #10  
Старый 30.12.2013, 00:38
Аватар для ___toha___
___toha___ ___toha___ вне форума
Прохожий
 
Регистрация: 18.12.2012
Адрес: Сасово
Сообщения: 23
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ага, дело в том, что OnNodeChange (или как его там) вызывается несколько раз. Надо проверять, что текущий узел действительно поменялся и только в этом случае запускать свой код.

Я тоже так подумал, сначала, но я-то вызываю не OnNodeChange, а OnClick..
По моим "экспериментам" я понял, что при нажатии на TreeView у меня нажимаются и CheckBox'ы, не всегда, а только в некоторых случаях (пока не понял, в каких).. Не знаю, что на это может влиять.. Врятли это из-за BringToFront у панели, которая показывается при нажатии...

Последний раз редактировалось ___toha___, 30.12.2013 в 00:41.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025