启用禁用的TMemo控件中的滚动条

3
有没有办法在禁用的TMemo组件中启用滚动条?即使控件的Enabled属性设置为False,我也希望用户可以滚动内容。 我知道可能有ReadOnly和颜色更改之类的解决方法,就像处于禁用状态一样,但这会对我很有帮助。 提前感谢:)

1
你不应该这样做。这是不好的。 - Andreas Rejbrand
@Andreas - 好吧,我已经从问题中删除了代码,而且我看没有办法做到这一点 :'( - user532231
4个回答

7
一个控件可以被禁用或启用,但不能半禁用半启用(对于我们中的挑剔者而言,我认为没有任何黑客应该使其成为可能:-),原因如下)。
使用ReadOnly是最简单的解决方案。但要注意颜色变化,不要使控件看起来像是被禁用了。这对于识别启用/禁用控件的用户来说也会非常令人困惑。最好将其设置为可滚动的多行标签的外观。通常通过将(背景)颜色设置为其父元素的颜色来实现。
我没有使用@HalloDu提出并链接的解决方案,但那看起来是一个很好的替代方案。

更加挑剔的话,可以覆盖一些消息处理来避免 IBeam 光标和文本选择等问题。 - Sertac Akyuz
我认为没有必要进行颜色变化。当用户尝试输入文本时,发现无法输入时,他们会认为这是一个只读框。 - David Heffernan
1
@David:我的意见恰恰相反。我讨厌使用控件后发现无法编辑的情况。从易用性角度来看,这并不仅仅是个人怪癖。如果该控件的颜色类似于标签,我会立即假设它是只读的,甚至不会尝试更改内容,从而避免了不能做自己想做的事情而产生的挫败感,甚至没有任何迹象表明为什么不被允许。 - Marjan Venema
1
我有一个非常特殊的情况,当表单上的所有组件都被禁用时,用户知道他们无法更改任何内容(这也在表单标题中提到)。他们只想阅读备忘录中的整个文本,但由于滚动条被禁用,现在不可能。我将简单地将它们放在滚动框中,这是我在这里询问之前的第一个想法。感谢您的时间 :) - user532231

1

这不是完美的方法,但它可以工作: 在Memo旁边使用ScrollBar组件。

procedure TForm9.FormCreate(Sender: TObject);
begin
  Memo1.ScrollBars := ssNone;
  ScrollBar1.Min := 0;
  ScrollBar1.Max := Memo1.Lines.Count div (Memo1.Height div 13);//13 is height of a line in memo
end;

procedure TForm9.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
  if ScrollCode in [scPageDown, scLineDown] then
    SendMessage(Memo1.Handle, WM_VSCROLL,  SB_PAGEDOWN,0)
  else if ScrollCode in [scPageUp, scLineUp] then
    SendMessage(Memo1.Handle, WM_VSCROLL,  SB_PAGEUP,0);
end;

3
“13” 的大小取决于字体大小。 - Sertac Akyuz

1

嗯,这不完全是你想要的,但效果是一样的。看看这篇文章,其中实现了一个WinControls的ViewOnly属性,在过去的几年中我发现它非常有用。链接


链接失效了,太遗憾了... Wayback Machine: https://web.archive.org/web/20130329030656/http://delphi.about.com/od/vclusing/a/viewonly.htm - Dúthomhas

0

有一种方法。

将整个TMemo放置在TScrollBox内。

当您填充备忘录文本时,调整高度和宽度以适应文本的大小(这是另一个问题,但我相信可以完成)。


这个答案真是太聪明了,如果我这么说的话。 :-) - Sam
是的,你说得对,这是我在收到提交者的请求后一直想着的解决方法。因为没有更顺畅的方式来完成它,我将跟进这个方案。虽然我还想知道其他事情,但还是给你点个赞吧 :) - user532231

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接