Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi procedure Fehler (procedure zum Filtern eines Stringgrids) (https://www.delphipraxis.net/53925-procedure-fehler-procedure-zum-filtern-eines-stringgrids.html)

maximus Caesar 25. Sep 2005 15:11


procedure Fehler (procedure zum Filtern eines Stringgrids)
 
Hallo!
Ich versuche gerade eine Procedure zu schreiben, die alle Zellen eines StringGrid nach einem Stichwort durchsucht, und jede Zeile, in der es vorkommt in ein anderes Stringgrid kopiert.
Dies ist mein bisheriger TExt:
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var Zellen:Integer;
    i,i2,i3,i4:Integer;
    Zeilen:Integer;
    Daten:String;
begin
  i4:=0;
  Stringgrid1.ColCount:=Form1.StringGrid1.ColCount;
  StringGrid1.Rows[0]:=Form1.StringGrid1.Rows[0];
  StringGrid1.DefaultColWidth:=Form1.StringGrid1.DefaultColWidth;
  StringGrid1.RowCount:=1;
  Zellen:=Form1.StringGrid1.ColCount;
  Zeilen:=Form1.StringGrid1.RowCount;
  for i:=0 to Zeilen do begin
    i3:=0;
    for i2:=0 to Zellen do begin
      if pos(lowercase(Form1.StringGrid1.Cells[i2,i]),lowercase(Edit1.Text))<>0 then i3:=1;
    end;
   // showmessage(lowercase(Form1.StringGrid1.Cells[i2,i]));
   // showmessage(lowercase(Edit1.Text));
    if i3=1 then begin
      StringGrid1.RowCount:=StringGrid1.RowCount+1;
      i4:=i4+1;
      Stringgrid1.Rows[i4]:=Form1.StringGrid1.Rows[i];
      StringGrid1.FixedRows:=1;
    end;
  end;
aber irgendwie funzt das net. kann mir jemand weiterhelfen?

PS: Form1.Stringgrid1 ist das Stringgrid, aus dem die Daten kommen, Stringgrid1 ist das, in das die Zeilen kopiert werden sollen.

bttb930 25. Sep 2005 16:11

Re: procedure Fehler (procedure zum Filtern eines Stringgrid
 
Der Pos-Befehl funktioniert andersrum: Erst der Substring, dann der lange.

Sharky 25. Sep 2005 16:42

Re: procedure Fehler (procedure zum Filtern eines Stringgrid
 
Hai maximus Caesar,

da sowohl die Rows als auch die Cols eines StringGrids vom Typ TStrings sind und Du ja die gesamte Zeile prüfen möchtest ist es nicht notwendig eine extra Schleife für die einzelnen Zellen zu machen. Du kannst direkt StringGrid.Rows[n].Text prüfen.

Bei mir seiht der Code jetzt so aus:
Delphi-Quellcode:
function CopySGRows(aSource, aDest: TStringGrid; aSearch: string): integer;
var
  rowscopy: integer;
  ndx: integer;
begin
  rowscopy := 0;
  for ndx := aSource.FixedRows to Pred(aSource.RowCount) do // Alle Zeilen ausser den "Titeln" durchlaufen
  begin
    if (Pos(aSearch, aSource.Rows[ndx].Text) > 0) then // Wenn in der Zeile das Suchwort ist dann:
    begin
      Inc(rowscopy); // Anzahl der betroffenen Zeilen erhöhen
      aDest.RowCount := aDest.FixedRows + rowscopy; // Neue Zeile im Ziel SG erzeugen
      aDest.Rows[aDest.RowCount - 1].Text := aSource.Rows[ndx].Text; // Text aus der Source-Zeile in die Dest-Zeile
    end;
  end;
  Result := rowscopy;
end;

procedure TForm1.btn_CopySGRowsClick(Sender: TObject);
var
  foo: integer;
begin
  foo := CopySGRows(StringGrid1, StringGrid2, 'blubb');
  ShowMessage(IntToStr(foo));
end;

maximus Caesar 25. Sep 2005 16:48

Re: procedure Fehler (procedure zum Filtern eines Stringgrid
 
funktioniert leider auch nur mit einem Buchstaben. sobald ich mehr angebe, bekomme ich als Ergebniss 0, obwohl der gesuchte TExt vorkommt.

Sharky 25. Sep 2005 16:53

Re: procedure Fehler (procedure zum Filtern eines Stringgrid
 
:gruebel:

Ich habe mein Test SG mit diesen Daten gefüllt:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  x: integer;
  y: integer;
begin
  for y := StringGrid1.FixedRows to Pred(StringGrid1.RowCount) do
  begin
    for x := StringGrid1.FixedCols to Pred(StringGrid1.ColCount) do
    begin
      Stringgrid1.Cells[x, y] := Format('meow %d/%d', [x, y]);
    end;
  end;
  StringGrid1.Cells[1, 2] := 'blubb test';
  StringGrid1.Cells[2, 3] := 'blubb test';
  StringGrid1.Cells[4, 5] := 'blubb test';
end;
Und die Funktion dann so aufgerufen:
Delphi-Quellcode:
procedure TForm1.btn_CopySGRowsClick(Sender: TObject);
var
  foo: integer;
begin
  foo := CopySGRows(StringGrid1, StringGrid2, 'blubb');
  ShowMessage(IntToStr(foo));
end;
Und es werden alle Zeilen kopiert in denen in einer Zelle die Zeichenfolge blubb vorkommt.

maximus Caesar 25. Sep 2005 17:00

Re: procedure Fehler (procedure zum Filtern eines Stringgrid
 
was bewirkt die Formatierung?

ich habe in Zeile 1 in Zelle 3 "Gezahlt" stehen. Wenn ich nach g suche, so wird die Zeile kopiert, suche ich nach ge oder mehr buchstaben, sobekomme ich als ergebnis 0, und keine Zeile wird kopiert.

Sharky 25. Sep 2005 17:11

Re: procedure Fehler (procedure zum Filtern eines Stringgrid
 
Ahhh... jetzt ist alles Klar ;-)

Post berücksichtigt (entegegen manchen OnlineHilfen) die Gross/Kleinschreibung! Wenn Du unabhängig von dieser sein möchtest dann ändere diese Zeile:
Delphi-Quellcode:
if (Pos(aSearch, aSource.Rows[ndx].Text) > 0) then
so ab:
Delphi-Quellcode:
if (Pos(AnsiLowerCase(aSearch), AnsiLowerCase(aSource.Rows[ndx].Text)) > 0) then
bzw. ändere aSearch einmalig in klein Buchstaben:
Delphi-Quellcode:
begin
  aSearch := AnsiLowerCase(aSearch);
  for ndx := aSource.FixedRows to Pred(aSource.RowCount) do
  begin
    if (Pos(aSearch, AnsiLowerCase(aSource.Rows[ndx].Text)) > 0) then
.
.
end;
Dann muss aSearch nicht für jede Zeile neu "konvertiert" werden.

maximus Caesar 25. Sep 2005 17:17

Re: procedure Fehler (procedure zum Filtern eines Stringgrid
 
Super!!! :thumb:
Jetzt funktionierts!

Kann es sein, das lowercase nicht so richtig gut funktioniert?
Sonst hätte meine allererste procedure eigentlich funktionieren müssen... (ist nicht gepostet!)

PS: DAnn ist die bei Delphi mitgelieferte Hilfe fehlerhaft....


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 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