Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2008, 12:51   #1
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию Поиск в TstringGrid

У меня есть процедурка поиска в Гриде с учетом выбранных опций:
Код:
procedure sgFindText(Grid: TStringGrid; const Text: String;
  FindOptions: TFindOptions);
var What, Where: String;
    ER, EC, NC, NR, I, J: Integer;

begin
  Ok:=False;
  if frMatchCase in FindOptions then
    What := Text
  else
    What := AnsiUpperCase(Text);
  with Grid do
  begin
     if frDown in FindOptions then
    begin
      NR := 1;
      NC := 1;
      ER := RowCount;
      EC := ColCount;
      if Col >= EC - 1 then
      begin
        I:=Row + 1;
        J:=FixedCols;
      end else
      begin
        I:=Row;
        J:=Col + 1;
      end;
    end else
    begin
      NR := -1;
      NC := -1;
      ER := -1;
      EC := -1;
      if Col <= EC + 1 then
      begin
        I:=Row - 1;
        J:=ColCount - 1;
      end else
      begin
        I:=Row;
        J:=Col - 1;
      end;
    end;
   while (I <> ER) and (not Ok) do
    begin
     while J <> EC do
      begin
        Where := Cells[J, I];
        if not (frMatchCase in FindOptions) then
          Where := AnsiUpperCase(Where);
        if frWholeWord in FindOptions then
        begin
          if What = Where then
          begin
            Row:=I; Col:=J;
            Ok:=True;
            Break;
          end;
        end
        else
          if Pos(What, Where) <> 0 then
          begin
            Row:=I; Col:=J;
            Ok:=True;
            Break;
          end;
         J:=J + NC;
      end;{while J}
      I:=I + NR;
      if EC = -1 then
        J:=ColCount - 1
      else
        J:=FixedCols;
     end; {while}
   end; {with}
 end;
Процедура работает нормально и выделяет строку, содержащую слово поиска, но проблема в том, что после нажатия "Найти далее" ничего не происходит ибо строка, содержащая шаблон поиска уже найдена. Помогите сделать толковый поиск, чтоб при повторном нажатии искалось следующее совпадение. row:=row+1; везде тыкал но чето результата не добился...

Последний раз редактировалось Dim0n; 03.07.2008 в 13:35.
Dim0n вне форума Ответить с цитированием
Старый 03.07.2008, 13:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: Код нужно оформлять тегом (#) - тогда читабельно будет.
Во-вторых: ТЫ в свою процедуру передавай номер строки с которой начнется поиск, потом когда процедура чет найдет, запоминай позицию найденного, и при следующем поиске эту позицию передавай )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.07.2008, 13:37   #3
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию

Stilet , а можно на пальцах?? Напиши примерчик плиз. Что в OnFind (TFindDialog) надо накатать?

Последний раз редактировалось Dim0n; 03.07.2008 в 13:42.
Dim0n вне форума Ответить с цитированием
Старый 03.07.2008, 14:13   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну если примерно прикинуть то можно вот так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var cl,rw:integer;
//********** FUNCTION **********
function fnd(col,row:integer;s:string):integer;
begin
 result:=row;
 if result<StringGrid1.RowCount-1 then
  while (result<StringGrid1.RowCount)and
   (pos(s,StringGrid1.Cells[col,result])=0) do
   inc(result);
  if Result>=StringGrid1.RowCount-1 then
   result:=StringGrid1.RowCount-1;
end;
//********** END FUNCTION ******  {}


begin
StringGrid1.MouseToCell(x,y,cl,rw);
if rw=0 then begin
 StringGrid1.Row:=fnd(cl,StringGrid1.Row+1,Edit1.Text);
end;
end;

end.
Здесь в эдит вводится искомый текст.
При клике по заголовку колонки в которой будет проходить поиск запустится функция поиска начиная с указанной строки.

Конечно пример не точный для твоего задания но смысл отражает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.07.2008, 15:31   #5
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию

Даже не знаю помог ты мне или еще больше запутал...
Stilet, напиши плиз как будет для случая с TFindDialog
Dim0n вне форума Ответить с цитированием
Старый 03.07.2008, 15:44   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

хм. Может и запутал.

