2010-11-02 42 views
1

Si vous avez une application VCL non-thématique et non Unicode avec un TEdit "TestEdit" et que vous définissez TestEdit.Font.Charset sur RUSSIAN_CHARSET TestEdit affiche des caractères cyrilliques . Si toutefois vous changez l'application pour utiliser les thèmes cela ne fonctionne plus. Essayez ce qui suit pour voir ceci:Comment faire pour que Edit1.Font.Charset fonctionne avec des thèmes (styles visuels)

  1. Créez une nouvelle application VCL.
  2. Fermez l'unité 1 par défaut sans enregistrer.
  3. Remplacez le code source du projet (Project1.pas) par le code situé au bas de cette publication et enregistrez-le sous la forme CharsetTest.pas.
  4. Désélectionnez le thème d'exécution dans les options du projet.
  5. Exécutez le programme, cliquez sur les cases d'option, regardez la boîte d'édition 'police.
  6. Maintenant, vérifiez le thème d'exécution dans les options du projet ou ajoutez XPMan à la clause uses.
  7. Répétez l'étape 5.

Ma question est: Y at-il un moyen de rendre l'application honorer le charset même lorsque le thème? (Sans le passage à Unicode.)

program CharsetTest; 

uses 
    Windows, 
    Classes, 
    Graphics, 
    Controls, 
    Forms, 
    Dialogs, 
    StdCtrls, 
    ExtCtrls; 

{$R *.res} 

type 
    TForm1 = class(TForm) 
    private 
    CharsetRadioGroup: TRadioGroup; 
    TestEdit: TEdit; 
    procedure CharsetRadioGroupClick(Sender: TObject); 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

constructor TForm1.Create(AOwner: TComponent); 
begin 
    inherited CreateNew(AOwner); 

    BorderWidth := 8; 
    Caption := 'Charset Test'; 
    ClientHeight := 180; 
    ClientWidth := 250; 

    CharsetRadioGroup := TRadioGroup.Create(Self); 
    CharsetRadioGroup.Name := 'CharsetRadioGroup'; 
    CharsetRadioGroup.Height := 105; 
    CharsetRadioGroup.Align := alTop; 
    CharsetRadioGroup.Caption := 'Charset'; 
    CharsetRadioGroup.Parent := Self; 
    CharsetRadioGroup.Items.Add('Default'); 
    CharsetRadioGroup.Items.Add('Russian'); 
    CharsetRadioGroup.Items.Add('Greek'); 
    CharsetRadioGroup.OnClick := CharsetRadioGroupClick; 

    TestEdit := TEdit.Create(Self); 
    TestEdit.Name := 'TestEdit'; 
    TestEdit.Align := alBottom; 
    TestEdit.Font.Size := 20; 
    TestEdit.Font.Name := 'Courier New'; 
    TestEdit.Text := 'äöüÄÖÜß'; 
    TestEdit.Parent := Self; 

    CharsetRadioGroup.ItemIndex := 1; 
end; 

procedure TForm1.CharsetRadioGroupClick(Sender: TObject); 
begin 
    case CharsetRadioGroup.ItemIndex of 
    0: 
     TestEdit.Font.Charset := DEFAULT_CHARSET; 
    1: 
     TestEdit.Font.Charset := RUSSIAN_CHARSET; 
    2: 
     TestEdit.Font.Charset := GREEK_CHARSET; 
    end; 
end; 

var 
    Form1: TForm1; 

begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 
+1

Les jeux de caractères sont * donc * DOS/Windows 3.1/Windows 9x ... –

+0

Je sais. Mais l'application fonctionne et nous ne voulons pas faire le pas Unicode pour le moment. –

Répondre

1

Pas une réponse directe, mais vous pouvez utiliser le TMS Unicode Controls pour ajouter le support Unicode uniquement pour les modifications, et laisser le reste de votre application en l'état. Nous l'avons fait il y a quelques années pour obtenir du soutien dans une seule combobox, et les frais généraux n'étaient pas mauvais. La bibliothèque originale TNT Unicode sur laquelle le pack TMS était basé est disponible here, mais TMS n'est pas cher, et ils ont apporté un tas d'améliorations depuis qu'ils l'ont acheté.

+0

Nous stockons (la plupart de) nos données sous forme de chaîne [N]. Ceux-ci ne peuvent pas stocker tous les caractères que l'utilisateur peut entrer dans une modification Unicode. (Ou est-ce possible?) Comment avez-vous géré cela (sans toucher à chaque affectation à une telle chaîne)? –

+0

Non, 'chaîne [N]' ne peut pas inclure tout ce que peut faire Unicode. Je descendrais de TTntEdit et remplacerais la propriété 'Text' par une propriété AnsiString. Dans les méthodes GetText/SetText, convertissez vers/depuis Unicode. Comme il semble que vous utilisiez le russe sur un système non russe, vous devriez utiliser StringToWideStringEx/WideStringToStringEx de TntSystem.pas, et changer la page de code en fonction du jeu de caractères de la police. RUSSION_CHARSET serait mappé à 1251, par exemple. Vous pouvez toujours taper des caractères que l'application ne prend pas en charge, ce qui serait un peu prudent pour l'utilisateur. Vous pouvez empêcher cela en accrochant WM_PASTE et WM_CHAR. –

+0

Merci. Je vais devoir jouer un peu pour voir ce qu'il est possible de faire. –