Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.22.72] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Вообщем есть edit и кнопка. По нажатию на кнопку нужно искать текст из edit'a по всем ячейкам StringGrid, и при нахождении таковой - выделять строку, содержащую эту ячейку. При повторном нажатии кнопки нужно продолжать поиск, а не начинать его сначала. Поиск должен быть без учета регистра, не обязательно точное совпадение, сверху вниз и при достижении конца StringGrid'a начинать сначала.
Например: ищем текст 'кОМпьЮ' - должна найтись строка, содержащая ячейку 'Компьютер'. Надеюсь вам понятно и вы мне поможите. |
Сообщ.
#2
,
|
|
|
Уже такое было, я даже коду постил вроде.
|
Сообщ.
#3
,
|
|
|
что то не нашел я ничего...
|
Сообщ.
#4
,
|
|
|
Kostas используй AnsiPos:
Цитата function AnsiPos(const Substr, S: string): Integer; Description Call AnsiPos to obtain the byte offset of the Substr parameter, as it appears in the string S. For example, if Substr is the string "AB", and S is the string "ABCDE", AnsiPos returns 1. If Substr does not appear in S, AnsiPos returns 0. |
Сообщ.
#5
,
|
|
|
вот мой код:
procedure TForm1.Button2Click(Sender: TObject); Var i,j:integer; begin For i:=0 To StringGrid1.ColCount-1 Do For j:=0 To StringGrid1.RowCount-1 Do if pos(AnsiUpperCase(Edit3.Text), AnsiUpperCase(StringGrid1.Cells[i,j]))>0 then begin StringGrid1.Row:=j; StringGrid1.Col:=i; Exit; end; end; Все правильно ищется, но вот как сделать так, чтобы при повторном нажатии кнопки поиск продолжадся, а не начинался сначала.. уже все варианты перепробовал |
Сообщ.
#6
,
|
|
|
Kostas, сохраняй i и j в отдельные глобальные переменные - i1 и j1 (для начала присвой им по нулю). тогда у тебя получится:
procedure TForm1.Button2Click(Sender: TObject); Var i,j:integer; begin For i:=i1 To StringGrid1.ColCount-1 Do For j:=j1 To StringGrid1.RowCount-1 Do if pos(AnsiUpperCase(Edit3.Text), AnsiUpperCase(StringGrid1.Cells[i,j]))>0 then begin StringGrid1.Row:=j; StringGrid1.Col:=i; i1:=i; j1:=j; break; end; //Если поиск закончен (или ничего не найдено) обнуляем переменные i1:=0; j1:=0; end; |
Сообщ.
#7
,
|
|
|
Kostas, запоминай позиции, на которых поиск остановился.
|
Сообщ.
#8
,
|
|
|
хм.. я так пробовал, но у меня не получилось Видимо дело в break. Я выходил из цикла, используя exit. Попробую такой вариант, может прокатит
|
Сообщ.
#9
,
|
|
|
Kostas, правильно. Делай хоть break, хоть Exit без разницы, если тебе нужно просто из цикла выйти. А потом после того как юзер нажмёт кнопку "Продолжить поиск" снова запускай свои циклы, начиная с переменных, которые ты запомнил.
|
Сообщ.
#10
,
|
|
|
Не работает.. Слушайте, а как выделить несколько ячеек StringGrid'a? Может лучше мне за один раз все найденные ячейки выделять и не парится?
Добавлено Может я чего-то неправильно делаю.. можете кинуть исходничек с реализацией этого поиска? |
Сообщ.
#11
,
|
|
|
Цитата Kostas,9.12.04, 13:51 @ Слушайте, а как выделить несколько ячеек StringGrid'a? procedure TForm1.Button1Click(Sender: TObject); var myRect: TGridRect; begin myRect.Left := 3; myRect.Top := 1; myRect.Right := 2; myRect.Bottom := 4; DrawGrid1.Selection := myRect; end; Взято из дельфийского хелпа. |
Сообщ.
#12
,
|
|
|
Вопрос "вдогонку": а как выделить ячейки в разных местах TStringGrid, например высвятить сразу все совпадения поиска? Спасибо
|
Сообщ.
#13
,
|
|
|
Art4, Только если отрисоавывать "выделение" самому.
|
Сообщ.
#14
,
|
|
|
Цитата Curve,8.12.04, 21:15 @ procedure TForm1.Button2Click(Sender: TObject); Var i,j:integer; begin For i:=i1 To StringGrid1.ColCount-1 Do For j:=j1 To StringGrid1.RowCount-1 Do if pos(AnsiUpperCase(Edit3.Text), AnsiUpperCase(StringGrid1.Cells[i,j]))>0 then begin StringGrid1.Row:=j; StringGrid1.Col:=i; i1:=i; j1:=j; break; end; //Если поиск закончен (или ничего не найдено) обнуляем переменные i1:=0; j1:=0; end; 1. Правильно будет не j1:=j; а j1:=j + 1;. Иначе мы будем всегда находить одно и то же значение. 2. И ещё после каждого прохода внутреннего цикла нужно обнулять j1. procedure TForm1.Button2Click(Sender: TObject); Var i,j:integer; begin For i:=i1 To StringGrid1.ColCount-1 Do begin For j:=j1 To StringGrid1.RowCount-1 Do if pos(AnsiUpperCase(Edit3.Text), AnsiUpperCase(StringGrid1.Cells[i,j]))>0 then begin StringGrid1.Row:=j; StringGrid1.Col:=i; i1:=i; j1:=j+1;//Вместо j1:=j break; end; j1:=0;//Чтобы искать во всем следующем столбце, а не в куске от j1 до конца end; i1:=0; end; |
Сообщ.
#15
,
|
|
|
в общем помучавшись я все же добился желаемого результата, однако он меня не устроил. Решил свою проблему совсем по другому: создал вторую форму, а на ней другой СтрингГрид для результатов поиска. Если кому интересно, то вот рабочий код для такого поиска (в ФАКе нету):
procedure TForm1.Button2Click(Sender: TObject); Var i,j,g:integer; begin For j:=1 To Form2.StringGrid1.ColCount-1 Do For i:=1 To Form2.StringGrid1.RowCount-1 Do Form2.StringGrid1.Cells[j,i]:=''; Form2.StringGrid1.RowCount:=2; g:=0; For i:=0 To StringGrid1.ColCount-1 Do For j:=0 To StringGrid1.RowCount-1 Do if pos(AnsiUpperCase(Edit3.Text), AnsiUpperCase(StringGrid1.Cells[i,j]))>0 then begin g:=g+1; Form2.StringGrid1.Rows[g].Assign(StringGrid1.Rows[j]); Form2.StringGrid1.RowCount:=Form2.StringGrid1.RowCount+1; end; //Показываем результаты поиска Form2.StringGrid1.RowCount:=Form2.StringGrid1.RowCount-1; Form2.StringGrid1.Rows[0].Assign(StringGrid1.Rows[0]); if Form2.StringGrid1.RowCount>1 then Form2.Show else begin Form2.StringGrid1.RowCount:=2; Form2.StringGrid1.FixedRows:=1; ShowMessage('Ничего не найдено!'); end; end; |