Auto-Filter wie in Excel?

Für Fragen von Einsteigern und Programmieranfängern...
Anfänger33
Beiträge: 20
Registriert: Sa 15. Feb 2025, 13:33

Auto-Filter wie in Excel?

Beitrag von Anfänger33 »

In Excel kann man mit Auto-Filter seine Daten in den Spalten sortieren.
Gibt es ein solche Funktion auch in Lazarus?

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Auto-Filter wie in Excel?

Beitrag von Mathias »

Meinst du in der IDE oder bei einer Liste in deinem Programm ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Auto-Filter wie in Excel?

Beitrag von theo »

Anfänger33 hat geschrieben: So 20. Apr 2025, 15:05 In Excel kann man mit Auto-Filter seine Daten in den Spalten sortieren.
Gibt es ein solche Funktion auch in Lazarus?
Da müsstest du schon sagen in welchem Zusammenhang.
"Einfach so" wohl eher nicht, aber mit SQL kann man alles filtern und sortieren.

Anfänger33
Beiträge: 20
Registriert: Sa 15. Feb 2025, 13:33

Re: Auto-Filter wie in Excel?

Beitrag von Anfänger33 »

Naja im fertigen Programm. Der User soll selbst die Filter einstellen können.

Beispiel:
Spalten Nachname, Vorname
Der User soll filtern können nach z.B. Nachname "Müller" und Vorname "Hans". Am Ende sollen nur die Namen "Müller" und "Hans" angezeigt werden.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Auto-Filter wie in Excel?

Beitrag von Mathias »

Beispiel:
Spalten Nachname, Vorname
Der User soll filtern können nach z.B. Nachname "Müller" und Vorname "Hans". Am Ende sollen nur die Namen "Müller" und "Hans" angezeigt werden.
GTK4 kann dies mit ColumnView und dem GTKSorter.
Ob die LCL auch sowas bietet, kann ich nicht sagen.

Soviel mir ist, kann dies TStringGrid, der LCL.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

paweld
Beiträge: 85
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Auto-Filter wie in Excel?

Beitrag von paweld »

Grüße / Pozdrawiam
paweld

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Auto-Filter wie in Excel?

Beitrag von corpsman »

