【问题标题】:In RealStudio, how can I intercept pasting of rich text?在 RealStudio 中,如何拦截富文本的粘贴?
【发布时间】:2012-01-02 04:19:16
【问题描述】:

我正在尝试为所见即所得编辑创建一个简单的文本字段。但是,我只想允许某些类型的格式(例如粗体、斜体、下划线和单一标题类型,但没有颜色或不同的字体。)

问题是,如果我使用可以接受格式的编辑器,有人可以在另一个程序中创建或复制格式化文本,然后只需将其粘贴到文本字段中,所有格式都会随之而来,允许我不感兴趣的事情in,比如不同的字体、颜色等。我不想允许这样。

充其量,我想自动删除我不支持的任何格式。在最坏的情况下,我想简单地将任何内容粘贴为纯文本,使他们不得不重新格式化。但在任何情况下,我都不想将剪贴板转储到文本区域。

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: formatting paste realbasic richtext realstudio


    【解决方案1】:

    您可以通过在 KeyDown 事件中拦截粘贴来自己拦截粘贴。然后,您可以自己解析它。这可能有点棘手,但我认为这是你能做到的唯一方法。

    在粘贴后解析生成的 StyleRun 并去除不需要的格式可能会更容易。

    或者,您可以查看 True North Software 的 Formatted Text Control 并覆盖控件的粘贴方法(您可以获得所有源代码)并自己处理。

    无论如何,我认为这将是相当多的工作。

    【讨论】:

    • 有什么办法可以通过子类化内置控件而不是在我什至不确定这是否可行时花费 150 美元购买第三方产品来实现类似的效果?例如,在 Cocoa 的 NSTextView 中,您可以拦截“粘贴”消息并按照您的意愿使用它。 (我很熟悉 RB/RS,但我是一名拥有 28 年经验的资深程序员,会使用大约 8 种语言,所以请随时获取技术或提供示例。)
    • 我差点忘了...我认为 KeyDown 还不够,因为还有其他粘贴方法。这就是为什么我想子类化“粘贴”调用本身,而不是触发它的原因。
    • 我不知道有什么方法可以拦截本机 Real Studio 文本区域控件中的粘贴消息。对不起。使用格式化文本控件的优点是它不使用本机控件。在它下面是一个画布控件。抱歉,我无法提供更多帮助。
    【解决方案2】:

    我建议创建一个新的文本字段/文本区域类并创建一个 EditPaste 菜单处理程序,该处理程序 (a) 在处理剪贴板文本方面执行您正在寻找的操作,并且 (b) 返回 true 以防止默认粘贴从发生。这比使用 Key down 事件更安全,因为用户可能会从编辑菜单中手动选择粘贴。

    您可以通过创建剪贴板对象来访问剪贴板上的文本。

    子类化文本字段并拦截粘贴菜单命令:

    1. 打开项目后,转到项目菜单 > 添加 > 类
    2. 在项目选项卡中选择新类,并在属性面板中将 super 设置为 TextField
    3. 双击类进行编辑
    4. 点击班级中的“添加菜单处理程序”中间工具栏按钮
    5. 将菜单项名称更改为“EditPaste”。将您的代码放在“return true”之前,并确保将 return true 留在其中。

    然后您的代码可以手动格式化和粘贴文本并覆盖默认粘贴功能。

    该文本字段中的任何 command-V 或 control-V 都会导致该菜单处理程序触发。无论如何,您都会添加任何上下文菜单,因为真正的基本不会创建默认的上下文菜单,因此您也可以控制它。

    要将文本字段添加到窗口,只需将对象列表上方的过滤器更改为项目控件,然后将类从那里拖入即可。

    【讨论】:

    • 我已经提到 KeyDown 事件会遗漏一些东西(请参阅下面的答案)。你能举例说明你所指的代码吗?不确定如何创建一个全新的字段/文本区域。想要对现有的进行子类化。但我想拦截所有可能的粘贴方式……菜单、命令、键盘、上下文菜单、所有内容,但我希望所有其他默认行为保持不变。
    • 我添加了有关如何子类化文本字段和拦截任何粘贴事件的编号说明。
    • 另外,请注意,您可以以相同的方式子类化 textfield 或 textarea 并拦截其中任何一个的菜单处理程序。
    • 谢谢!即使我还没有实际测试过这个(不要让它在这台机器上运行)你的答案看起来足够彻底,我假设你已经测试过了,所以我将你的标记为答案。谢谢! :)
    • 是的,我实际上启动了 RB 以确保菜单处理程序拦截所有内容并且不处理标准粘贴,因为返回 true。您可能遇到的唯一问题是从剪贴板获取格式化文本,但剪贴板对象为您提供文本以及您可以从中获取所需内容的原始数据。
    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多