Как заставить Edit1.Font.Charset работать с темами (визуальные стили) - PullRequest
1 голос
/ 02 ноября 2010

Если у вас нет приложения VCL без Unicode с TEdit "TestEdit" и для TestEdit.Font.Charset установлено значение RUSSIAN_CHARSET, то TestEdit отображает кириллические символы.Однако если вы переключаете приложение на использование тем, это больше не работает.Попробуйте следующее, чтобы увидеть это:

  1. Создайте новое приложение VCL.
  2. Закройте модуль по умолчанию без сохранения.
  3. Замените исходный код проекта (Project1.pas) с кодом внизу этого сообщения и сохраните его как CharsetTest.pas.
  4. Снимите флажок Темы времени выполнения в настройках проекта.
  5. Запустите программу, нажмите радиокнопки, посмотрите окно редактирования'font.
  6. Теперь проверьте тематику времени выполнения в параметрах проекта или добавьте XPMan в предложение использования.
  7. Повторите шаг 5.

Мой вопрос: есть лиспособ заставить приложение соблюдать кодировку, даже когда оно тематическое?(Без переключения на 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 ]

1 голос
/ 03 ноября 2010

Не прямой ответ, но вы можете использовать Элементы управления Unicode TMS , чтобы добавить поддержку Юникода только для правок и оставить остальную часть вашего приложения как есть. Мы сделали это несколько лет назад, чтобы получить поддержку в единственном комбо-боксе, и накладные расходы были неплохими.

Оригинальная библиотека TNT Unicode, на которой был основан пакет TMS, доступна здесь , но TMS не дорогая, и с тех пор, как она ее приобрела, было сделано несколько улучшений.

0 голосов
/ 10 августа 2011

Похоже, это проблема с элементом управления редактированием Windows:

До тех пор, пока мы не перейдем на последнюю версию (см. «Включение Unicode»), некоторым нашим клиентам придется жить без тем.

...