user763539
user763539

Reputation: 3699

cxGrid Unicode sorting

How can you get cxGrid to preform sorting in Latin-2 (ISO-8859-2) encoding ?

I don't want the grid to be dependent on the regional settings of Windows. Problem is that I am in Slovenia but I need sorting in Croatian language. (Right now Ć,Č,Š are not sorted properly)

Can it be done ?

Upvotes: 2

Views: 681

Answers (1)

Mads Boyd-Madsen
Mads Boyd-Madsen

Reputation: 167

You could hook the OnCompare-event exposed by the DataController of the DBTableView for the cxGrid and implement the handler something like this:

procedure TMyForm.cxGrid1DBTableView1DataControllerCompare( 
                ADataController: TcxCustomDataController;
                ARecordIndex1, ARecordIndex2, AItemIndex: Integer;
                const V1, V2: Variant;
                var Compare: Integer );
var
  S1, S2       : String;
  CompareResult: Integer;

begin
  S1 := V1;
  S2 := V2;
  CompareResult := CompareStringW( LANG_CROATIAN, 0, pWideChar( S1 ), -1,
                                                     pWideChar( S2 ), -1 );
  case CompareResult of
    CSTR_LESS_THAN    : Compare := -1;
    CSTR_EQUAL        : Compare := 0;
    CSTR_GREATER_THAN : Compare := 1;
  end;
end;

If S1 = 'Ć,Č,Š' and S2 = 'Č,Ć,Š' then S1 > S2, which I think is what is expected. If you switch to LOCALE_NEUTRAL you get the opposite result.

Care should be taken when casting V1 and V2 to strings as not all columns may cast in the desired way. Dates - for example - might need special treatment.

Also note, that CompareStringW return 0 if the function fails. A full implementation may have to deal with this.

Upvotes: 2

Related Questions