如何使Edit1.Font.Charset使用主题(视觉样式)

时间:2010-11-02 19:13:40

标签: delphi themes character-encoding vcl visual-styles

如果您有一个非主题的非Unicode VCL应用程序,其TEdit为“TestEdit”,并将TestEdit.Font.Charset设置为RUSSIAN_CHARSET,则TestEdit将显示西里尔字符。但是,如果您将应用程序切换为使用主题,则此功能不再适用。请尝试以下方法来查看:

  1. 创建一个新的VCL应用程序。
  2. 关闭默认的Unit1而不保存。
  3. 将项目源代码(Project1.pas)替换为此帖子底部的代码,并保存为CharsetTest.pas。
  4. 取消选中项目选项中的运行时主题。
  5. 运行程序,单击单选按钮,观看编辑框'font。
  6. 现在在项目选项中检查运行时主题,或者将XPMan添加到uses子句中。
  7. 重复步骤5.
  8. 我的问题是:有没有办法让应用程序尊重charset即使主题? (不切换到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.
    

2 个答案:

答案 0 :(得分:1)

不是直接答案,但您可以使用TMS Unicode Controls为编辑添加Unicode支持,并保留原始应用程序的其余部分。几年前我们做了这个以获得单个组合框的支持,并且开销也不错。

TMS包基于的原始TNT Unicode库可用here,但TMS并不昂贵,并且自购买以来它们已经做了很多改进。

答案 1 :(得分:0)

这似乎是Windows编辑控件的一个问题:

在我们升级到最近(读取“启用Unicode”)Delphi之前,我们的一些客户必须没有主题。