Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?

Mit Hilfe von Sertac Akyuz es scheint der direkte Grund hängt mit der Zeichenkodierung \bullet: In meinem lokalisierten Windows, die \bullet Eingabe durch Eingabe von Alt(0149) bekommt immer \fcharset134, und versuche, ändern Sie die zugehörige schriftart durch EM_SETCHARFORMAT immer fehl (gut, die Farbe, Größe, Stil kann zwar geändert werden, aber nicht Namen für die schriftart).

Die einfachste Lösung ist daher der erste reset den Zeichensatz und dann die schriftart ändern.

Hinweis: RichEdit (version >= 4.1) verwendet werden sollte!

Hinweis: RichEdit-Versionen finden Sie auf MSDN ist Über Das Rich-Edit-Steuerelemente, Murray Sargent MSDN Blog RichEdit-Versionen und RichEdit-Versionen, das Update auf 7.0. Die letzteren Seiten erwähnt RichEdit-Versionen höher als 4.1. Als test habe ich kopiert die RICHED20.DLL versendet mit Office 2010 zusammen mit der Anwendung auf Windows 2000, und alles funktioniert wie ein Charme!

procedure TMainForm.ButtonFontClick(Sender: TObject);
var
  format: TCharFormat2;
begin
  if dlgFontCdxTxt.Execute then
  begin
    FillChar(format, sizeof(format), 0);
    format.cbSize:= Sizeof(format);
    format.dwMask:= CFM_CHARSET;
    format.bCharSet := 1; // or 0;
    redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));

    FillChar(format, sizeof(format), 0);
    format.cbSize:= Sizeof(format);
    format.dwMask:= CFM_FACE;
    StrPLCopy(format.szFaceName, dlgFontCdxTxt.Font.Name, High(format.szFaceName));
    redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));
  end;
  redtTextBlock.SetFocus;
end;

==================================================

Laut Wikipedia, WordPad Microsofts RichEdit control, Versionen 1.0, 2.0 und 3.0 in Windows 95, 98 und Windows 2000, beziehungsweise. In Windows XP SP1 und höher, WordPad verwendet RichEdit 4.1, einschließlich Windows 7.

Sagen, ein rtf-Dokument, bearbeitet in WordPad, enthält einen nicht-text-Zeichen die Alt-Taste(0149), the bullet dot •. (Oder U+2022)

In Windows 2000 SP4 oder XP SP2, die schriftart, die Kugel dot kann nur die Standard-schriftart in WordPad. Das heißt, man kann sich nicht ändern schriftart, die Kugel dot interaktiv in WordPad.

Aber in Windows 7 SP1, man könnte seine Schrift first changing to "Arial Unicode MS", und dann zu jedem gewünschten schriftart unbegrenzte Zeiten.

Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?
Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?
Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?

Außerdem, WordPad-Dokument, erstellt mit WordPad in Windows 7, enthält verschiedene Schriften von der dot geöffnet und angezeigt werden können, richtig in WordPad in Windows 2000 oder XP.

Den TRichEdit (Delphi XE, Windows 7) können Sie auch öffnen und anzeigen der WordPad-Dokument erstellt mit WordPad in Windows 7 richtig TRichEdit.Lines.LoadFromFile.

Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?

Interaktiv, die TRichEdit (Delphi XE, Windows 7) ermöglicht the bullet dot's schriftart geändert werden in "Arial Unicode MS". Jedoch kann man nicht weiter gehen, zu ändern, um andere Schriftarten interaktiv in TRichEdit.
Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?
Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?
Wie man TRichEdit Verhalten sich wie WordPad unter Windows 7 beim ändern der schriftart für bestimmte nicht-text-Zeichen?

Ich bin deshalb Fragen, (1) der Grund für das unterschiedliche Verhalten von WordPad in Windows 7, und (2) ob es möglich ist, zu machen TRichEdit Verhalten sich gleich?

PS: kann Man brauchen, geben Sie Alt(0149) mehrere Male, um den Punkt in WordPad. Eingabe 2022 und Alt+x funktioniert immer, wie vorgeschlagen,hier.

