SORU
3 Temmuz 2012, Salı


Nasıl olmayan bir yazı tipi belirli bir karakter değiştirirken TRichEdit WordPad gibi davranır Windows 7 yapmak için?

Yardımı ile Sertac Akyuz, öyle görünüyor ki doğrudan bir sebep ile ilgili, karakter kümesi \bullet: benim yerelleştirilmiş Windows, \bullet giriş yazarak Alt(0149) her zaman alır \fcharset134 ve değiştirmeye çalışır, kendi yazı tipi ile EM_SETCHARFORMAT Her zaman başarısız (iyi, rengi, boyutu, stil de değişti ama yazı tipi ailesi adı).

En basit çözüm bu nedenle ilk karakter sıfırlama ve sonra yazı tipini değiştirmek.

Not: RichEdit(sürüm >= 4.1)kullanılmalıdır!

Not: bulunabilir RichEdit sürümleri MSDN About Rich Edit Controls, Sargent Murray değil MSDN Blog RichEdit versions RichEdit Versions Update to 7.0. İkinci sayfa RichEdit 4.1 sürümlerinde daha yüksek bahsetti. Bir test olarak, riched20.dll Office 2010 ile shiped birlikte bir cazibe gibi Windows için uygulama ile her şey çalışıyor 2000 ve kopyaladım!

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;

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

22*, WordPad *kullanılan göre Microsoft RichEdit kontrolü, Windows 95, 98 ve Windows 2000, sırasıyla, sürüm 1.0, 2.0 ve 3.0. Windows XP SP1 ve sonraki, Windows WordPad dahil olmak üzere 4.1, RichEdit 7 kullanır.

Demek rtf belgesi, WordPad düzenlenmekte, metin olmayan karakter Alt(0149), the bullet dot • içerir. (Ya Da U 2022)

Windows 2000 SP4 veya SP2, bu merminin font XP nokta sadece WordPad varsayılan yazı tipi alabilir. Yani, değiştiremezsin o kurşun için yazı tipi WordPad ile interaktif bir nokta.

Ancak, Windows 7 SP1, 13**, ve sonra istediğiniz yazı tipi sınırsız times için yazı tipini değiştirebilir.

Wordpad_1 WordPad_2 WordPad_3

Ayrıca, WordPad belge nokta farklı yazı tipleri içeren Windows WordPad 7 kullanılarak oluşturulan ve doğru Windows 2000 veya XP WordPad ile açılabilir.

Bu TRichEdit (Delphi TEKNOLOJİ, Windows 7) de açık ve WordPad belge Windows 7'de WordPad doğru TRichEdit.Lines.LoadFromFile tarafından oluşturulan görünüm.

TRichEdit_1

Etkileşimli olarak, TRichEdit (Windows 7 Delphi TEKNOLOJİ) the bullet dotsağlar'In yazı tipi değiştirilecek "". Arial Unicode MS Ancak, bir diğer yazı tipleri için TRichEdit etkileşimli olarak değiştirin. TRichEdit_2 TRichEdit_3 TRichEdit_4

Bu nedenle (1) ve Windows 7'de WordPad farklı davranışın sebebi (2) TRichEdit hem davranmasını sağlamak için mümkün olup olmadığını merak ediyorum?

PS: Alt türü(0149) birkaç kez gerekebilir edilmelidir WordPad nokta almak için. Yazarak 2022 ve Alt x her zaman önerilen here gibi çalışır.

PS: "Why TFontDialog gives less fonts than Screen.Fonts? . cevabı belirtildiği gibi WordPad" yazı tiplerini etkinleştirmek için Bir ihtiyaç

PS: her zaman Kelime değişik yazı tiplerini nokta değiştirebilirsin.

örnek.rtf (düz metin dosyasına yapıştırın ve uzantısını kullanmak için rtf değiştirin)

{\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.dpc TRichEdit hatları biçimini görüntülemek için kullanılır

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.TRichEdit hatları biçimini görüntülemek için pas

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.

CEVAP
29 EKİM 2014, ÇARŞAMBA


Oracle JVM ile bu sorun düzeltildi ve Java 7 update 80'de çıkacak.

Peki eğer kendi cevap kabul edeceğiz değil mi eğer bunu belki kabul edersin. En azından sıfır cevap bir soru için daha fazla trafik daha fazla çekme olmaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • iZAPPA

    iZAPPA

    16 Temmuz 2010
  • Attempts at least

    Attempts at

    1 Ocak 2007