Trier du grec dans une appli en code local français.

0/5 (2 avis)

Vue 3 060 fois - Téléchargée 505 fois

Description

Ce petit programme teste des procédures pour trier du grec dans une appli en code local français.

Principe :

Lors du tri français, tous les a accentués ou non sont regroupés, soit les caractères 65 92 192 ... 197 ... or la zone des caractères accentués est la zone utilisée pour afficher des caractères non latins;
Donc par exemple alpha et gamma sont triés indistinctement mais pas alpha accentué.

La manip consiste donc à modifier les chaînes juste dans la fonction comparative.
0n peut l'adapter au russe , etc

Source / Exemple :


unit triGreek;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    BtnTri: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    ListBox3: TListBox;
    RadioGroup1: TRadioGroup;
    RadioGroup2: TRadioGroup;
    Label1: TLabel;
    Label2: TLabel;
    procedure BtnTriClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure RadioGroup2Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;
  maj,typ:integer;
  a:string;

implementation

{$R *.dfm}
// constante de   psudo3 comme modele
const SansAccents : array[Char] of Char
             =  #0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15 +
                #16#17#18#19#20#21#22#23#24#25#26#27#28#29#30#31 +
                ' !"#$%&''()*+,-./0123456789:;<=>?' +
                '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'+
                '`abcdefghijklmnopqrstuvwxyz
                '€'#129'&#8218;&#402;&#8222;&#8230;&#8224;&#8225;&#710;&#8240;S&#8249;Œ'#141'Ž'#143#144'&#8216;&#8217;&#8220;&#8221;&#8226;&#8211;&#8212;&#732;&#8482;s&#8250;œ'#157'zY' +
                #160'¡¢£&#164;¥&#166;§&#168;©ª«¬*®¯°±²³&#180;µ¶·&#184;¹º»&#188;&#189;&#190;¿' +
                'AAAAAAÆCEEEEIIIIDNOOOOO×ØUUUUYÞß' +
                'aaaaaaæceeeeiiiidnooooo÷øuuuuyþy';
// tri greek_charset
const gcs : array[Char] of Char
             =  #0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15 +
                #16#17#18#19#20#21#22#23#24#25#26#27#28#29#30#31 +
                ' !"#$%&''()*+,-./0123456789:;<=>?' +
                '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'+
                '`abcdefghijklmnopqrstuvwxyz{
~'#127 + '€'#129'&#8218;&#402;&#8222;&#8230;&#8224;&#8225;&#710;&#8240;S&#8249;Œ'#141'Ž'#143#144'&#8216;&#8217;&#8220;&#8221;&#8226;&#8211;&#8212;&#732;&#8482;s&#8250;œ'#157'zY' + #160'¡¢£&#164;¥&#166;§&#168;©ª«¬*®¯°±²³&#180;µ¶·A<EHIOYW<ABCDEZHQIKLMNXOPR<STYFVUW'+ '<<aehi<abcdezhqiklmnxoprsstyfvuw<<oyw<'; //tri police greek const pg : array[Char] of Char = #0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15 + #16#17#18#19#20#21#22#23#24#25#26#27#28#29#30#31 + ' !"#$%&''()*+,-./0123456789:;<=>?' + '@ABCDEFGHIwKLMNOPQRSTUVWXYZ<<<<<<abcdefghisklmnopqrstuvwxyz'+ '<<<<<<<<iiiiiiiiiiizii<<<<<<<eeeeeeee<aaaaaaaaaaaaaaaaaaaaaa'+ '<rhhhhhhhhhhh<hhhhhhhhhhhoooooooouuuuuuuuuuuuuuowwwwwwwwwwwwwwwwwwwwweo<<'; function modifstring(const AText : String;t:integer) : string; var i:integer; p:pchar; begin Result:=AText; if Result='' then EXIT; //<<< p:=@Result[1]; if t>1 then for i:=1 to Length(Result) do begin case t of 2: p^:=gcs[p^]; 3: p^:=pg[p^]; end; inc(p); end; end; function TriListe(LaListe: TStringList; Index1, Index2: Integer): Integer; var s1, s2: string; begin // Chaines à comparer s1 := modifstring(LaListe[Index1],typ); s2 := modifstring(laListe[Index2],typ); // Valeur de retour pour classement a:=a+' / '+s1+'-'+s2; // juste pour test case typ of 1..3: if maj=0 then result:=AnsiCompareText(s1,s2) else result:=AnsiCompareStr(s1,s2) ; 0:begin if s1 > s2 then Result := 1 else if s1 < s2 then Result := -1 else Result := 0; end; end; end; procedure TForm1.BtnTriClick(Sender: TObject); var lstListe : TStringList; begin // Liste exemple lstListe := TStringList.Create; with listbox1 do begin lstListe.Assign(Items); lstListe.CustomSort(TriListe); Clear; Items.Assign(lstListe); end; with listbox2 do begin lstListe.Assign(Items); lstListe.CustomSort(TriListe); Clear; Items.Assign(lstListe); end; with listbox3 do begin lstListe.Assign(Items); lstListe.CustomSort(TriListe); Clear; Items.Assign(lstListe); end; // Libère les ressources lstListe.Clear; lstListe.Free; end; procedure TForm1.FormActivate(Sender: TObject); begin maj:=0; typ:=1; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin maj:=RadioGroup1.ItemIndex; BtnTriClick(sender); end; procedure TForm1.RadioGroup2Click(Sender: TObject); begin typ:=RadioGroup2.ItemIndex; BtnTriClick(sender); end; end.

Conclusion :


Limites :
Ordre alphabétique grec parfois malmené ; phi avant gamma ou zeta après omega ...
codage multi-octet non traité.

Test à optimiser un peu, beaucoup ...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
23 avril 2011

@cirec

J'avais posé la question des tris multilinguss dans les forum ; sans réponse satisfaisante, j'ai déposé cette source (qui marche très bien pour ce que je veux en faire), justement pour susciter des commentaires.

L'utilisation des comparestring est plus élégante, voire indispensable pour les langues codées sur 2 octets.
Mais
je suis en XP et certaines fonctions nécessitent Vista ou +
il faut mapper l'ordre (comment).

Bref, à moins d'un exemple complet en qq lignes, ça m'a l'air style pelleteuse là ou un simple plantoir me suffit (dans mon cas).
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,

est ce bien utile de modifier les caractères afin de pouvoir les trier !?

as tu vu ceci ?
http://msdn.microsoft.com/en-us/library/dd318144%28VS.85%29.aspx

normalement tout y est prévu ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.