На форме имеется компонент StringGrid
со значениями (данные вбиваются прямо в компоненте, никакой БД нету). Имеется поле Edit
и кнопка. Необходимо осуществить поиск по первой колонке. Т.е. найти в первой колонке все значения соответствующие значению в Edit
. Может кто подсказать, как это реализовать? В PHP
я это сделал а вот Delphi давно не занимался, подзабыл как это делать.
Deleted
3611 золотой знак5 серебряных знаков13 бронзовых знаков
задан 3 июл 2012 в 17:07
new_russian_mannew_russian_man
8491 золотой знак27 серебряных знаков67 бронзовых знаков
у стринг грида есть свойства Cells ,Col, Row, aCol, aRow, ColMax и RowMax, ими и нужно оперировать в данном случае.
Делаете простой цикл for i:= 0 to RowMax — 1 do, и в теле цикла пробегаете каждую строчку и сравниваете ее со значением в Едит: if StringGrid1.Cells[MyCol, i] = Edit1.text then.
ответ дан 3 июл 2012 в 20:32
Если искать нужно только в первой колонке, то используйте
i:=StringGrid1.Cols[0].IndexOf(Edit1.Text);
Это вернет либо номер строки, где совпало, либо -1
cyadvert
7,0171 золотой знак16 серебряных знаков31 бронзовый знак
ответ дан 1 окт 2015 в 21:17
Поиск в StringGrid
, не такой, как обычно
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Вообщем есть edit и кнопка. По нажатию на кнопку нужно искать текст из edit’a по всем ячейкам StringGrid, и при нахождении таковой — выделять строку, содержащую эту ячейку. При повторном нажатии кнопки нужно продолжать поиск, а не начинать его сначала. Поиск должен быть без учета регистра, не обязательно точное совпадение, сверху вниз и при достижении конца StringGrid’a начинать сначала. |
Song |
|
Уже такое было, я даже коду постил вроде. |
Kostas |
|
что то не нашел я ничего… |
s-mike |
|
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. |
Kostas |
|
вот мой код:
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; Все правильно ищется, но вот как сделать так, чтобы при повторном нажатии кнопки поиск продолжадся, а не начинался сначала.. уже все варианты перепробовал |
Curve |
|
Full Member Рейтинг (т): 22 |
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; |
Song |
|
Kostas, запоминай позиции, на которых поиск остановился. |
Kostas |
|
хм.. я так пробовал, но у меня не получилось Видимо дело в break. Я выходил из цикла, используя exit. Попробую такой вариант, может прокатит |
Song |
|
Kostas, правильно. Делай хоть break, хоть Exit без разницы, если тебе нужно просто из цикла выйти. А потом после того как юзер нажмёт кнопку «Продолжить поиск» снова запускай свои циклы, начиная с переменных, которые ты запомнил. |
Kostas |
|
Не работает.. Слушайте, а как выделить несколько ячеек StringGrid’a? Может лучше мне за один раз все найденные ячейки выделять и не парится? Добавлено 09.12.04, 10:53 |
s-mike |
|
Цитата Kostas,9.12.04, 13:51 @ 07.01.70, 05:19 Слушайте, а как выделить несколько ячеек 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; Взято из дельфийского хелпа. |
_Art |
|
Senior Member Рейтинг (т): 14 |
Вопрос «вдогонку»: а как выделить ячейки в разных местах TStringGrid, например высвятить сразу все совпадения поиска? Спасибо |
Song |
|
Art4, Только если отрисоавывать «выделение» самому. |
J. Bravo |
|
Цитата Curve,8.12.04, 21:15 @ 07.01.70, 05:09
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;. Иначе мы будем всегда находить одно и то же значение.
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; Сообщение отредактировано: J. Bravo — 10.12.04, 00:08 |
Kostas |
|
в общем помучавшись я все же добился желаемого результата, однако он меня не устроил. Решил свою проблему совсем по другому: создал вторую форму, а на ней другой СтрингГрид для результатов поиска. Если кому интересно, то вот рабочий код для такого поиска (в ФАКе нету):
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; |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0700 ] [ 16 queries used ] [ Generated: 27.05.23, 08:50 GMT ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, DB; type TForm1 = class(TForm) SG1: TStringGrid; Label1: TLabel; Edit1: TEdit; Button1: TButton; SG2: TStringGrid; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin for i := 1 to 14 do begin SG1.Cells[0, i] := IntToStr(i); SG1.Cells[0, 0] := 'Номер'; Sg1.Cells[1, 0] := 'Фамилия'; SG1.Cells[2, 0] := 'Имя Отчество'; SG1.Cells[3, 0] := 'Стаж'; SG1.Cells[4, 0] := 'Образование'; SG1.Cells[1, 1] := 'Рассказова'; SG1.Cells[1, 2] := 'Блинков'; SG1.Cells[1, 3] := 'Наумов'; SG1.Cells[1, 4] := 'Семенов'; SG1.Cells[1, 5] := 'Крошечкина'; SG1.Cells[1, 6] := 'Рубинов'; SG1.Cells[1, 7] := 'Селиверстов'; SG1.Cells[1, 8] := 'Драгунов'; SG1.Cells[1, 9] := 'Ивашков'; SG1.Cells[1, 10] := 'Тарасов'; SG1.Cells[2, 1] := 'Елена Геннадьевна'; SG1.Cells[2, 2] := 'Семен Аркадьевич'; SG1.Cells[2, 3] := 'Александр Андреевич'; SG1.Cells[2, 4] := 'Николай Олегович'; SG1.Cells[2, 5] := 'Инна Николаевна'; SG1.Cells[2, 6] := 'Роман Петрович'; SG1.Cells[2, 7] := 'Михаил Анатольевич'; SG1.Cells[2, 8] := 'Игорь Николаевич'; SG1.Cells[2, 9] := 'Сергей Владимирович '; SG1.Cells[2, 10] := 'Павел Аркадьевич'; SG1.Cells[3, 1] := '9'; SG1.Cells[3, 2] := '5'; SG1.Cells[3, 3] := '7'; SG1.Cells[3, 4] := '6'; SG1.Cells[3, 5] := '4'; SG1.Cells[3, 6] := '2'; SG1.Cells[3, 7] := '8'; SG1.Cells[3, 8] := '5'; SG1.Cells[3, 9] := '3'; SG1.Cells[3, 10] := '7'; SG1.Cells[4, 1] := 'высшее'; SG1.Cells[4, 2] := 'среднее'; SG1.Cells[4, 3] := 'высшее'; SG1.Cells[4, 4] := 'высшее'; SG1.Cells[4, 5] := 'среднее'; SG1.Cells[4, 6] := 'высшее'; SG1.Cells[4, 7] := 'высшее'; SG1.Cells[4, 8] := 'среднее'; SG1.Cells[4, 9] := 'высшее'; SG1.Cells[4, 10] := 'высшее'; SG2.Cells[0, i] := IntToStr(i); SG2.Cells[0, 0] := 'Номер'; SG2.Cells[1, 0] := 'Фамилия'; SG2.Cells[2, 0] := 'Имя Отчество'; SG2.Cells[3, 0] := 'Стаж'; SG2.Cells[4, 0] := 'Образование'; end; end; procedure TForm1.Button1Click(Sender: TObject); var S : TStrings; St : String; i, Row, Col : Integer; begin //Индекс столбца, в котром будем проводить поиск. Col := 0; St := AnsiUpperCase( '<Искомый шаблон>' ); S := SG1.Cols[Col]; Row := -1; for i := SG1.FixedCols to S.Count - 1 do begin if Pos( St, AnsiUpperCase( S.Strings[i] ) ) > 0 then begin Row := i; Break; end; end; if Row > -1 then begin //Делаем так, чтобы найденная строка оказалась верхней видимой строкой. SG1.TopRow := Row; //Выделяем найденную ячейку. SG1.Selection := TGridRect( Rect(Col, Row, Col, Row) ); ShowMessage('Шаблон найден в строке с индексом: ' + IntToStr(Row)); end else begin ShowMessage('Шаблон не найден.'); end; end; end. |
Приветствую всех……. народ подскажите как сделать поиск в StringGrid.
Тоесть в Edit вводим строку и эта строка сравнивается с каждым значением стринггрида…
Если можно с кодом……..
За ранее благодарствую…..
2 ответа
Цитата:
Originally posted by Jes
Приветствую всех……. народ подскажите как сделать поиск в StringGrid.
Тоесть в Edit вводим строку и эта строка сравнивается с каждым значением стринггрида…
Если можно с кодом……..
За ранее благодарствую…..
Доступ к ячейке StringGrid1->Cells[номер_столбца][номер строки]
Код:
bool found = false;
for(int i = 0;i < StringGrid1->ColCount;i++)
{
for(int j = 0;j < StringGrid1->RowCount;j++)
if(StringGrid1->Cells[j] == Edit1->Text)
{
//нашли то че нужно
found = true;
break;
}
if(found) break;
}
496
14 февраля 2005 года
Jes
81 / / 28.03.2003
Цитата:
Originally posted by AlexandrVSmirno
Доступ к ячейке StringGrid1->Cells[номер_столбца][номер строки]
Код:
bool found = false;
for(int i = 0;i < StringGrid1->ColCount;i++)
{
for(int j = 0;j < StringGrid1->RowCount;j++)
if(StringGrid1->Cells[j] == Edit1->Text)
{
//нашли то че нужно
found = true;
break;
}
if(found) break;
}
.уже сделал..но всё равно сенкс…:)
fredi5 |
Здравствуйте все. |
||
|
RXL
Технический
|
Можно добавить столбец и задать ему нулевую ширину. В этом столбце расположить данные, по которым будет производится сортировка. Идея такая. |
||
… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |
fredi5 |
Я не совсем точно указал задачу. Первоначально в StringGrid из txt-файла загружается вся таблица. |
||
|
zubr
Гость |
1. Перенос строк от X до Y в начало таблицы: For i:=0 to Y-X do 2. Урезание таблицы до количества строк Y-X+1: StringGrid1.RowCount := Y-X+1; |
||
|
fredi5 |
Присваиваю переменным числовые значения меток. Не фурычит, ругается.. procedure TForm1.Button2Click(Sender: TObject); |
||
|
SEA |
Во первых, Чего это ты ассигнешь Массив Rows с элементом этого массива? Тут точно будет материться. |
||
почувствуй радость творческих мук! |
zubr
Гость |
1. StringGrid1.Rows[i].Assign(StringGrid1.Rows[i+X]); и StringGrid1.Rows.Assign(StringGrid1.Rows[i+X]); это 2 большие разницы, как говорят в Одессе. |
||
|
SEA |
Кажется, даже это не формулировка… Как-то все проще должно быть, только непонятно, как именно. |
||
почувствуй радость творческих мук! |
zubr
Гость |
SEA, это ты о чем? |
||
|
fredi5 |
Метки «004, 005» это и есть текстовые значения, расположенные на пустых строках в 1 колонке. Чую, что, наверно, придется методом поиска строк по метке «сверху — вниз» определять номера нужных |
||
|
zubr
Гость |
Зачем так сложно? Я же тебе уже дал направление к действиям. Вот все что тебе нужно: const procedure TForm1.Button1Click(Sender: TObject); |
||
|
fredi5 |
Отрицательный результат — тоже результат. В коде большой вопрос про судьбу данных. Они, как и |
||
|
zubr
Гость |
Покажи твой код. |
||
|
fredi5 |
//чтение текста в грид procedure TForm1.Button2Click(Sender: TObject); |
||
|
zubr
Гость |
fredi5 |
||
|
zubr
Гость |
fredi5, сдается мне, у тебя всего только 2 строки с данными метками и есть. Если так, то перебирай все строки, определишь индексы строк с метками и затем уже как я тебе еще в посте №3 показывал делай. |
||
|
fredi5 |
Из кода убрал автоформат колонок, чтобы не мешал. Файл урезан, но работает так-же. |
||
|
zubr
Гость |
fredi5, какие проблемы? Смотри мой пост №15 и предыдущие посты и делай. Это тебе домашнее задание. Все очень просто. Не надо никаких дополнительных текстовых файлов и дополнительных StringGrid. |
||
|