Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать поиск с переходом в StringGrid? Собственно вопрос. 
V
    Опции темы
S@nderS
Дата 10.7.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.2.2007

Репутация: нет
Всего: нет



Вот вопрос, как в случае если мы обнаруживаем нужную нам ячейку, как к ней перейти?

Это сообщение отредактировал(а) S@nderS - 10.7.2008, 14:11
PM MAIL   Вверх
VICTAR
Дата 10.7.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Код

  StringGrid1.Col := X;
  StringGrid1.Row := Y;

PM MAIL   Вверх
S@nderS
Дата 10.7.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.2.2007

Репутация: нет
Всего: нет



Спасибо, вот это я тупица  smile   smile 
PM MAIL   Вверх
VICTAR
Дата 10.7.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Бывает  smile 
Пометь как решенный
PM MAIL   Вверх
S@nderS
Дата 11.7.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.2.2007

Репутация: нет
Всего: нет



Столкнулся с очередно проблемой. Все найденные ячейки я записываю в массив из записей

Код

type
 FCells = record
  Col: integer;
  Row: integer;
end;

....

var
FindArray: array[1..100] of FCells;

....



Затем я ищу в StringGrid искомые значения. 

Код

procedure Search(SG: TStringGrid; FindStr: string; OnlyWord: boolean);
var
i,j,counter: integer;
begin
  for i := 1 to 100 do
   begin
    FindArray[i].Col := 0;
    FindArray[i].Row := 0;
   end;
 counter := 1;
 if OnlyWord = True
  then
   begin
    for i := 0 to SG.ColCount do
     for j := 1 to SG.RowCount do
      begin
       if FindStr = SG.Cells[i,j]
        then
         begin
          FindArray[counter].Col := i;
          FindArray[counter].Row := j;
          Inc(counter);
         end;
      end;
   end
    else
     begin
      for i := 0 to SG.ColCount do
       for j := 1 to SG.RowCount do
        begin
         if pos(SG.Cells[i,j],FindStr) <> 0
         then
          begin
           FindArray[counter].Col := i;
           FindArray[counter].Row := j;
           Inc(counter);
          end;
        end;
     end;
end;


Затем при попытке перемещения по найденым ячейкам мне выдаёт EAccessViolation...

Поиск вверх по StringGrid:

Код

procedure TForm2.Button2Click(Sender: TObject);
begin
 if (Arrow >= 1) and (Arrow<=100) and (FindArray[Arrow].Col <> 0) and (FindArray[Arrow].Row <> 0)
 then Arrow := Arrow - 1;
 Form1.StringGrid1.Col := FindArray[Arrow].Col;
 Form1.StringGrid1.Row := FindArray[Arrow].Row;
end;


Поиск вниз по StringGrid:

Код

procedure TForm2.Button3Click(Sender: TObject);
begin
 if (Arrow >= 1) and (Arrow<=100) and (FindArray[Arrow].Col <> 0) and (FindArray[Arrow].Row <> 0)
 then Arrow := Arrow + 1;
 Form1.StringGrid1.Col := FindArray[Arrow].Col;
 Form1.StringGrid1.Row := FindArray[Arrow].Row;
end;



Где я косячу?
PM MAIL   Вверх
VICTAR
Дата 11.7.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Вообще у TStringGrid есть такое свойство Rows[Индекс] которое является TStrings. Соответственно поиск логичней осуществлять с помощью  TStrings.IndexOf().
PM MAIL   Вверх
S@nderS
Дата 11.7.2008, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.2.2007

Репутация: нет
Всего: нет



Цитата(VICTAR @ 11.7.2008,  11:32)
Вообще у TStringGrid есть такое свойство Rows[Индекс] которое является TStrings. Соответственно поиск логичней осуществлять с помощью  TStrings.IndexOf().

Спасибо. Если не получится так, как хочу я, то сделаю по вашему способу. 

