标签: trichedit

如何在更改某些非文本字符的字体时使TRichEdit在Windows 7上的行为类似于写字板?

借助于Sertac Akyuz它,似乎直接原因与charset有关\bullet:在我的本地化Windows中,\bullet输入Alt(0149)总是得到输入\fcharset134,并且尝试通过改变其字体EM_SETCHARFORMAT总是失败(好吧,颜色,大小,样式确实可以改变但不是字体系列名称).

因此,最简单的解决方法是首先重置字符集,然后更改字体.

注意:应该使用RichEdit (版本> = 4.1)!

注意:RichEdit版本可以在MSDN的About Rich Edit Controls,Murray Sargent的MSDN Blog RichEdit版本RichEdit版本更新到7.0中找到.后面的页面提到RichEdit版本高于4.1.作为测试,我将使用Office 2010的RICHED20.DLL与应用程序一起复制到Windows 2000,一切都像一个魅力!

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;
Run Code Online (Sandbox Code Playgroud)

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

根据维基百科,WordPad …

windows delphi fonts wordpad trichedit

53
推荐指数
1
解决办法
6285
查看次数

在运行时使用TRichEdit而不定义父级

我需要使用TRichEdit在运行时所讨论的执行RTF文本转换这里.我成功完成了这个但是我不得不设置一个虚拟形式作为父级,如果不能我不能填充TRichedit.Lines.(错误:缺少父级).我在下面粘贴我的功能,有人可以建议一种避免定义父母的方法吗?您是否也可以对此发表评论并告诉我您是否找到了更高效的想法?

注意:我需要一个字符串,而不是TStrings作为输出,这就是为什么它的设计是这样的.

function RtfToText(const RTF: string;ReplaceLineFeedWithSpace: Boolean): string;
var
  RTFConverter: TRichEdit;
  MyStringStream: TStringStream;
  i: integer;
  CustomLineFeed: string;

begin
  if ReplaceLineFeedWithSpace then
    CustomLineFeed := ' '
    else
    CustomLineFeed := #13;
  try
    RTFConverter := TRichEdit.Create(nil);
    try
      MyStringStream := TStringStream.Create(RTF);
      RTFConverter.parent := Form4; // this is the part I don't like
      RTFConverter.Lines.LoadFromStream(MyStringStream);
      RTFConverter.PlainText := True;
      for i := 0 to RTFConverter.Lines.Count - 1 do
      begin
        if i < RTFConverter.Lines.Count - 1 then
          Result := Result + RTFConverter.Lines[i] + CustomLineFeed
          else
          Result …
Run Code Online (Sandbox Code Playgroud)

delphi rtf trichedit

18
推荐指数
2
解决办法
8638
查看次数

如何在TRichEdit中设置EM_AUTOURLDETECT后检测URL链接?

我正在尝试使用EM_AUTOURLDETECT消息为TRichEdit组件实现URL检测.
我有以下代码的问题

procedure TForm1.Button1Click(Sender: TObject);
var Mask: Word;
begin
  Mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(Handle, EM_SETEVENTMASK, 0, Mask or ENM_LINK);
  SendMessage(Handle, EM_AUTOURLDETECT, Integer(True), 0);
end;
Run Code Online (Sandbox Code Playgroud)

它虽然有效,但我必须在这些设置之后更改TRichEdit的文本,以使其检测已写入文本中的URL.这就是问题,因为我的TRichEdit在应用此功能时处于ReadOnly模式.

执行此代码后,如何强制TRichEdit检测已写入文本中的URL,我该怎么办?
我正在查看文档,但没有提到这样的事情.

谢谢

delphi url winapi detection trichedit

5
推荐指数
1
解决办法
1271
查看次数

为什么EM_SETTEXTMODE不起作用?

我试图用EM_SETTEXTMODE一个RichEdit在Delphi 7控制.

只需创建一个新项目,添加一个TRichEdit控件和一个TButton控件,并将以下代码添加到按钮的单击处理程序:

  SendMessage(RichEdit1.Handle, WM_SETTEXT, 0, LPARAM(PChar('')));
  Button1.Caption := IntToStr(SendMessage(RichEdit1.Handle, EM_GETTEXTMODE, 0, 0));
  Button1.Caption := Button1.Caption + ' ' + IntToStr(SendMessage(RichEdit1.Handle, EM_SETTEXTMODE, TM_PLAINTEXT, 0));
  Button1.Caption := Button1.Caption + ' ' + IntToStr(SendMessage(RichEdit1.Handle, EM_GETTEXTMODE, 0, 0));
Run Code Online (Sandbox Code Playgroud)

38 0 38单击按钮后,按钮的标题设置为,意味着文本模式根本没有变化 - 最初是38(TM_RICHTEXT or TM_SINGLELEVELUNDO or TM_MULTICODEPAGE),然后SETTEXTMODE是成功(0),但即使在此之后它仍然是38.

根据文档的建议,RichEdit在使用之前清除文本EM_SETTEXTMODE.

我已尝试设置不同的值,EM_SETTEXTMODE它始终保持不变38.

我注意到,即使控件在调用之前包含文本,它也会EM_SETTEXTMODE返回0(成功)RichEdit. …

delphi winapi richedit windows-messages trichedit

5
推荐指数
1
解决办法
565
查看次数

将TRichEdit绘制到画布上

