![]() |
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; |
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. |
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 |
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; |
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 |
Re: String-Suche in einem TStringGrid
Ich wollte es jetzt so lösen aber das geht nicht:
Delphi-Quellcode:
Könnt ihr mir bitte irgendwie helfen.
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; 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 |
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:
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 ;-)
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; |
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; |
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:
Grüße vom marabu
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz