TStringgrid : Sortieren nach zwei Spalten

Für Fragen von Einsteigern und Programmieranfängern...

TStringgrid : Sortieren nach zwei Spalten

Beitragvon malabarista » 10. Mär 2017, 10:25 TStringgrid : Sortieren nach zwei Spalten

Ist es möglich ein TStringgrid so einzustellen, dass er nach zwei Spalten sortiert.
Z.B. erst nach Spalte 1 sortieren und bei gleichen Einträgen in Spalte 1 dann nach Spalte 2 sortieren.

Beispiel
Code: Alles auswählen
 
Beilagen    Nudeln
Beilagen    Kartoffeln
Fisch       Zander
 

Im Beispiel sollte die 2.Zeile eigentlich als 1.Zeile stehen. Weil ich aber nur über die 1.Spalte sortieren kann, gibt es solche falschen Sortierungen.

Ich hoffe, mein Problem ist verständlich dargestellt.
malabarista
 
Beiträge: 216
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 10. Mär 2017, 10:48 Re: TStringgrid : Sortieren nach zwei Spalten

Ich nehme an, du musst dich in das OnCompareCells-Ereignis reinhängen, das die Spalten/Zeilen-Indices von zwei zu vergleichenden Zellen als Parameter hat: Wenn die erste Zelle "größer" ist als die zweite, also in der Sortierung "hinter" der zweiten kommen soll, muss der Eventhandler einen Wert > 0 zurückgeben, bei Gleichheit 0, und bei umgekehrter Reihenfolge einen Wert < 0.

OnCompareCells wird von der eingebauten Sort-Routine aufgerufen und hat als Spaltenindex der beiden Vergleichszellen immer den Index der zu sortierenden Spalte. In deinem Fall musst zu zusätzlich auch noch der Inhalt der alternativen Spalte suchen und zum Vergleich heranziehen, falls der Vergleich der primären Spalte den Funktionswert 0 ergibt. Und wenn die Eigenschaft SortOrder auf soDescending (abwärts) steht, dann drehst du einfach das Vorzeichen der Funktion um.

Etwa so, ungetestet:
Code: Alles auswählen
uses
  LazUTF8;
 
function TForm1.StringGrid1CompareCells((Acol, ARow, Bcol, BRow: Integer): Integer;
const
  SecCol = 1// Spaltenindex zu verwenden bei Gleichheit
var
  sa, sb: String;
begin
  sa := StringGrid1.Cells[ACol, ARow);
  sb := StringGrid1.Cells[BCol, BRow);
  Result := UTF8CompareText(sa, sb);
  if Result = 0 then begin
    sa := StringGrid1.Cells[SecCol, ARow];
    sb := StringGrid1.Cells[SecCol, BRow];
    Result := UTF8CompareText(sa, sb);
  end;
  if StringGrid1.SortOrder = soDescending then Result := -Result;
end;
wp_xyz
 
Beiträge: 2183
Registriert: 8. Apr 2011, 08:01

Beitragvon malabarista » 10. Mär 2017, 16:53 Re: TStringgrid : Sortieren nach zwei Spalten

ja, verstanden. ok. Danke
malabarista
 
Beiträge: 216
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: Timm Thaler und 2 Gäste

porpoises-institution
accuracy-worried