И всё же, почему происходит эта ошибка?
PM MAIL   Вверх
VICTAR
Дата 12.7.2008, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Цитата(S@nderS @  11.7.2008,  23:22 Найти цитируемый пост)
И всё же, почему происходит эта ошибка? 

Потому что происходит выход за пределы массива вот здесь
Код

 Form1.StringGrid1.Col := FindArray[Arrow].Col;
 Form1.StringGrid1.Row := FindArray[Arrow].Row;

когда Arrow не принадлежит [1..100]
PM MAIL   Вверх
S@nderS
Дата 12.7.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.2.2007

Репутация: нет
Всего: нет



Уже и так его вертел, и так... IndexOf этот... В итоге психанул и забыл сохранить  smile  Как сделать поиск с помощью него? Подскажите пожалуйста, а то сейчас бошка рванёт. smile 

Это сообщение отредактировал(а) S@nderS - 12.7.2008, 01:40
PM MAIL   Вверх
THandle
Дата 12.7.2008, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Цитата(VICTAR @  11.7.2008,  14:32 Найти цитируемый пост)
Соответственно поиск логичней осуществлять с помощью  TStrings.IndexOf().


А если в StringGrid искомая строка встречается в одной строке несколько раз?

Тут IndexOf не подойдет... Или я еще не проснулся... Можно сделать как-нибудь так:


Код


type
  TCells = record
    Col: integer;
    Row: integer;
  end;

var
  FindArray: array of TCells;



На форме TStringGrid,TButton, TEdit, TMemo.

Просто для удобства.

Нажатие кнопки:
Код


procedure TForm1.Button1Click(Sender: TObject);
var
  i, j : integer;
  FindText : string;
  Count : integer;
begin
  Count := 0;
  FindText := Edit1.Text;
  SetLength(FindArray, StringGrid1.ColCount * StringGrid1.RowCount);
  for i := 0 to StringGrid1.RowCount - 1 do
    for j := 0 to StringGrid1.ColCount - 1 do
      if StringGrid1.Cells[j, i] = FindText then
        begin
          FindArray[Count].Col := j;
          FindArray[Count].Row := i;
          Inc(Count);
        end;
  SetLength(FindArray, Count - 1);
  for i := 0 to Length(FindArray) do
    Memo1.Lines.Add(IntToStr(FindArray[i].Col) + ', ' + IntToStr(FindArray[i].Row));
end;


Ищем текст, который введен в Edit, заносив все содержимое массива в Memo.
PM   Вверх
VICTAR
Дата 12.7.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Цитата(THandle @  12.7.2008,  05:40 Найти цитируемый пост)
А если в StringGrid искомая строка встречается в одной строке несколько раз?

Не совсем понял, что не устраивает.
Цитата

if StringGrid1.Cells[j, i] = FindText then

А вот так не советую строки сравнивать, для этого есть спец функции CompareStr(), CompareText() ect
PM MAIL   Вверх
diamondd
Дата 13.7.2008, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 11.9.2007

Репутация: нет
Всего: нет



хм.. а зачем вообще хранить найденные ячейки в массиве? если таблица будет большой, то каждый раз просматривать ее всю будет накладно. я набросал пример, посмотри.

кстати, реализовал почти все возможности поиска - с учетом регистра, поиск по фразе целиком, поиск вверх и вниз по таблице. 

Это сообщение отредактировал(а) diamondd - 13.7.2008, 09:23

Присоединённый файл ( Кол-во скачиваний: 87 )
Присоединённый файл  GridSearch.zip 4,63 Kb
PM MAIL   Вверх
S@nderS
Дата 16.7.2008, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.2.2007

Репутация: нет
Всего: нет



Цитата(diamondd @ 13.7.2008,  07:22)
хм.. а зачем вообще хранить найденные ячейки в массиве? если таблица будет большой, то каждый раз просматривать ее всю будет накладно. я набросал пример, посмотри.

кстати, реализовал почти все возможности поиска - с учетом регистра, поиск по фразе целиком, поиск вверх и вниз по таблице.

Спасибо большое. Я использовал часть твоей процедуры... 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.