我正在尝试在Delphi XE中实现支持RTF的工具提示窗口.为了渲染富文本,我正在使用屏幕外的TRichEdit.我需要做两件事:

  1. 测量文本的大小.
  2. 绘制文本

为了完成这两个任务,我写了这个方法:

procedure TLookupHintWindow.CallFormatRange(R: TRect; var Range: TFormatRange;
  MustPaint: Boolean);
var
  TextRect: TRect;
begin
  RichText.SetBounds(R.Left, R.Top, R.Right, R.Bottom);
  TextRect := Rect(0, 0,
    RichText.Width * Screen.Pixelsperinch,
    RichText.Height * Screen.Pixelsperinch);

  ZeroMemory(@Range, SizeOf(Range));
  Range.hdc := Canvas.Handle;
  Range.hdcTarget := Canvas.Handle;
  Range.rc := TextRect;
  Range.rcpage := TextRect;
  Range.chrg.cpMin := 0;
  Range.chrg.cpMax := -1;

  SendMessage(RichText.Handle, EM_FORMATRANGE,
    NativeInt(MustPaint), NativeInt(@Range));
  SendMessage(RichText.Handle, EM_FORMATRANGE, 0, 0);
end;
Run Code Online (Sandbox Code Playgroud)

传入Range参数,因此我可以使用此方法之外的计算尺寸.MustPaint参数确定是应该计算范围(False)还是绘制(True).

要计算范围,我称之为:

function TLookupHintWindow.CalcRichTextRect(R: TRect; const Rtf: string): TRect;
var
  Range: TFormatRange;
begin
  LoadRichText(Rtf);

  CallFormatRange(R, Range, False);

  Result := Range.rcpage; …
Run Code Online (Sandbox Code Playgroud)

delphi off-screen trichedit delphi-xe

4
推荐指数
1
解决办法
3009
查看次数

RichEdit,如何设置单行的背景颜色

我有一个包含源代码的 TRichEdit 控件。我想设置单行的背景颜色。

我知道如何设置文本颜色,但是没有办法也设置背景颜色吗?我不是在谈论整个控件的整个背景颜色,而是在谈论如何更改一行。

我真的需要编写自定义控件才能做到这一点吗?

colors trichedit c++builder-xe3

4
推荐指数
1
解决办法
2352
查看次数

TRichEdit 暂停/恢复撤销功能

有没有办法在 TRichEdit 控件中暂停/恢复撤消记录?是否有要发送的消息或要设置的模式?

编辑
我已经通过使用 ITextDocument 接口解决了它。看我下面的帖子。

vcl c++builder undo-redo trichedit c++builder-xe5

4
推荐指数
1
解决办法
512
查看次数

Delphi - 当焦点丢失时,在RichEdit中保持突出显示的选择

我有一个TRichEdit.当我选择一些文本并单击另一个元素时,所选文本的选择将消失.有没有办法保持这种选择,当TRichEdit失去它的焦点时?谢谢!

delphi trichedit

2
推荐指数
1
解决办法
1636
查看次数

TRichEdit颜色问题

ans:= RichEdit1.Text     
for i:=1 to Length(ans) do
begin
   RichEdit1.SelStart :=  i-1;
   RichEdit1.SelLength:= 1;
   if ans[i] = correct[i] then
      RichEdit1.SelAttributes.Color := clRed
   else
      RichEdit1.SelAttributes.Color := clBlue;  
Run Code Online (Sandbox Code Playgroud)

如果字母ans匹配字母与字母相同位置的字母correct,则为红色,否则为蓝色.

我的问题是,当我再次输入时,整个RichEdit1文本的颜色与第一个字母相同(如果第一个字母RichEdit1是蓝色,则整个文本变为蓝色).

顺便说一句,这不是我简化它的实际代码,因为有多个TRichEdits.
TRichEdits是只读的,我通过类似的方式分配字母RichEdit1.Text := RichEdit1.Text+Key; (这样做是因为它是一个多键盘程序,我需要分开用户输入)

这是正确的行为吗?如何阻止我的颜色更改覆盖默认颜色?

更新:解决它...以一种草率的方式(每当有人打字时应用默认颜色),但我保持这个开放,以防有人提出更好的解决方案.

delphi trichedit

2
推荐指数
1
解决办法
1262
查看次数

Delphi RichEdit,获得任意行的y像素开始

我有一个richedit包含使用不同字体,样式,语言等的行.

我正在画一个阴沟.我想在与相应行相同的y像素位置开始绘图.

delphi richedit line trichedit

2
推荐指数
1
解决办法
692
查看次数

为TRichEdit添加真正的超链接支持

我需要支持TRichEdit中的"友好名称超链接",我找到的所有解决方案都基于autoURL(EM_AUTOURLDETECT),它通过检测用户输入的以www(或http)开头的字符串来工作.

但我想在不以www开头的字符串上放置链接.示例:" 下载 ".

html browser delphi trichedit delphi-xe7

2
推荐指数
1
解决办法
1612
查看次数

是否可以避免TRichEdit在单击按钮时失去焦点(例如Bold)?

使用delphi和rich edit,我需要按照我正在编写的这个编辑器的行来复制一些东西,当你选择一个文本并按下Bold按钮时,文本仍然被选中而不是取消选择并失去焦点.

我怎样才能做到这一点?

谢谢.

delphi controls focus trichedit

1
推荐指数
1
解决办法
739
查看次数