![]() |
Stringgrid nach einem Begriff durchsuchen und....
Hallo
Wie kann ich in einem Stringgrid nach einem Begriff suchen und mir alle gefundenen Zeilen in einem neuen Stringgrid anzeigen lassen? Wäre soooo irre toll wenn mir jemadn dabei helfen kann. Gruss vom capo |
Re: Stringgrid nach einem Begriff durchsuchen und....
Suchst du ne ganze zeile oder ein Teil?
wenn du nach einer ganzen zeile suchst, kabbst du dir mal .IndexOf ansehen |
Re: Stringgrid nach einem Begriff durchsuchen und....
Hi
ich suche nach einem Begriff in einer ganzen Zeile. Es soll ein Adressprogramm werden und ich will halt alles Zeilen in denen der Begriff vorkommt in einem neuen Stringgrid anzeigen lassen. :) |
Re: Stringgrid nach einem Begriff durchsuchen und....
ich komme damit nicht weiter, hat jemand ein Beispielcode für mich?
capo |
Re: Stringgrid nach einem Begriff durchsuchen und....
Hallo
ich hab da was gefunden, allerdings weiss ich nicht wie ich alle Ergebnisse in ein anderes Stringgrid bekomme:
Delphi-Quellcode:
procedure TForm1.Button.Click(Sender: TObject);
var res: TPoint; finddlg: TFinddlg; findparams: TFindparams; begin FindDlg := TFindDlg.Create(self); try if (finddlg.Showmodal = mrOk) then begin findparams := []; if finddlg.Chkcase.Checked then findparams := findparams + [fnMatchCase]; if finddlg.Chkfull.Checked then findparams := findparams + [fnMatchFull]; if finddlg.Chkregular.Checked then findparams := findparams + [fnMatchRegular]; if finddlg.dir.itemindex = 1 then findparams := findparams + [fnDirectionLeftRight]; if finddlg.where.itemindex = 1 then findparams := findparams + [fnFindInCurrentCol]; if finddlg.where.itemindex = 2 then findparams := findparams + [fnFindInCurrentRow]; res := StringGrid1.findfirst(finddlg.findtext.text, findparams); if res.x >= 0 then begin StringGrid1.Col := res.x; StringGrid1.row := res.y; end else MessageDlg('Text not found', mtinformation, [mbOK], 0); end; finally FindDlg.free; end; end; |
Re: Stringgrid nach einem Begriff durchsuchen und....
Nabend ..,
Zitat:
|
Re: Stringgrid nach einem Begriff durchsuchen und....
Hallo, danke
das klappt bei einem gefundenen Eintrag gut.
Delphi-Quellcode:
Um weiter zu suchen verwende ich folgendes:
StringGrid2.Rows[0]:= StringGrid1.Rows[res.y];
Delphi-Quellcode:
Er schreibt ja so immer alles in
procedure TForm1.Button2Click(Sender: TObject);
var res:tpoint; begin res:=StringGrid1.findnext; if (res.x>=0) and (res.y>=0) then begin StringGrid1.Col:=res.x; StringGrid1.row:=res.y; // StringGrid2.Rows[0]:= StringGrid1.Rows[res.y]; end else MessageDlg('Text not found',mtinformation,[mbOK],0); end;
Delphi-Quellcode:
rein, er soll ja soviele neue Zeilen hinzufügen wie Ergebnisse vorhanden.
StringGrid2.Rows[0]
Magst du nochmal nachschauen? Gruss capo |
Re: Stringgrid nach einem Begriff durchsuchen und....
Hallo
mit dem code unten bekomme ich alle Suchergebnisse angezeigt, allerdings werden die viel zu oft angezeigt (ca 4-5x oder mehr), ich mach irgendetwas falsch. Ich denke es hat was mit dem StringGrid2.Rows[i] := StringGrid1.Rows[res.y]; zu tun nur weiß ich nicht wie ich das ändern muss. Grüsse capo
Delphi-Quellcode:
res := StringGrid1.findfirst(finddlg.findtext.text, findparams);
if res.x >= 0 then begin with StringGrid1 do begin for i := 1 to RowCount - 1 do // Alle Zeilen durchlaufen begin for j := 1 to ColCount - 1 do // Alle Spalten durchlaufen res := StringGrid1.findnext; if (res.x >= 0) and (res.y >= 0) then begin StringGrid1.Col := res.x; StringGrid1.row := res.y; Stringgrid2.RowCount := Stringgrid2.RowCount + 1; StringGrid2.Row := Stringgrid2.RowCount - 1; StringGrid2.Rows[i] := StringGrid1.Rows[res.y]; end; end; end; end else MessageDlg('Text not found', mtinformation, [mbOK], 0); end; finally FindDlg.free; end; end; |
Re: Stringgrid nach einem Begriff durchsuchen und....
Moin ... :)
vielleicht so
Delphi-Quellcode:
Ungetestet aber sollte so funktionieren!
...
StringGrid_neu.RowCount:= 1; res := StringGrid1.findfirst(finddlg.findtext.text, findparams); if res.x >= 0 then begin StringGrid1.Col := res.x; StringGrid1.row := res.y; // hier ins neue Stringgrid schreiben zb. StringGrid_neu.Rows[StringGrid_neu.RowCount]:= StringGrid1.Rows[res.y]; StringGrid_neu.RowCount:= StringGrid_neu.RowCount +1; // Zeile um 1 erhöhen end else MessageDlg('Text not found', mtinformation, [mbOK], 0); end; LG Mario |
Re: Stringgrid nach einem Begriff durchsuchen und....
Für mich sieht das alles irgendwie unnötig komplizierter aus, als es IMHO ist. Wieso reicht so was nicht ?
Delphi-Quellcode:
Das i läuft dabei durch alle Stringgrid-Zeilen und das j wird nach Bedarf (wenn die Funktion gefunden true ergibt) erhöht.
for i := 1 to Stringgrid1.RowCount do begin
if gefunden then begin Stringgrid2.Rows [j] := Stringgrid1.Rows[i]; j := j + 1; Stringgrid2.Rowcount := Stringgrid2.Rowcount; end; end; |
Re: Stringgrid nach einem Begriff durchsuchen und....
Hallo,
ja, meine ich auch, aber
Delphi-Quellcode:
:gruebel:
Stringgrid2.Rowcount := Stringgrid2.Rowcount;
Mein Vorschlag(s.a. Beitrag #2 mkinzler bzgl. IndexOf):
Delphi-Quellcode:
with StringGrid2 do
begin for i := Stringgrid1.FixedRows to Stringgrid1.RowCount-1 do if Stringgrid1.Rows[i].IndexOf('Suchbegriff') >-1 then begin Rows[RowCount-1] := Stringgrid1.Rows[i]; RowCount := RowCount+1; end; if RowCount > FixedRows+1 then Rowcount := Rowcount-1; end; |
Re: Stringgrid nach einem Begriff durchsuchen und....
Hallo Hansa,
wenn man sich auf das Wesentliche konzentriert, dann sieht der Code wirklich nicht sehr aufregend aus:
Delphi-Quellcode:
Hier noch das Unwesentliche für Grids ohne FixedCols:
procedure CopyRowsContaining(sg, sgResult: TStringGrid; search: String);
var i: Integer; begin ClearGrid(sgResult); with sg do for i := FixedRows to Pred(RowCount) do if AnsiContainsText(Rows[i].Text, search) then AppendRow(sgResult, Rows[i]); end;
Delphi-Quellcode:
Grüße vom marabu
procedure ClearGrid(sg: TSTringGrid);
var iCol: Integer; begin with sg do begin RowCount := Succ(FixedRows); for iCol := FixedCols to Pred(ColCount) do Cells[iCol, FixedRows] := ''; Tag := 0; // internal rowcount end; end; procedure AppendRow(sg: TStringGrid; s: TStrings); begin with sg do begin if Tag > 0 then RowCount := RowCount + 1; Rows[Pred(RowCount)].Assign(s); Tag := Succ(Tag); // internal rowcount end; end; |
Re: Stringgrid nach einem Begriff durchsuchen und....
Zitat:
|
Re: Stringgrid nach einem Begriff durchsuchen und....
Hallo und vielen Dank für euer Interesse.
Ich habs nun der einfachkeithalber so gemacht, bekomme aber immer nur ein Suchergebnis angezeigt auch wenn mehrere vorhanden sein müßten:
Delphi-Quellcode:
Wie ich das einbauen soll weiß ich überhaupt nicht:
procedure TForm1.Button5Click(Sender: TObject);
var res: TPoint; finddlg: TFinddlg; findparams: TFindparams; i, j: integer; begin FindDlg := TFindDlg.Create(self); try if (finddlg.Showmodal = mrOk) then begin findparams := []; if finddlg.Chkcase.Checked then findparams := findparams + [fnMatchCase]; if finddlg.Chkfull.Checked then findparams := findparams + [fnMatchFull]; if finddlg.Chkregular.Checked then findparams := findparams + [fnMatchRegular]; if finddlg.dir.itemindex = 1 then findparams := findparams + [fnDirectionLeftRight]; if finddlg.where.itemindex = 1 then findparams := findparams + [fnFindInCurrentCol]; if finddlg.where.itemindex = 2 then findparams := findparams + [fnFindInCurrentRow]; res := StringGrid1.findfirst(finddlg.findtext.text, findparams); if res.x >= 0 then begin with StringGrid1 do begin for i := 1 to RowCount - 1 do // Alle Zeilen durchlaufen begin for j := 1 to ColCount - 1 do // Alle Spalten durchlaufen begin Form3.Stringgrid2.RowCount := 1; res := StringGrid1.findfirst(finddlg.findtext.text, findparams); if res.x >= 0 then begin StringGrid1.Col := res.x; StringGrid1.row := res.y; Form3.Stringgrid2.Rows[Form3.Stringgrid2.RowCount] := StringGrid1.Rows[res.y]; Form3.Stringgrid2.RowCount := Form3.Stringgrid2.RowCount + 1; // Zeile um 1 erhöhen end; end; end; end; form3.ShowModal; end else MessageDlg('Keine Adresse gefunden', mtinformation, [mbOK], 0); end; finally end; end;
Delphi-Quellcode:
procedure CopyRowsContaining(sg, sgResult: TStringGrid; search: String);
var i: Integer; begin ClearGrid(sgResult); with sg do for i := FixedRows to Pred(RowCount) do if AnsiContainsText(Rows[i].Text, search) then AppendRow(sgResult, Rows[i]); end; |
Re: Stringgrid nach einem Begriff durchsuchen und....
Vielleicht so:
Delphi-Quellcode:
Bedenke, dass es bei meinem Ansatz um Vereinfachung geht. KISS - keep it small, simple! Was willst du mit einem FindDialog und zig Optionen, wenn du doch alle Treffer in einem zweiten Grid zeigen möchtest? Also ist mein Code als Ersatz und nicht als Erweiterung zu sehen.
procedure TForm1.Button5Click(Sender: TObject);
var s: String; begin s := ''; if InputQuery('Suchen nach ...', 'Suchtext', s) and (s <> '') then CopyRowsContaining(StringGrid1, StringGrid2, s); end; Freundliche Grüße |
Re: Stringgrid nach einem Begriff durchsuchen und....
Hallo marabu
ich habe dein beispiel gerade getestet:
Delphi-Quellcode:
erhalte folgende Fehler, magst du mir sagen was ich falsch mache?
procedure CopyRowsContaining(sg, sgResult: TStringGrid; search: String);
var i: Integer; begin ClearGrid(sgResult); with sg do for i := FixedRows to Pred(RowCount) do if AnsiContainsText(Rows[i].Text, search) then AppendRow(sgResult, Rows[i]); end; procedure TForm1.Button2Click(Sender: TObject); var s: String; begin s := ''; if InputQuery('Suchen nach ...', 'Suchtext', s) and (s <> '') then CopyRowsContaining(StringGrid1, Form3.StringGrid2, s); end; Zitat:
|
Re: Stringgrid nach einem Begriff durchsuchen und....
Das ist einfach: Die Prozeduren ClearGrid() und AppendRow() hatte ich in meinem Beitrag #12 beigefügt und die Funktion AnsiContainsText() steckt in der Unit StrUtils.
|
Re: Stringgrid nach einem Begriff durchsuchen und....
@marabu
das klappt *steinvomherzfall* ist das coool :) danke |
Re: Stringgrid nach einem Begriff durchsuchen und....
Zitat:
|
Re: Stringgrid nach einem Begriff durchsuchen und....
Zitat:
gn8 capo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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