有一个第三方程序(不一定是什么语言开发)的录入界面,上面有一个只读下拉框(就是不能往里面写东西的那种),
里面的数据项是:
品种1
品种2
品种3
品种4
...
...
数据的顺序不定,数据的数量也不定。比如说品种3,它不一定在下拉框的第几项。我现在想通过sendmessage或者postmessage发送一个消息给这个下拉框,让它选中“品种3”
SendMessage(combo1.Hwnd, WM_SETTEXT, 0, '品种3');
但这样不好使,PostMessage也试过,也不行。请教,应该怎样实现我要的效果?
里面的数据项是:
品种1
品种2
品种3
品种4
...
...
数据的顺序不定,数据的数量也不定。比如说品种3,它不一定在下拉框的第几项。我现在想通过sendmessage或者postmessage发送一个消息给这个下拉框,让它选中“品种3”
SendMessage(combo1.Hwnd, WM_SETTEXT, 0, '品种3');
但这样不好使,PostMessage也试过,也不行。请教,应该怎样实现我要的效果?
解决方案 »
- “微软手写识别SDK”可以转换成图象识别文字吗?
- 请问如何保存 panel 的 parent属性,以便回头使用
- 一个我想破脑袋也没解决的问题,请教各位高手!
- DMzygl.ADOQbab_bb.Open;这个是什么意思?为什么一运行就报错?
- 如何在MS-DOS中用语句编译Pascal源文件成EXE文件(不进入pascal)
- 这样的查询怎么写,在线急等待!!!
- 怎样根据DATE获得上个月的最后提天呢?
- 多线程操作数据库的问题?
- 如何将日期时间用长整型表示?
- 有关RFC?解码问题 和字符串(string)问题
- idtelnet1循环监听的问题
- [高手请教][DBNRTLIB][ConnectionRead (recv()).]一般性网络错误。请检查网络文档。
SendMessage(ComboBox1.Handle, CB_SETCURSEL, ComboBox1.Items.IndexOf('品种2'), 0);
我只是说一下
blazingfire的第2个方法不成功吧
从blazingfire回答也学了不少东西我也再学习,呵呵
仁者见仁,智者见智吧
我能知道的只是它的句柄,和列表中能看到的汉字。
Ret: LongInt;
begin
Ret := SendMessage(combo1.Hwnd, CB_FINDSTRINGEXACT, -1, LongInt(PChar('品种2')));
if Ret = -1 then begin
ShowMessage('没有找到品种2!');
Exit;
end;
SendMessage(combo1.Hwnd,CB_SETCURSEL,Ret,0);
end;
另外我找到这样也可以:
SendMessage(combo.Hwnd, CB_SELECTSTRING, 0, Integer(PChar('品种3')));
-------------------------
但发现这两个方法,虽然内容都选中了,但却没有激活下拉框的点击事件或者change事件,
应该如何继续处理呢?
对于SendMessage(ComboBox1.Handle, WM_SETTEXT, 0, Integer(PChar('品种3'))) 不成功的,不是因为这个方法本身有问题,而是
因为目标ComboBox的风格的问题
var
i, Count, Len: integer;
S: string;
begin
Searched := Trim(Searched);
//取得ComboBox里的项总数
Count := SendMessage(hCmbBox, CB_GETCOUNT, 0, 0);
//循环比较每一项,找到与Searched相等的项
for i := 0 to Count - 1 do
begin
Len := SendMessage(hCmbBox, CB_GETLBTEXTLEN, i, 0);
if Len > 0 then
begin
SetLength(S, Len);
SendMessage(hCmbBox, CB_GETLBTEXT, i, Integer(PChar(S)));
//取得每一项的内容放入S
S := Trim(S);
if SameText(S, Searched) then
begin
//设定当前项
SendMessage(hCmbBox, CB_SETCURSEL, i, 0);
//如果目标是Delphi程序,让ComoBox触发其OnChange事件
SendMessage(hCmbBox, CN_COMMAND, MakeLong(0, CBN_SELCHANGE), 0);
Break;
end;
end;
end;
end;调用例子:procedure TForm1.Button1Click(Sender: TObject);
begin
ChangeComboBoxTo(ComboBox1.Handle, '品种2');
end;
SendMessage(hCmbBox, CN_COMMAND, MakeLong(0, CBN_SELCHANGE), 0);
为什么必须是Delphi程序呢?如果不是Delphi程序应该怎么办呢?我试了一下,VB的不能触发onclick事件现在最关键的是触发onclick事件另外不是我说的不让发重复的,呵呵,楼上看错了。
但同样非常感谢。另外没理解,你在循环里判断和unsigned的
var
Ret: LongInt;
begin
Ret := SendMessage(combo1.Hwnd, CB_FINDSTRINGEXACT, -1, LongInt(PChar('品种2')));
if Ret = -1 then begin
ShowMessage('没有找到品种2!');
Exit;
end;
SendMessage(combo1.Hwnd,CB_SETCURSEL,Ret,0);
end;
这个方法的区别是什么呢?
是不是用哪个都行呢?
还有跟
SendMessage(combo.Hwnd, CB_SELECTSTRING, 0, Integer(PChar('品种3')));
的区别又是什么呢?
现在有三个方法了,我就不知道用哪个了。
不过自己写要灵活些,能作更多的事情。这个和Delphi响应消息的具体实现有关你到底是要OnClick还是OnChange呢?
我这里用C#写了一个小程序是可以触发OnChange事件了procedure ChangeComboBoxTo(hCmbBox: THandle; Searched: string);
var
i, Count, Len: integer;
S: string;
begin
Searched := Trim(Searched);
//取得ComboBox里的项总数
Count := SendMessage(hCmbBox, CB_GETCOUNT, 0, 0);
//循环比较每一项,找到与Searched相等的项
for i := 0 to Count - 1 do
begin
Len := SendMessage(hCmbBox, CB_GETLBTEXTLEN, i, 0);
if Len > 0 then
begin
SetLength(S, Len);
SendMessage(hCmbBox, CB_GETLBTEXT, i, Integer(PChar(S)));
//取得每一项的内容放入S
S := Trim(S);
if SameText(S, Searched) then
begin
//设定当前项
SendMessage(hCmbBox, CB_SETCURSEL, i, 0);
//触发OnChange事件,不用CN_COMMAND
SendMessage(hCmbBox, WM_COMMAND, MakeLong(0, CBN_SELCHANGE), hCmbBox);
Break;
end;
end;
end;
end;
用CN_COMMAND的话onclick和onchange都不能触发,
用WM_COMMAND倒是触发了onclick事件。但看你代码的意思应该是要触发onchange事件。
怪了。
有的程序的下拉框中,既有onclick事件又有onchange事件。另外我继续追加100分。
我这里试了C#是不会触发Click事件的,好象只触发了SelectedIndexChanged和
SelectedValueChanged两个事件