【问题标题】:Is there any way to disable selecting of text in a memo control?有什么方法可以禁用在备忘录控件中选择文本?
【发布时间】:2011-12-15 23:25:56
【问题描述】:

有什么方法可以禁用备忘录控件中的文本选择,因为这很烦人。
备忘录是只读的。

【问题讨论】:

  • 您确定您的用户永远不需要复制备忘录中的一部分文本吗?
  • @Andreas Rejbrand 否,因为它是只读的
  • 是的,我知道它是只读的,但我不明白这与阅读备忘录的内容有什么关系。无论如何,如果答案实际上是,正如你所说,那么你只是承认自己按照你的建议去做是不好的。
  • 将 enable 设置为 false 将阻止选择,但也会阻止滚动条工作。
  • TLabel 如果你改变它的字体和背景颜色可能是合适的。

标签: delphi windows-xp delphi-7 memo


【解决方案1】:

我认为你应该重新考虑。我知道您的控件是在只读模式下使用的,但是,如果最终用户希望复制 一部分 文本怎么办?然后他需要能够选择有问题的部分。

不过,如果您确定需要禁用所有类型的选择,最简单的方法是使用 TRichEdit 而不是 TMemo,然后就这样做

procedure TForm1.RichEdit1SelectionChange(Sender: TObject);
begin
  RichEdit1.SelLength := 0;
end;

【讨论】:

  • 我可以在鼠标未释放的情况下看到选定的文本,但仍然感谢。
  • @Robrok:我不能。 (不知道是什么导致了这种差异。也许是操作系统版本。)
【解决方案2】:

你也可以使用 onMouseUp 事件

procedure TForm1.Memo1MouseUp(Sender: TObject: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Memo1.SelLength > 0 then
    Memo1.SelLength := 0;
end;

但是,这不会停止使用键盘进行选择..

或者您也可以使用 onEnter,只需将焦点更改为表单上的另一个控件。

procedure TForm1.Memo1Enter(Sender: TObject);
begin
  Edit1.SetFocus;
end;

【讨论】:

  • 在焦点改变事件(例如OnEnter)期间切勿改变焦点。
【解决方案3】:

据我了解,您实际上希望将备忘录用作标签(有时它确实有意义)。 当我需要使用 TcxMemo(来自 DeveloperExpress 的备忘录组件)作为标签时,我使用这样简单的过程:

procedure ShowMemoAsLabel(m: TcxMemo);
begin
  m.Enabled := False;
  m.Properties.ReadOnly := True;

  // AH: Unfortunately it doesn't copy some important properties, maybe it will
  // be fixed in future versions of DEX, but at moment we do some job ourselves.
  m.StyleDisabled := m.Style;

  m.StyleDisabled.BorderColor := m.Style.BorderColor;
  m.StyleDisabled.BorderStyle := m.Style.BorderStyle;
  m.StyleDisabled.Color := m.Style.Color;
  m.StyleDisabled.Edges := m.Style.Edges;
  m.StyleDisabled.Shadow := m.Style.Shadow;
  m.StyleDisabled.TextColor := m.Style.TextColor;
  m.StyleDisabled.TextStyle := m.Style.TextStyle;
  m.StyleDisabled.TransparentBorder := m.Style.TransparentBorder;
end;

【讨论】:

    【解决方案4】:

    我一直在玩 TRichEdit 和 TMemo,直到无聊得流泪。是的,您可以在对象上进行一些事件处理技巧,但这仍然不是预期的效果 - 光标最终会在某处闪烁。所以我能找到的最好的事情就是使用 TLabel。我正在使用 Borland C++ Builder 6,并且 \n 使用 TLabel 的内联文本字符串正确翻译。所以,

    Label1->Caption = "this is a test of the emergency\n"
                      "broadcast station, this is only\n"
                      "a test. If this had been an\n"
                      "actual emergency, blah blah blah...\n";
    

    工作得很好。我没有尝试从文件中读取,但我确信如果流与所看到的完全一样,它也可以工作。由于无论如何您都必须输入或阅读要显示的文本 - 这应该很好用,而不是为每一行使用一堆 TLabels。如果您担心自动换行,则必须单独处理该部分。如果它是静态的,那么就像我在示例中所做的那样手动完成。我当然希望这会有所帮助或至少给出一个想法......

    • 原子键 -

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多