PS: Man muss auf "aktivieren" Schriftarten in WordPad wie bereits in der Antwort zu Warum TFontDialog gibt weniger Schriften als Bildschirm.Schriftarten?

PS: Man kann sich immer ändern Sie den Punkt, um verschiedene Schriftarten in Word.

Probe.rtf (einfügen in eine plain-text-Datei und ändern Sie dann die Erweiterung in das rtf-Format zu verwenden)

{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fswiss\fprq2\fcharset134 Arial Unicode MS;}{\f1\fnil\fcharset0 Arial Unicode MS;}{\f2\froman\fprq2\fcharset0 Times New Roman;}{\f3\fscript\fprq2\fcharset0 Comic Sans MS;}{\f4\fnil\fcharset0 Comic Sans MS;}{\f5\fmodern\fprq1\fcharset0 Consolas;}{\f6\fnil\fcharset0 Consolas;}{\f7\fmodern\fprq1\fcharset0 Lucida Console;}{\f8\fnil\fcharset0 Lucida Console;}{\f9\froman\fprq2\fcharset2 Symbol;}{\f10\froman\fprq2\fcharset0 Symbol;}{\f11\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\nowidctlpar\sa200\sl276\slmult1\lang2052\f0\fs22 Arial sample text \lang1033\f1\bullet\f2\par
\b\f3 Comic sample text \f4\bullet\f2\par
\b0\f5 Consolas sample text \f6\bullet\f2\par
\f7 Lucida sample text \f8\bullet\f2\par
\pard\nowidctlpar\qj\lang2052\f9 symbl sample text \lang1033\f10\u149?\kerning2\fs21\par
\pard\sa200\sl276\slmult1\lang2052\kerning0\f11\fs22\par
}

uMainForm.dfm anzeigen das format der Zeilen von TRichEdit

object MainForm: TMainForm
  Left = 0
  Top = 0
  Caption = 'MainForm'
  ClientHeight = 362
  ClientWidth = 637
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object pnlBtn: TPanel
    Left = 0
    Top = 0
    Width = 637
    Height = 57
    Align = alTop
    Caption = 'pnlBtn'
    TabOrder = 0
    object Button1: TButton
      Left = 240
      Top = 14
      Width = 137
      Height = 31
      Caption = 'Analyze Rich Edit'
      TabOrder = 0
      OnClick = Button1Click
    end
  end
  object pnlClient: TPanel
    Left = 0
    Top = 57
    Width = 637
    Height = 305
    Align = alClient
    Caption = 'pnlClient'
    TabOrder = 1
    object redtTextBlock: TRichEdit
      Left = 1
      Top = 1
      Width = 225
      Height = 303
      Align = alLeft
      Font.Charset = GB2312_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      Lines.Strings = (
        'redt1')
      ParentFont = False
      TabOrder = 0
    end
    object mmo1: TMemo
      Left = 226
      Top = 1
      Width = 410
      Height = 303
      Align = alClient
      Lines.Strings = (
        'mmo1')
      TabOrder = 1
    end
  end
  object Button2: TButton
    Left = 36
    Top = 14
    Width = 171
    Height = 31
    Caption = 'Font...'
    TabOrder = 2
    OnClick = Button2Click
  end
  object dlgFontCdxTxt: TFontDialog
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    Left = 480
    Top = 16
  end
end

uMainForm.pas anzeigen das format der Zeilen von TRichEdit

unit uMainForm;

interface

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

type

  TCdxmlStyle = class
  public
    FontName: string;
    Str: string;
  end;

  TCdxmlText = class
  public
    Styles: TObjectList;
    constructor Create;
  end;

  TMainForm = class(TForm)
    redtTextBlock: TRichEdit;
    mmo1: TMemo;
    pnlBtn: TPanel;
    pnlClient: TPanel;
    Button1: TButton;
    Button2: TButton;
    dlgFontCdxTxt: TFontDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure TestLoadFromFile;
    procedure AnalyzeRichEdit;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  RichEdit, StrUtils;

{ TCdxmlText }

constructor TCdxmlText.Create;
begin
  Styles := TObjectList.Create;
end;

var
  l_HiddenRichEdit: TRichEdit;

