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;