Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi String-Suche in einem TStringGrid (https://www.delphipraxis.net/57272-string-suche-einem-tstringgrid.html)

Alex_ITA01 18. Nov 2005 08:07


String-Suche in einem TStringGrid
 
Guten Morgen erstmal,
ich habe folgende Frage:
Mit diesem Code kann ich in bestimmten Col's ein String suchen. Das geht ja soweit auch gut nur meine Frage ist, wie müsste ich den Source umschreiben, damit ich kein "array of Cols" übergeben muss sondern er alle Col's durchsucht?!
Ich hoffe ihr wisst was ich meine...
MFG Alex

Delphi-Quellcode:
function SeekRecord(Grid: TStringGrid; ColOrder: array of integer; StrList: array of String): Boolean;
var
  I, J : Integer;
begin
  result := false;
  for I := 1 to Grid.RowCount - 1 Do
  begin
    for J := low(ColOrder) to high(ColOrder) do
    begin
      if (Grid.Cells[ColOrder[J],I]=StrList[J]) then
         result := true
      else
         result := false;
      if result = false then break;
    end;
    if result = true then break;
  end;

  {if result = true then
     Grid.Row := I
  else
     ShowMessage('Datensatz nicht gefunden!' +#13#13+ 'Record not Found!');}
end;

Sharky 18. Nov 2005 08:11

Re: String-Suche in einem TStringGrid
 
Hai Alex,

die Cols einer StringGrids sind doch vom Type TStrings. Also übergebe einen Parameter von diesem Typ und suche dann mit IndexOf.

Alex_ITA01 18. Nov 2005 08:14

Re: String-Suche in einem TStringGrid
 
stimmt, könnte ich machen.
Hätte mich nur dafür interessiert, wie ich die obrige Funktion umschreiben hätte müssen.
Trotzdem Danke @Sharky!

MFG Alex

Sharky 18. Nov 2005 08:25

Re: String-Suche in einem TStringGrid
 
Hai Alex,

meinst Du das so:
Delphi-Quellcode:
function SeekRecord(aCols: TStrings; aKey: string): integer;
begin
  Result := aCols.IndexOf(aKey);
end;

procedure TDemoForm.btn_SeekClick(Sender: TObject);
var
  foo: integer;
begin
  foo := SeekRecord(StringGrid1.Cols[1], 'blubb');
  if foo = -1 then
  begin
    StringGrid1.Row := foo;
  end
  else
  begin
    ShowMessage('Datensatz nicht gefunden');
  end;
end;

Alex_ITA01 18. Nov 2005 08:35

Re: String-Suche in einem TStringGrid
 
Ich meine das so:
Ich will mehrere Strings (array of String) in eine Suchfunktion übergeben und ich will als Result eine Art Liste, wo alle Zeilen drin stehen wo der/die String('s) vorkommen.
MFG Alex

Alex_ITA01 18. Nov 2005 09:14

Re: String-Suche in einem TStringGrid
 
Ich wollte es jetzt so lösen aber das geht nicht:

Delphi-Quellcode:
function GridSuche(Grid: TStringGrid; StrList: array of String; var AList: TStringList): Boolean;
var
  I, J : Integer;
begin
  Result := False;
  AList.Clear;
  AList.Duplicates := dupIgnore;
  for i := 1 to Grid.RowCount - 1 do
  begin
    for j := 1 to Grid.ColCount - 1 do
    begin
      if (Grid.Cells[j,i] = StrList[j]) then
      begin
        AList.Add(IntToStr(i));
      end;
    end;
  end;
end;
Könnt ihr mir bitte irgendwie helfen.
Ich will, dass das Array of String durchsucht wird und alle Zeilen wieder zurückgibt, wo auch alle Strings aus dem Array gefunden wurden.
MFG Alex

Thanatos81 18. Nov 2005 09:27

Re: String-Suche in einem TStringGrid
 
Wenn du i und j schon für row und col brauchst und nicht nur nach einem String sucht brauchst du noch einen weiteren Zähler:
Delphi-Quellcode:
procedure GridSuche(Grid: TStringGrid; StrList: array of String; var AList: TStringList);
var
  I, row, col : Integer;
begin
  AList.Clear;
  AList.Duplicates := dupIgnore;
  for row := 1 to Grid.RowCount - 1 do
  begin
    for col := 1 to Grid.ColCount - 1 do
    begin
      for i := low(StrList) to high(StrList) do
      begin
        if (Grid.Cells[col,row] = StrList[i])
          then AList.Add(IntToStr(row));
      end;
    end;
  end;
end;
Sehr perfomant wird das ganze aber nicht sein. Da du nur die Zeile speicherst denke ich mal, dass die Spalte bekannt ist, oder? Wenn ja, durchsuche nur diese Spate, das spart ne ganze Zeit, da der obige Algo sonst sehr langsam ist. Achja, deine Funktion würde übrigens immer false zurückgeben, deswegen hab ich mal ne Prozedur draus gemacht ;-)

Sharky 18. Nov 2005 11:06

Re: String-Suche in einem TStringGrid
 
Ich habe es jetzt mal so gemacht:
Delphi-Quellcode:
procedure SeekRecords(aFixedRows: integer; aCols: TStrings; aKeys: TStrings;
  aSeekList: TList);
var
  keyindex: integer;
  searchindx: integer;
begin
  for keyindex := 0 to Pred(aKeys.Count) do
  begin
    for searchindx := aFixedRows to Pred(aCols.Count) do
    begin
      if (aKeys[keyindex] = aCols[searchindx]) then
      begin
        aSeekList.Add(Pointer(searchindx));
      end;
    end;
  end;
end;

procedure TDemoForm.btn_SeekClick(Sender: TObject);
var
  seeklist: TList;
  searchkeys: TStringList;
  ndx: integer;
begin
  searchkeys := TStringList.Create;
  seeklist := TList.Create;
  try
    searchkeys.Add('blubb');
    SeekRecords(StringGrid1.FixedRows, StringGrid1.Cols[1], searchkeys, seeklist);
    if seeklist.Count = 0 then
    begin
      ShowMessage('Datensatz nicht gefunden');
    end
    else
    begin
      lb_ListBox1.Clear;
      for ndx := 0 to Pred(seeklist.Count) do
      begin
        lb_ListBox1.Items.Add(IntToStr(integer(seeklist.Items[ndx])));
      end;
    end;
  finally
    seeklist.Free;
    searchkeys.Free;
  end;
end;

marabu 18. Nov 2005 11:33

Re: String-Suche in einem TStringGrid
 
Hi Alex,

ich spendiere dir diese Routine aus meiner code library, mit der du einiges anstellen kannst, wenn du weißt wie. Gesucht wird nach text und wenn das Ergebnis true ist, dann steht in gc die Gitterkoordinate der Zelle, die den Suchtext enthält. Über den letzten Parameter steuere ich bei interaktivem Einsatz, ob zuerst in der Reihe oder der Spalte gesucht werden soll:

Delphi-Quellcode:
function FindNextCell(sg: TStringGrid; text: string; var gc: TGridCoord;
  searchColBeforeRow: boolean = true): boolean;
var
  gr: TGridRect;
  gcStart: TGridCoord;
begin
  with sg do
  begin
    gc := TGridCoord(Point(Col, Row));
    gcStart := gc;
    if (Selection.TopLeft.X = Selection.BottomRight.X)
    and (Selection.TopLeft.Y = Selection.BottomRight.Y)
      then gr := TGridRect(Rect(FixedCols, FixedRows, Pred(sg.ColCount), Pred(sg.RowCount)))
      else gr := Selection;
    repeat
      if searchColBeforeRow then
      begin
        gc.X := FixedCols + (Succ(gc.X - FixedCols) mod (ColCount - FixedCols));
        if gc.X = gr.Left then
          gc.Y := FixedRows + (Succ(gc.Y - FixedRows) mod (RowCount - FixedRows));
      end else
      begin
        gc.Y := FixedRows + (Succ(gc.Y - FixedRows) mod (RowCount - FixedRows));
        if gc.Y = gr.Top then
          gc.X := FixedCols + (Succ(gc.X - FixedCols) mod (ColCount - FixedCols));
      end;
      Result := Pos(text, Cells[gc.X, gc.Y]) > 0;
    until Result or (gc.X = gcStart.X) and (gc.Y = gcStart.Y);
  end;
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz