TStringgrid: Sortierung

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

TStringgrid: Sortierung

Beitrag von malabarista »

Ich möchte ein TStringgrid sortieren . Das funktioniert mit SortColRow.
Nun habe ich aber Spalten mit Integerzahlen und Spalten mit Strings.
Ich weiss, man kann die eigene Sortierung einstellen über
OnCompareCDells
Da muss ich dann entscheiden je nach Spalte wie sortiert wird.
Ich denke, so eine Unterscheidung innerhalb des Sortier-Algorithmus verlangsamt diesen.

ABER geht es auch anders ?
Ich möchte sagten :
if spalte=3 then onCompareCells=integer-sort;
if spalte=1 then onCompareCells=SortColRow;

Oder denke ich da völlig falsch ?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TStringgrid: Sortierung

Beitrag von m.fuchs »

malabarista hat geschrieben:Da muss ich dann entscheiden je nach Spalte wie sortiert wird.
Ich denke, so eine Unterscheidung innerhalb des Sortier-Algorithmus verlangsamt diesen.

Ja, das wird etwas langsamer. Aber warum stört dich das? Hast du ein akutes Problem mit der Geschwindigkeit? Um wieviele Zeilen handelt es sich?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringgrid: Sortierung

Beitrag von wp_xyz »

Der Sortiervorgang wird ja durch irgendeine Aktion angestoßen, z.B. einen Button-Click oder MenuItem-Click. Weise hier dem onCompareCells-Event des StringGrid die entsprechende Routine zu. Etwa so (ungetestet):

Code: Alles auswählen

procedure TForm1.StringGrid1CompareCellsAsNumber(Sender: TObject;
  ACol, ARow, BCol, BRow: Integer; var Result: integer);
begin
  Result := CompareValue(StrToInt(AStringGrid1.Cells[ACol, ARow]), StrToInt(AStringGrid1.Cells[BCol, BRow]));
end;
 
procedure TForm1.StringGrid1CompareCellsAsText(Sender: TObject;
  ACol, ARow, BCol, BRow: Integer; var Result: integer);
begin
  Result := CompareText(AStringGrid1.Cells[ACol, ARow], AStringGrid1.Cells[BCol, BRow]);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  SortCol: Integer;
begin
  if Sender = BtnSpalte3Sortieren then begin
    SortCol := 3;
    StringGrid1.OnCompareCells := @StringGrid1CompareCellsAsNumber
  end else
  if Sender = BtnSpalte1Sortieren then begin
    SortCol := 1;
    StringGrid1.OnCompareCells := @StringGrid1CompareCellsAsText;
  end else
    raise Exception.Create('Unbekannte Sortier-Aktion');
  StringGrid1.SortColRow(true, SortCol);
end;

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TStringgrid: Sortierung

Beitrag von malabarista »

@wp_xyz: genau das habe ich gesucht !
Danke !

Antworten