当RichEdit控件成为其他控件的父文件时,它会停止绘制文本

时间:2013-12-15 03:32:48

标签: delphi delphi-xe5 richedit

RichEdit控件在成为其他控件的父级时停止绘制文本。

这是一个功能还是一个错误? 是否有可能使RichEdit成为其他控件的父级?

查看下一个应用:

- Form1.dfm ---

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 282
  ClientWidth = 418
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 24
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object RichEdit1: TRichEdit
    Left = 16
    Top = 72
    Width = 145
    Height = 105
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    Lines.Strings = (
      'RichEdit1')
    ParentFont = False
    TabOrder = 1
  end
end

- Form1.dfm ---

--- Unit1.pas ---

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm3 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
  Button1.Parent := RichEdit1;
  RichEdit1.Invalidate;
end;

end.

--- Unit1.pas ---

在Delphi XE5 + Win 7下进行测试。

我想使用像这样的编辑按钮创建RichEdit

enter image description here

这是我想要的结果 - 使用DropDown编辑器的RichEdit:

enter image description here

1 个答案:

答案 0 :(得分:5)

使用处理WM_PAINT消息的插入器类,如下所示:

type
  TRichEdit = class(Vcl.ComCtrls.TRichEdit)
  protected
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  end;

procedure TRichEdit.WMPaint(var Message: TWMPaint);
begin
  DefaultHandler(Message);
end;

由于迷失在时间迷雾中的原因,TCustomRichEditWM_PAINT进行了一些特殊处理,这只是原始版本的富编辑DLL实际需要的。此外,当另一个控件成为富编辑的父级时,这种特殊处理会破坏正常绘制。因此,解决问题需要重新建立标准的VCL / Windows绘制处理,这就是上面的代码所做的。

那就是说,我怀疑在丰富的编辑中嵌入一个按钮真的是你想要的 - 例如,文本不会包裹它。