Also in einer TStringgrid habe ich das bisher immer über die Rowhöhe gemacht (Beispiel aus dem FPC_DOOM WAD_Viewer:

Code: Alles auswählen

Procedure TForm1.Edit1Change(Sender: TObject);
Var
  c, i: Integer;
  s: String;
Begin
  StringGrid1.BeginUpdate;
  ClearOtherFilter(edit1);
  If Edit1.text = '' Then Begin
    For i := 1 To StringGrid1.RowCount - 1 Do Begin
      StringGrid1.RowHeights[i] := StringGrid1.RowHeights[0];
    End;
    c := StringGrid1.RowCount - 1;
  End
  Else Begin
    s := UpperCase(edit1.text);
    c := 0;
    For i := 1 To StringGrid1.RowCount - 1 Do Begin
      If pos(s, StringGrid1.Cells[IndexLumpName, i]) = 0 Then Begin
        StringGrid1.RowHeights[i] := 0;
      End
      Else Begin
        StringGrid1.RowHeights[i] := StringGrid1.RowHeights[0];
        c := c + 1;
      End;
    End;
  End;
  StringGrid1.EndUpdate();
  label2.caption := format('%d of %d lumps', [c, StringGrid1.RowCount - 1]);
End; 
Aber wenn's da nen eleganteren Weg gibt würde der mich auch interessieren ;)
--
Just try it

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Auto-Filter wie in Excel?

Beitrag von Mathias »

Dies ist ein Ansatz, wie man die Grid sortieren kann.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  grid: TStringGrid;
  y, x: integer;
begin
  grid := TStringGrid.Create(Self);
  grid.Parent := Self;

  grid.FixedCols := 0;
  grid.DoubleBuffered := True;
  grid.TitleFont.Style := [fsBold];
  grid.AlternateColor := clMoneyGreen;
  grid.ColumnClickSorts := True;

  grid.Align := alClient;
  grid.RowCount := 18;
  grid.ColCount := 4;

  for x := 0 to grid.ColCount - 1 do begin
    grid.Cells[x, 0] := 'Col' + IntToStr(x);

    for y := 1 to grid.RowCount - 1 do begin
      grid.Cells[x, y] := IntToStr(Random(100));
    end;
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

charlytango
Beiträge: 1058
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Auto-Filter wie in Excel?

Beitrag von charlytango »

wenn ich davon ausgehe dass dein "Grid" ein TDBGrid ist der per SQL mot Daten gefüllt wird, empfehhle ich mal den Tip von paweld : viewtopic.php?p=149752#p149752
Das Package kann noch viel mehr und ist recht gut konfigurierbar.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 281
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Auto-Filter wie in Excel?

Beitrag von h-elsner »

Für ein normales TStringGrid (welches ich sehr häufig benutze) gefällt mir die Idee mit der Zeilenhöhe sehr gut. Warum bin ich nicht darauf gekommen? Es läuft auch sehr schnell ab.
Weil ich das ab jetzt viel benutzen werde, habe ich das mal allgemeiner gefasst:

Code: Alles auswählen

function FilterColumn(var aGrid: TStringGrid;
                      const aCol: integer; aText: string): integer;
var
  i: integer;

begin
  result:=0;
  aGrid.BeginUpdate;
  try
    for i:=aGrid.FixedRows to aGrid.RowCount-1 do begin
      if aGrid.Cells[aCol, i]=aText then begin
        aGrid.RowHeights[i]:=aGrid.DefaultRowHeight;
        result:=result+1;
      end else
        aGrid.RowHeights[i]:=0;
    end;
  finally
    aGrid.EndUpdate;
  end;
end;

procedure ResetAllFilterColumn(var aGrid: TStringGrid);
var
  i: integer;

begin
  aGrid.BeginUpdate;
  try
    for i:=aGrid.FixedRows to aGrid.RowCount-1 do
      aGrid.RowHeights[i]:=aGrid.DefaultRowHeight;
  finally
    aGrid.EndUpdate;
  end;
end;


Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Auto-Filter wie in Excel?

Beitrag von fliegermichl »

h-elsner hat geschrieben: Mo 21. Apr 2025, 10:32 Für ein normales TStringGrid (welches ich sehr häufig benutze) gefällt mir die Idee mit der Zeilenhöhe sehr gut. Warum bin ich nicht darauf gekommen? Es läuft auch sehr schnell ab.
Weil ich das ab jetzt viel benutzen werde, habe ich das mal allgemeiner gefasst:
...
Kannst du mal ein Beispiel daraus machen und hier posten?

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 281
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Auto-Filter wie in Excel?

Beitrag von h-elsner »

Kannst du mal ein Beispiel daraus machen und hier posten?
Wie meinst du das? Wie man die function anwendet?

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 281
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Auto-Filter wie in Excel?

Beitrag von h-elsner »

Ein Beispielprojekt, so etwa?
TestFilterColumn.zip
(352.04 KiB) 114-mal heruntergeladen

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Auto-Filter wie in Excel?

Beitrag von fliegermichl »

h-elsner hat geschrieben: Mo 21. Apr 2025, 17:21 Ein Beispielprojekt, so etwa?
TestFilterColumn.zip

Danke für das Testprojekt. Irgendwie raffe ich das nicht. Oben stand beschrieben, daß da was mit der Zellenhöhe sei. Das hab ich nicht kapiert und auch aus dem Beispiel werde ich da nicht so richtig schlau draus. Möglicherweise habe ich grad einen kleinen Blackout im Kopf.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Auto-Filter wie in Excel?

Beitrag von corpsman »

Die Idee ist eigentlich recht einfach

In einer Stringgrid kannst du jeder Zeile eine Eigene "Höhe" in Pixeln geben.
Die Filterfunktion setzt die Höhe einer Zeile die nicht angezeigt werden soll auf 0
\-> der Mensch sieht sie nicht mehr, für den Rechner ist sie noch da, alle sind Glücklich und das Stringgrid wurde nicht "umsortiert" oder ähnliches.

Code: Alles auswählen

 aGrid.RowHeights[i]:=0;
 
Ich hatte das vor allem gepostet, weil ich sehen wollte ob es etwas besseres gibt, weil sich das für mich a bissl nach Missuse anfühlt, auch wenn es tadellos funktioniert ;)
--
Just try it

Antworten