![]() |
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:
aber irgendwie funzt das net. kann mir jemand weiterhelfen?
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; PS: Form1.Stringgrid1 ist das Stringgrid, aus dem die Daten kommen, Stringgrid1 ist das, in das die Zeilen kopiert werden sollen. |
Re: procedure Fehler (procedure zum Filtern eines Stringgrid
Der Pos-Befehl funktioniert andersrum: Erst der Substring, dann der lange.
|
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; |
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.
|
Re: procedure Fehler (procedure zum Filtern eines Stringgrid
:gruebel:
Ich habe mein Test SG mit diesen Daten gefüllt:
Delphi-Quellcode:
Und die Funktion dann so aufgerufen:
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;
Delphi-Quellcode:
Und es werden alle Zeilen kopiert in denen in einer Zelle die Zeichenfolge blubb vorkommt.
procedure TForm1.btn_CopySGRowsClick(Sender: TObject);
var foo: integer; begin foo := CopySGRows(StringGrid1, StringGrid2, 'blubb'); ShowMessage(IntToStr(foo)); end; |
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. |
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:
so ab:
if (Pos(aSearch, aSource.Rows[ndx].Text) > 0) then
Delphi-Quellcode:
bzw. ändere aSearch einmalig in klein Buchstaben:
if (Pos(AnsiLowerCase(aSearch), AnsiLowerCase(aSource.Rows[ndx].Text)) > 0) then
Delphi-Quellcode:
Dann muss aSearch nicht für jede Zeile neu "konvertiert" werden.
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; |
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 03:20 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