{ TMainForm }

procedure TMainForm.FormCreate(Sender: TObject);
begin
  TestLoadFromFile;
  AnalyzeRichEdit;
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
  format: TCharFormat2;
begin
  if dlgFontCdxTxt.Execute then
  begin
    FillChar(format, sizeof(format), 0);
    format.cbSize:= Sizeof(format);
    format.dwMask:= CFM_FACE;

    StrPLCopy(format.szFaceName, dlgFontCdxTxt.Font.Name, High(format.szFaceName));

    redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));
  end;
  redtTextBlock.SetFocus;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  AnalyzeRichEdit;
end;

procedure TMainForm.TestLoadFromFile;
begin
  redtTextBlock.Clear;

  redtTextBlock.Lines.LoadFromFile('sample.rtf');
end;

procedure TMainForm.AnalyzeRichEdit;
var
  l_MemStream: TMemoryStream;
  l_Format: TCharFormat2;

  I, J: Integer;
  l_CdxmlStyle, l_CdxmlStyleWorker: TCdxmlStyle;
  l_StyleFont: string;

  l_CdxmlText: TCdxmlText;
begin
  l_CdxmlStyle := nil;
  l_CdxmlStyleWorker := nil;

  mmo1.Clear;

  l_MemStream := TMemoryStream.Create;
  redtTextBlock.Lines.SaveToStream(l_MemStream);
  l_MemStream.Seek(0, soFromBeginning);
  l_HiddenRichEdit.Lines.LoadFromStream(l_MemStream);

  l_CdxmlText := TCdxmlText.Create;
  for I := 0 to Length(TrimRight(l_HiddenRichEdit.Text)) - 1 do
  begin
    l_CdxmlStyleWorker := TCdxmlStyle.Create;

    FillChar(l_Format, sizeof(l_Format), 0);
    l_Format.cbSize:= Sizeof(l_Format);
    l_Format.dwMask:= CFM_FACE;

    l_HiddenRichEdit.SelStart := I;
    l_HiddenRichEdit.SelLength := 1;
    l_HiddenRichEdit.Perform(EM_GETCHARFORMAT, SCF_SELECTION, Integer(@l_Format));

    l_CdxmlStyleWorker.FontName := l_Format.szFaceName;

    l_CdxmlStyleWorker.Str := AnsiReplaceStr(l_HiddenRichEdit.SelText, #13, #13#10);

    if l_CdxmlStyle = nil then
    begin
      l_CdxmlText.Styles.Add(l_CdxmlStyleWorker);
      l_CdxmlStyle := l_CdxmlStyleWorker;
    end
    else if (l_CdxmlStyleWorker.FontName  <> l_CdxmlStyle.FontName ) then
    begin
      l_CdxmlText.Styles.Add(l_CdxmlStyleWorker);
      l_CdxmlStyle := l_CdxmlStyleWorker;
    end
    else
    begin
      l_CdxmlStyle.Str := l_CdxmlStyle.Str + l_CdxmlStyleWorker.Str;
    end;
  end;

  for I := 0 to l_CdxmlText.Styles.Count - 1 do
  begin
    l_CdxmlStyle := TCdxmlStyle(l_CdxmlText.Styles[I]);
    mmo1.Lines.Add(l_CdxmlStyle.Str + ':' + l_CdxmlStyle.FontName);
  end;
end;

initialization

  l_HiddenRichEdit := TRichEdit.CreateParented(HWND_MESSAGE);

end.
  • Nur nebenbei, François schrieb darüber, wie der Einsatz von verschiedenen version des rich-edit-Steuerelement this blog post. Sie könnten versuchen, zu verwenden es auch.
  • Ich danke Ihnen sehr für Ihren Kommentar! Ich habe gerade versucht RichEdit 4.1 (verifiziert durch einfügen in einer farbigen Tabelle), wie Sie vorschlagen, aber ich kann immer noch nicht die schriftart ändern, der Punkt, um zum Beispiel einen Comic oder Lucida in das TRichEdit.
InformationsquelleAutor SOUser | 2012-07-03
Schreibe einen Kommentar