WM_PASTE 消息发生时,怎么取出 PASTE 的内容呀?(100分)

  • 主题发起人 主题发起人 darnis
  • 开始时间 开始时间
D

darnis

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的,想定制一个控件 TEdit 的,我想让它只能接受 0..9,和 '.' 也就是只能输入
合法的数字。

在控件的 OnkeyPress 可以很好地解决通过键盘输入的数据过滤问题。
但是我为了把从鼠标操作粘进来的数据进行检测,却不知怎么回事了。
遇到的问题如下:
1、在 WM_PASTE 发生时,能不能取得这时 paste 的内容啊?
2、是 TEdit 不支持 WM_SETTEXT 事件吗?我在组件代码里把这个消息的处理过程写
了,但是永远都发生不了 WM_SETTEXT 事件是怎么回事啊?

部分源代码如下:

TNumeric = class(TEdit)
private
{ Private declarations }
procedure Filter(Sender: TObject;var Key :Char);
procedure WMSetText(var msg: TWMSetText);message WM_SETTEXT;
procedure WMPaste(var msg: TWMPaste);message WM_PASTE;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);override;
published
{ Published declarations }
end;
..............

procedure TNumeric.WMPaste(var msg: TWMPaste);
begin
// 在这里可不可以取得 正在paste的内容呢?
end;

procedure TNumeric.WMSetText(var msg: TWMSetText);
var
str , sv : string;
begin
try // 不管控件值发生什么样的变化,,都不能触发 WM_SETTEXT事件而到达这里面。
str := msg.Text;
strtofloat(str);
except
MessageBeep(0);
msg.Text := '';
end;
end;




 
简单解决一:
不要在OnkeyPress处理,而在onchange中处理.
方法二:
监视clipboard,用 SetClipBoardViewer(Handle);

建议使用一,简单有效.

ps:如果你坚持要用你的WM_PASTE,可以在apllication.onmessage中判断并处理.
 
但是问题是,我如果在Onchange 里处理的话,比较麻烦,
因为在 Onchange 发生时, Text 的值已经改变成现在有可能不符合要求的值的,
比如这样的,
我已经在里面输入了 34.3 然后因为 输入了,';s' 之类的东西,就不符合要求了,
但是我的Text 已经变成 '34.3;s' 了,就不能判断出,在发生此次 OnChange 之前
的值究竟是什么了?(也许有办法的,反正我是没有想到。)

做成一个单独的控件时,它包含有 Appliation 这个对象的吗?我以前做好像就没有的,
只有一个Application 才具有 Appliation? (也许也不对),不过我会试。

谢谢你,,淡淡的笑,,(每次看到你的名字,我都感觉到好像真的是你在那里笑的)

我对Windows 是个菜鸟,你所说的 方法二能够详细一点吗?或者是有什么资料?

 
看错:) 不好意思, 无application,但可以用组件自己的消息或事件处理.
最好定义成事件

你的代码中WM_SETTEXT是为win标准消息,并不是为自定义的消息,不能进行处理执行.

onchange事件时,无异常,把.text赋给一个变量,出现异常,读取变量.

写组件的事,,用第二个方法,非常不好. -_-

 
写了半死,,一不小心按到"重写",全都没掉乐 ,,

你的事件定义copy出来看看
 
嗯,,我的脑子怎么就没有转过来呢?
谢谢你哈 淡淡的笑。
 
不用这么复杂
 
那你的意思是……?

的确,我按淡淡的笑说的做是做出来了,
但是有一点弊病:
输入字符时如果你感觉敏锐的话,可以看到输入了不正确的字符了。
还有,里面的光标自动跑到最前了,现在我是用
PostMessage 给这个控件发了一个 VK_END 的键盘消息,伪装的。
 
后退
顶部