memo中的行控制(100分)

  • 主题发起人 主题发起人 maming
  • 开始时间 开始时间
M

maming

Unregistered / Unconfirmed
GUEST, unregistred user!
各位请帮忙:

我有一MEMO控件,只要求用户输入界上所见的内容。MEMO是自动换行,而且在没有SCRLL的情况下,它会GUN动。有没有办法不让其上下GUN动。
急! 急!
 
是不是用户输入超过一定限度以后,最上面的就没了。
这样的话,你可以在onkeypress里判断是否是 #13(回车),
然后再判断是否超过,

if Key = 13 then
if Lines.Count > aNumber then
begin
Lines.Delete(0);
end;

不知道效果怎么样。
 
那万一是粘贴的呢,呵呵。
在OnChange里面改吧。
var
iOldSelStart:integer;
iDeleteNumber:integer
begin
with Memo1 do
begin
if Lines.Count > aNumber then
begin
iDeleteNumber := 0;
iOldSelStart := SelStart;
for i := 0 to Lines.Count - aNumber - 1 do
begin
Inc(iDeleteNumber,Length(Lines[0]) + 2);
Lines.Delete(0);
end;
SelStart := iOldSelStart - iDeleteNumber;
end;
end;
end;
 
对,用户输入超过一定限度以后,最上面的就没了。

aNumber 是什么?

两位的办法,行不通,可否再行详细告知。

 
aNumber就是你设置的Memo最大行数。
怎么个行不通?
 
memo的行数不能设置死,所有的MEMO都是自动的生成,且大小不一。
还是“用户输入超过一定限度以后,最上面的就没了”这个问题。
 
你的到底是什么意思? 有很多个 memo, 且大小不一,是动态生成的,
对吗?生成的memo的大小总得有个标准吧, 方法就是这个方法
其他的请说明白点。
 
在OnChange事件中查询当前文本第一个字符的坐标, 如果x<0 or y<0则
表示超出memo大小了,然后再进行处理.
取文本坐标可以给memo.handle发消息:
function Txxxx.OutSide: Boolean;
var
Rst: Integer;
begin
Rst := SendMessage(Memo.Handle, EM_POSFROMCHAR, 0, 0);
Result := (TSmallPoint(Rst).x < 0) or (TSmallPoint(Rst).y < 0);
end;
 
也许有误(抱歉记不清了):
EM_POSFROMCHAR消息返回的也许是个TPoint的地址。看一下MSDN
里相关帮助吧(别看DELPHI带的win32.hlp, 那里有关这项的帮助是错的,
我没装MSDN)
如果是个TPoint的地址, 那么:
unction Txxxx.OutSide: Boolean;
var
Rst: PPoint;
begin
Rst := Pointer(SendMessage(Memo.Handle, EM_POSFROMCHAR, 0, 0);
Result := (Rst^.x < 0) or (Rst^.y < 0);
end;
 
不是返回值, 是参数,
var p: TPoint;

SendMessage(Memo.Handle, EM_POSFROMCHAR, LongInt(@p), 0);
 
那怎么知道应该删除几行呢?
 
对呀,这样就不用给一个固定的值了,没想到,
不过会不会返回负值呢? 没试过。
 
在 onchange 里判断, 多出一行,删一行。
 
SuperMMX, 你看的是win32.hlp吧?
那玩意错了。我试过。MSDN中讲的是返回值。 WParam为0.
我测试的结果是MSDN讲的对.
只是记不清返回的是个Pointer还是个SmallPoint了.
要知道删除几行干吗?wordwrap后你你memo中的几行对应
stringlist中哪些strings还需要特别计算(也许某个strings中一半显示出来了
而另一半不显示呢?)
用EM_CHARFROMPOS(这个帮助win32.hlp中是正确的)取得当前memo中
0,0坐标对应的字符数,然后将memo.text中这个字符数前的所有字符删除
不就得了?
 
嘻嘻。
memo.lines.text。改memo.text的话lines里的stringlist不会更新.
 
procedure TForm1.Button1Click(Sender: TObject);
var
Rst: PPoint;
iPos:integer;
begin
Rst := Pointer(SendMessage(Memo1.Handle, EM_POSFROMCHAR, 0, 0));
if(Rst^.y < 0) then
begin
iPos := SendMessage(Memo1.Handle, EM_CHARFROMPOS,0,longint(Rst));
Memo1.Lines.Text := Copy(Memo1.Lines.Text,iPos,Length(Memo1.Lines.Text));
end;
end;
为什么我的Rst^.y总是得不到正确的值?
 
刚才测试了一下: EM_POSFROMCHAR返回值是个SmallPoint, 不是指针.
 
SmallPoint是在哪里定义的?我怎么找不到?
 
TSmallPoint = record
x: Short;
y: Short;
end;

在windows.pas中定义的.
 
我实验的结果:
Rst.x永远为1。
Rst.y表示从第一个字符到当前可见区域第一个字符的之间
字符个数的负值。

问题:
还是可能有文字行未能显示,比如说,我在memo的
几行中间paste或者打入一段文字,这样,用eyes的方法可以截去未
显示的前面几行文字,但尾部未能显示出来的文字怎么截去?
 
后退
顶部