и опять TStringGrid |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
и опять TStringGrid |
marwell |
7.04.2011 14:40
Сообщение
#1
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
Доброго времени суток
Само задание звучит так: Дана таблица целых чисел ai, bi. Выделить цветом все совпадающие пары и максимальную из них, указать позиции. Нашел в инете как выделять цветом только отдельные ячейки, но не уверен что правильно ее применяю. Еще выдает ошибку "Project Projectl.exe raised exception class EConvertError with message'" Is not a valid integer value1. Process stopped. Use Step or Run to continue." Смысл ошибки понимаю, но не вижу в каком месте она появляется, вроде везде правильно работаю с ячейками unit Unit1; |
мисс_граффити |
7.04.2011 17:14
Сообщение
#2
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
вот здесь с границей массива ошибся:
Цитата for i:=1 to ColCount do cells[i,0]:=IntToStr(i); но это к делу не относится... а вот то, что заполняешь ты там только первую (нулевую) стороку, а потом (сразу же, до того, как пользователь получит возможность что-то ввести) пытаешься работать со всеми - очень даже. вставляй в SGDrawCell обработку исключений или хотя бы проверку на заполненность. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
volvo |
7.04.2011 17:29
Сообщение
#3
|
Гость |
Цитата вот здесь с границей массива ошибся: Где именно? Вообще-то границы грида определяются значениями (0 .. RowCount) по вертикали и (0 .. ColCount) по горизонтали, так что никакой ошибки не будет - все в пределах допустимого. |
marwell |
7.04.2011 17:38
Сообщение
#4
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
а вот то, что заполняешь ты там только первую (нулевую) стороку, а потом (сразу же, до того, как пользователь получит возможность что-то ввести) пытаешься работать со всеми - очень даже. вставляй в SGDrawCell обработку исключений или хотя бы проверку на заполненность. ...если сделать так, будет неправильно? (извиняюсь, исправил, сначала ошибся) Добавлено через 16 мин. и еще, как я понял, вот эта строчка совсем не то что надо в данном случае Canvas.TextOut(Rect.Left+2, Rect.Top+2, sg.Cells[i, j]); Сообщение отредактировано: marwell - 7.04.2011 17:52 |
volvo |
7.04.2011 18:23
Сообщение
#5
|
Гость |
Цитата если сделать так, будет неправильно? Нет...Смотри. Событие OnDrawCell происходит при перерисовке каждой клетки. То есть, когда ты рисуешь одну клетку, тебе нужно всего навсего проверить ту, которая выше или ниже нее, одинаковый ли текст они содержат: procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; Вот. А теперь - еще кое что: как только ты вводишь информацию в ячейку, тебе надо перекрасить таблицу: во-первых, возможно, пары одинаковых значений больше нет, а во-вторых, максимум мог измениться. Что для этого надо? Я сделал обраотчик события OnSelEditText у грида: procedure TForm1.SGSetEditText(Sender: TObject; ACol, ARow: Integer; Вот в этом же самом событии, OnSelEditText, я бы и находил максимум, индекс макс. элемента, запоминал бы его в переменной, описанной в классе формы (не надо злоупотреблять глобальными переменными, лучше работать с членами класса), а в OnDrawCell добавил бы еще одну проверку: если сейчас рисуется ячейка, индекс ACol которой совпадает с индексом максимума - то рисовать ее не белым и не красным, а, скажем, зеленым... Попробуй это реализовать сам, если что не получится - я помогу. |
marwell |
7.04.2011 18:26
Сообщение
#6
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
кажется, я начал понимать
... содержимое ячеек постоянно перерисовывается, но тем же черным цветом Добавлено через 2 мин. volvo, спасибо большое, буду разбираться |
marwell |
8.04.2011 12:56
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
добавил
unit Unit1; Цитата запоминал бы его в переменной, описанной в классе формы (не надо злоупотреблять глобальными переменными, лучше работать с членами класса) переменную im я описал так, как ты сказал? |
volvo |
8.04.2011 15:38
Сообщение
#8
|
Гость |
Цитата переменную im я описал так, как ты сказал? Я имел в виду другое.Смотри: (Показать/Скрыть)
Опять же, я не проверяю, введено ли число, если введешь строку - будет вылет программы, добавь проверку все-таки на численное значение, лучше использовать TryStrToInt вместо StrToInt... В результате получается вот что: Эскизы прикрепленных изображений |
marwell |
8.04.2011 19:10
Сообщение
#9
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
Я имел в виду другое. Смотри: (Показать/Скрыть)
Опять же, я не проверяю, введено ли число, если введешь строку - будет вылет программы, добавь проверку все-таки на численное значение, лучше использовать TryStrToInt вместо StrToInt... В результате получается вот что: А как работает TryStrToInt? (никогда прежде не сталкивался с ним) |
volvo |
8.04.2011 19:35
Сообщение
#10
|
Гость |
var |
marwell |
8.04.2011 19:46
Сообщение
#11
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
var теперь понятно. Спасибо огромное, завтра попробую дописать с учетом всех поправок |
marwell |
10.04.2011 18:44
Сообщение
#12
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
с TryStrToInt у меня проблема,никак не получается вставить его в нужное место, и так пробую, и эдак А не проще ли использовать OnKeyPress и просто запретить ввод остальных символов, кроме чисел?
|
volvo |
11.04.2011 13:00
Сообщение
#13
|
Гость |
Цитата А не проще ли использовать OnKeyPress и просто запретить ввод остальных символов, кроме чисел? Это уж тебе решать, может оно и проще, а может и не совсем... Но в использовании TryStrToInt ничего сложного не вижу. Вот так, например:procedure TForm1.SGSetEditText(Sender: TObject; ACol, ARow: Integer;, теперь даже если ты введешь не число (или число, но не целое, а вещественное), ничего страшного в этом обработчике не случится, все нецелые просто не будут обрабатываться (максимум среди них не будет искаться). Сделай что-то подобное в OnDrawCell - и можешь быть спокоен: вылетов не будет... |
мисс_граффити |
11.04.2011 14:30
Сообщение
#14
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Где именно? Вообще-то границы грида определяются значениями (0 .. RowCount) по вертикали и (0 .. ColCount) по горизонтали, так что никакой ошибки не будет - все в пределах допустимого. не поняла... кидаю на форму грид. свойства даже не трогаю. colcount=5, rowcount=5 (по умолчанию). считаю: 5 строк, 5 столбцов. то есть номера 0,1,2,3,4. где пятый столбец и пятая строка? зачем в такие "невидимые" ячейки заголовок выводить? делаю StringGrid1.Cells[5,5]:='5'; ошибки не возникает, но и не появляется эта надпись нигде. аналогичная реакция на обращение к [7, 7]. Более того: в результате выполнения: StringGrid1.Cells[7,7]:='7'; показывается '7'... никаких ошибок. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
marwell |
11.04.2011 19:01
Сообщение
#15
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
Это уж тебе решать, может оно и проще, а может и не совсем... Но в использовании TryStrToInt ничего сложного не вижу. Вот так, например: procedure TForm1.SGSetEditText(Sender: TObject; ACol, ARow: Integer;, теперь даже если ты введешь не число (или число, но не целое, а вещественное), ничего страшного в этом обработчике не случится, все нецелые просто не будут обрабатываться (максимум среди них не будет искаться). Сделай что-то подобное в OnDrawCell - и можешь быть спокоен: вылетов не будет... именно в OnDrawCell я и пытался сделать. Я рассуждал так: сначала надо проверить, введено ли вообще значение далее уже проверить, число ли это потом уже остальные условия из OnDrawCell(проверка равны ли значения во 2ой и 3ей строке, проверка на максимальную пару) procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; но, что-то я делаю не так |
volvo |
11.04.2011 20:09
Сообщение
#16
|
Гость |
Я в твоем коде вижу несколько недочетов:
|
marwell |
11.04.2011 20:37
Сообщение
#17
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
Цитата Ветка else, где выводится MessageDlg, относится к самому первому If-у, так? ээ, черт, что-то я совсем того ... вот даже сейчас смотрю, и мне кажется что эта ветка относится сюда ... видать надо выспаться |
volvo |
11.04.2011 22:16
Сообщение
#18
|
Гость |
Цитата видать надо выспаться Надо просто лучше форматировать код. Считать end-ы не доставляет большого удовольствия...В любом случае, лучше не выводить сообщения о нецелых, да еще и при отрисовке ячеек. Причину я озвучил выше. |
marwell |
12.04.2011 15:49
Сообщение
#19
|
Бывалый Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: 1 |
volvo ,спасибо за помощь
|
Текстовая версия | 21.05.2024 21:22 |