有没有办法禁用备忘录控件中的文本选择?

时间:2011-10-26 18:37:44

标签: delphi windows-xp delphi-7 memo

有没有办法禁用备忘录控件中的文本选择,因为它非常烦人 备忘录是只读的。

4 个答案:

答案 0 :(得分:3)

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

但是,如果您确定需要禁用所有类型的选择,最简单的方法是使用TRichEdit代替TMemo,并且只需

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

答案 1 :(得分: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;

答案 2 :(得分:1)

我和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";

工作得很好。我还没有尝试从文件中读取内容,但我确定如果流完全如此,它也可以正常工作。由于您不得不输入或读入您想要显示的文本 - 这应该可以正常工作,而不是每行使用一堆TLabel。如果您对自动换行有疑虑,则必须单独处理该部分。如果它是静态的,那么就像我在示例中那样手工完成。我当然希望这有助于或至少给出一个想法...

  • atomkey -

答案 3 :(得分:0)

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

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;