AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String-Suche in einem TStringGrid

Ein Thema von Alex_ITA01 · begonnen am 18. Nov 2005 · letzter Beitrag vom 18. Nov 2005
Antwort Antwort
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 08:07
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;
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 08:11
Hai Alex,

die Cols einer StringGrids sind doch vom Type TStrings. Also übergebe einen Parameter von diesem Typ und suche dann mit IndexOf.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#3

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 08:14
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#4

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 08:25
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#5

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 08:35
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#6

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 09:14
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#7

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 09:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#8

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 11:06
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: String-Suche in einem TStringGrid

  Alt 18. Nov 2005, 11:33
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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