Консультация № 169823
24.06.2009, 16:22
0.00 руб.
0 9 1
пожалуйста, помогите разобраться с правильной организацией цикла
имеется: таблица StringGrid1, в ней необходимо осуществить поиск в столбце StringGrid1.Cells [ 5,i ] значений, входящих в первую 10ку (т.е 1, 2, ..10) и вывод результатов в Listbox1.

Код:
procedure TForm1.BitBtn5Click(Sender: TObject);
var
i:byte;
begin
ListBox1.Items.Clear;
for i:=1 to StringGrid1.RowCount-1 do
begin
if StringGrid1.Cells[5,i] < IntToStr(10) then
begin
ListBox1.Items.Add(StringGrid1.Cells[1,i]+' '+StringGrid1.Cells[2,i]+' - '+StringGrid1.Cells[3,i]+', место № '+StringGrid1.Cells[4,i]+', Рейтинг: '+StringGrid1.Cells[5,i]);
end;
end;


на мой взгляд проблема в конструкции if StringGrid1.Cells [ 5,i ] < IntToStr(10) then, если поменять знак, то выводятся все значения из StringGrid1 (((

что бы вы могли посоветовать, чтобы в ListBox'е выводились строки, содержащие в столбце StringGrid1.Cells[5,i] значения от 1 до 10?

Буду благодарна за любую помощь)))

Обсуждение

Неизвестный
24.06.2009, 16:33
общий
А если так:
...
if StrToInt(StringGrid1.Cells [ 5,i ]) < 10 then ...
Неизвестный
24.06.2009, 16:36
общий
Шичко Игорь:
а так после BitBtnClick вылетает с ошибкой(((
Неизвестный
24.06.2009, 16:41
общий
А все ли поля StringGrid1.Cells [ 5,i ] заполнены цифрами?
Если нет, то предварительно нужно делать проверку на наличие в StringGrid1.Cells [ 5,i ] цифры.
Неизвестный
24.06.2009, 16:43
общий
Шичко Игорь:
>>А все ли поля StringGrid1.Cells [ 5,i ] заполнены цифрами?
Все...там всего 3 пробных значения и все являются обычными числами(((
Неизвестный
24.06.2009, 16:48
общий
А с какой ошибкой вылетает?
Неизвестный
24.06.2009, 16:55
общий
с ошибкой конвертирования - EConvertError
если выполнять проверку просто типа (для одного значения):
StringGrid1.Cells[5,i] = '7'
то все корректно выдается (естественно, что только одно значения)
пробовала массив символов задать, но с ним мороки много, а толку мало((
Неизвестный
24.06.2009, 17:02
общий
это ответ
Здравствуйте, BeatCrush.
Для проверки можно ввести временную переменную типа integer.
Полный код для кнопки привожу в приложении.

Приложение:
procedure TForm1.Button1Click(Sender: TObject);
var
i:byte;
temp: integer;

begin
ListBox1.Items.Clear;
for i:=1 to StringGrid1.RowCount-1 do
begin
try
temp:= StrToInt(StringGrid1.Cells[5,i]); {пробуем перевести}
except
temp:= 0; {если не перевелось, то обнуляем}
end;

if (temp < 10) and (temp > 0)
then
begin
ListBox1.Items.Add(StringGrid1.Cells[1,i]+' '+StringGrid1.Cells[2,i]+' - '+StringGrid1.Cells[3,i]+', ìåñòî ¹ '+StringGrid1.Cells[4,i]+', Ðåéòèíã: '+StringGrid1.Cells[5,i]);
end;
end;
end;
5
спасибо, очень элегантное решение!
Неизвестный
30.06.2009, 07:41
общий
Шичко Игорь:
Здравствуйте, Игорь! По-моему, у Вас (как и у автора) неточность. По заданию требуется "значения от 1 до 10", следовательно, должно быть
if (temp <= 10) and (temp > 0) then ...
или if (temp in [1..10]) then ...
Неизвестный
30.06.2009, 09:42
общий
Согласен.
Просто больше обратил внимание на код автора.
Форма ответа