Вот примерно так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    FindDialog1: TFindDialog;
    Button1: TButton;
    function fnd(col,row:integer;s:string):integer;
    procedure FindDialog1Find(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var cl,rw:integer;

  Form1: TForm1;

implementation

{$R *.dfm}
  //********** FUNCTION **********
function tform1.fnd(col,row:integer;s:string):integer;
begin
 result:=row;
 if result<StringGrid1.RowCount-1 then
  while (result<StringGrid1.RowCount)and
   (pos(s,StringGrid1.Cells[col,result])=0) do
   inc(result);
  if Result>=StringGrid1.RowCount-1 then
   result:=StringGrid1.RowCount-1;
end;
//********** END FUNCTION ******  {}

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
 StringGrid1.Row:=fnd(StringGrid1.Col,StringGrid1.Row+1,FindDialog1.FindText);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FindDialog1.Execute;
end;

end.
ТОлько тут будет искать только в текущей колонке. Но Искать далее должно работать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.07.2008, 15:50   #7
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию

Ага, пасибо в любом случае...пофтыкаю
Dim0n вне форума Ответить с цитированием
Старый 04.07.2008, 11:34   #8
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию

Разрыв мозга....
Stilet, не мог бы ты написать связку процедурки, которую я написал выше, с компонентом TFindDialog Пасиба зарание
Dim0n вне форума Ответить с цитированием
Старый 04.07.2008, 11:57   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вежливость - за вежливость. Могу.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    FindDialog1: TFindDialog;
    procedure sgFindText(Grid: TStringGrid; const Text: String;  FindOptions: TFindOptions);
        procedure FindDialog1Find(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
  procedure tform1.sgFindText(Grid: TStringGrid; const Text: String;
  FindOptions: TFindOptions);
var What, Where: String;
    ER, EC, NC, NR, I, J: Integer;
    ok:boolean;
begin   
  Ok:=False;
  if frMatchCase in FindOptions then
    What := Text   
  else   
    What := AnsiUpperCase(Text);   
  with Grid do   
  begin   
     if frDown in FindOptions then   
    begin   
      NR := 1;   
      NC := 1;   
      ER := RowCount;   
      EC := ColCount;   
      if Col >= EC - 1 then   
      begin   
        I:=Row + 1;   
        J:=FixedCols;   
      end else   
      begin   
        I:=Row;   
        J:=Col + 1;   
      end;   
    end else   
    begin   
      NR := -1;   
      NC := -1;   
      ER := -1;   
      EC := -1;   
      if Col <= EC + 1 then   
      begin   
        I:=Row - 1;   
        J:=ColCount - 1;   
      end else   
      begin   
        I:=Row;   
        J:=Col - 1;   
      end;   
    end;   
   while (I <> ER) and (not Ok) do   
    begin   
     while J <> EC do   
      begin   
        Where := Cells[J, I];   
        if not (frMatchCase in FindOptions) then   
          Where := AnsiUpperCase(Where);   
        if frWholeWord in FindOptions then   
        begin   
          if What = Where then   
          begin   
            Row:=I; Col:=J;   
            Ok:=True;   
            Break;   
          end;   
        end   
        else   
          if Pos(What, Where) <> 0 then   
          begin   
            Row:=I; Col:=J;   
            Ok:=True;   
            Break;   
          end;   
         J:=J + NC;   
      end;{while J}   
      I:=I + NR;   
      if EC = -1 then   
        J:=ColCount - 1   
      else   
        J:=FixedCols;   
     end; {while}   
   end; {with}   
 end;

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
  sgFindText(StringGrid1,FindDialog1.FindText,FindDialog1.Options);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FindDialog1.Execute;
end;

end.
О моск разрывается наверное потому что ты свою переменку Ok не описал ))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.07.2008, 15:13   #10
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию

тоесть ты просто дописал
Код:
procedure TForm1.FindDialog1Find(Sender: TObject);   
begin  
  sgFindText(StringGrid1,FindDialog1.FindText,FindDialog1.Options);   
end;
Больше никаких изменений. Это то я точно так же сделал. но при обнаружении объекта поиска, при следующем нажатии кнопки "Найти далее" поиска не происходит. пока вручную не выделить следующую строку.
OK вроде как можно было не описывать, зарезервированное слово.
Dim0n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кнопки в TStringGrid dimon000 Общие вопросы Delphi 4 29.07.2008 10:54
TStringGrid автопрокрутка Carbon Общие вопросы Delphi 5 08.03.2008 12:58
Помогите со TStringGrid Sanprof Общие вопросы Delphi 3 06.03.2008 16:20
TStringGrid Gromsky Компоненты Delphi 4 04.03.2008 23:41
TStringGrid mrandrey Компоненты Delphi 2 06.07.2007 15:24