Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stringgrid nach einem Begriff durchsuchen und.... (https://www.delphipraxis.net/80615-stringgrid-nach-einem-begriff-durchsuchen-und.html)

capo 12. Nov 2006 13:21


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

mkinzler 12. Nov 2006 13:31

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

capo 12. Nov 2006 13:43

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.
:)

capo 12. Nov 2006 13:58

Re: Stringgrid nach einem Begriff durchsuchen und....
 
ich komme damit nicht weiter, hat jemand ein Beispielcode für mich?
capo

capo 12. Nov 2006 16:47

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;

Hobby-Programmierer 12. Nov 2006 17:19

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Nabend ..,
Zitat:

Zitat von capo
Delphi-Quellcode:
...
  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[XX]:= StringGrid1.Rows[res.y];
   end else
    MessageDlg('Text not found', mtinformation, [mbOK], 0);
  end;

LG Mario

capo 12. Nov 2006 17:30

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Hallo, danke
das klappt bei einem gefundenen Eintrag gut.
Delphi-Quellcode:
StringGrid2.Rows[0]:= StringGrid1.Rows[res.y];
Um weiter zu suchen verwende ich folgendes:
Delphi-Quellcode:
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;
Er schreibt ja so immer alles in
Delphi-Quellcode:
 StringGrid2.Rows[0]
rein, er soll ja soviele neue Zeilen hinzufügen wie Ergebnisse vorhanden.
Magst du nochmal nachschauen?

Gruss capo

capo 12. Nov 2006 18:00

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;

Hobby-Programmierer 13. Nov 2006 08:57

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Moin ... :)
vielleicht so
Delphi-Quellcode:
...
  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;
Ungetestet aber sollte so funktionieren!
LG Mario

Hansa 13. Nov 2006 09:21

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:
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;
Das i läuft dabei durch alle Stringgrid-Zeilen und das j wird nach Bedarf (wenn die Funktion gefunden true ergibt) erhöht.

Lannes 13. Nov 2006 10:31

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Hallo,

ja, meine ich auch, aber
Delphi-Quellcode:
Stringgrid2.Rowcount := Stringgrid2.Rowcount;
:gruebel:

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;

marabu 13. Nov 2006 10:33

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:
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;
Hier noch das Unwesentliche für Grids ohne FixedCols:

Delphi-Quellcode:
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;
Grüße vom marabu

Hansa 13. Nov 2006 10:37

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Zitat:

Zitat von Lannes
ja, meine ich auch, aber
Delphi-Quellcode:
Stringgrid2.Rowcount := Stringgrid2.Rowcount;
:gruebel:

Das war in der Tat eine Nullnummer. :lol:

capo 13. Nov 2006 13:58

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:
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;
Wie ich das einbauen soll weiß ich überhaupt nicht:

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;

marabu 13. Nov 2006 14:37

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Vielleicht so:

Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var
  s: String;
begin
  s := '';
  if InputQuery('Suchen nach ...', 'Suchtext', s) and (s <> '') then
    CopyRowsContaining(StringGrid1, StringGrid2, s);
end;
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.

Freundliche Grüße

capo 13. Nov 2006 14:55

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Hallo marabu

ich habe dein beispiel gerade getestet:

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;
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;
erhalte folgende Fehler, magst du mir sagen was ich falsch mache?
Zitat:

Erzeugen
[Fehler] Unit1.pas(328): Undefinierter Bezeichner: 'ClearGrid'
[Fehler] Unit1.pas(331): Undefinierter Bezeichner: 'AnsiContainsText'
[Fehler] Unit1.pas(332): Undefinierter Bezeichner: 'AppendRow'
[Fataler Fehler] Unit1.pas(8): Verwendete Unit 'Unit1' kann nicht compiliert werden

marabu 13. Nov 2006 14:58

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.

capo 13. Nov 2006 15:58

Re: Stringgrid nach einem Begriff durchsuchen und....
 
@marabu
das klappt *steinvomherzfall*
ist das coool :)
danke

Hansa 13. Nov 2006 16:26

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Zitat:

Zitat von capo
Ich habs nun der einfachkeithalber so gemacht, bekomme aber immer nur ein Suchergebnis angezeigt auch wenn mehrere vorhanden sein müßten:

Delphi-Quellcode:
for j := 1 to ColCount - 1 do // Alle Spalten durchlaufen
            begin
              Form3.Stringgrid2.RowCount := 1;

Siehst du es selber ? Seltener Fall, auf Anhieb einen Fehler in (fast) unbekannem Source zu entdecken. 8) Das ganze Programm-Umfeld erscheint mir immer noch zu kompliziert.

capo 13. Nov 2006 23:24

Re: Stringgrid nach einem Begriff durchsuchen und....
 
Zitat:

Zitat von Hansa
Siehst du es selber ?

jepp, das kann so ja nicht funktionieren :oops:
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