На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Поиск в StringGrid , не такой, как обычно
    Вообщем есть edit и кнопка. По нажатию на кнопку нужно искать текст из edit'a по всем ячейкам StringGrid, и при нахождении таковой - выделять строку, содержащую эту ячейку. При повторном нажатии кнопки нужно продолжать поиск, а не начинать его сначала. Поиск должен быть без учета регистра, не обязательно точное совпадение, сверху вниз и при достижении конца StringGrid'a начинать сначала.
    Например: ищем текст 'кОМпьЮ' - должна найтись строка, содержащая ячейку 'Компьютер'. Надеюсь вам понятно и вы мне поможите.
      Уже такое было, я даже коду постил вроде.
        что то не нашел я ничего...
          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.
            вот мой код:
            ExpandedWrap disabled
              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;

            Все правильно ищется, но вот как сделать так, чтобы при повторном нажатии кнопки поиск продолжадся, а не начинался сначала.. уже все варианты перепробовал :wall:
              Kostas, сохраняй i и j в отдельные глобальные переменные - i1 и j1 (для начала присвой им по нулю). тогда у тебя получится:
              ExpandedWrap disabled
                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;
                Kostas, запоминай позиции, на которых поиск остановился.
                  хм.. я так пробовал, но у меня не получилось :) Видимо дело в break. Я выходил из цикла, используя exit. Попробую такой вариант, может прокатит
                    Kostas, правильно. Делай хоть break, хоть Exit без разницы, если тебе нужно просто из цикла выйти. А потом после того как юзер нажмёт кнопку "Продолжить поиск" снова запускай свои циклы, начиная с переменных, которые ты запомнил.
                      Не работает.. Слушайте, а как выделить несколько ячеек StringGrid'a? Может лучше мне за один раз все найденные ячейки выделять и не парится?

                      Добавлено
                      Может я чего-то неправильно делаю.. можете кинуть исходничек с реализацией этого поиска?
                        Цитата Kostas,9.12.04, 13:51 @
                        Слушайте, а как выделить несколько ячеек StringGrid'a?

                        ExpandedWrap disabled
                          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;

                        Взято из дельфийского хелпа.
                          Вопрос "вдогонку": а как выделить ячейки в разных местах TStringGrid, например высвятить сразу все совпадения поиска? Спасибо
                            Art4, Только если отрисоавывать "выделение" самому.
                              Цитата Curve,8.12.04, 21:15 @
                              ExpandedWrap disabled
                                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.

                              ExpandedWrap disabled
                                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 -
                                в общем помучавшись я все же добился желаемого результата, однако он меня не устроил. Решил свою проблему совсем по другому: создал вторую форму, а на ней другой СтрингГрид для результатов поиска. Если кому интересно, то вот рабочий код для такого поиска (в ФАКе нету):
                                ExpandedWrap disabled
                                  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 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0717 ]   [ 16 queries used ]   [ Generated: 27.09.24, 01:33 GMT ]