如何在Delphi 5中从TDBGrid中获取选定的单元格

如何在Delphi 5中从TDBGrid中获取选定的单元格,delphi,delphi-5,tdbgrid,Delphi,Delphi 5,Tdbgrid,我在表单上有一个DBGrid,我做了多个选择,现在我需要将所选单元格(它们是电子邮件地址)发送到Outlook的“收件人”框。我如何做到这一点,我将感谢您的帮助(Delphi5) 提前感谢要获取选定电子邮件的列表,您可以使用此过程。对于outlook,您可能希望使用shellexec和mailto:或使用API(如果有的话) var i: Integer; S: TStringList; begin S:=TStringList.Create; if DBGrid1.SelectedRows.C

我在表单上有一个DBGrid,我做了多个选择,现在我需要将所选单元格(它们是电子邮件地址)发送到Outlook的“收件人”框。我如何做到这一点,我将感谢您的帮助(Delphi5)
提前感谢

要获取选定电子邮件的列表,您可以使用此过程。对于outlook,您可能希望使用shellexec和mailto:或使用API(如果有的话)

var
i: Integer;
S: TStringList;
begin
S:=TStringList.Create;
if DBGrid1.SelectedRows.Count > 0 then
begin
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
Table1.GotoBookmark(pointer(DBGrid1.SelectedRows[i]));
S.Add(Table1EMail.AsString);
end;
//Outlook procedure goes here 
end;

S.Free;
end;
Windows中的每个(几乎)控件本身就是一个窗口。它有自己的类名和实例名。由于每个邮件客户端中每个MailTo窗口的构造都是相同的,因此在了解如何找到适当的控制后,可以构建一个解决方案。
这正是Visual Studio中Spy++派上用场的地方(如果您没有它,请尝试寻找类似的工具,在上有一个免费版本,但它缺少酷的搜索工具)。
所以,在启动Spy++和mail程序后,我们点击“新建邮件”,邮件窗口就会出现。在Spy++中刷新,并使用“查找窗口”工具–单击您的目标列表,您将了解其构建方式。
我从Outlook Express开始。邮件窗口为ATH_Note类,地址区内为OE_信封类窗口,该窗口内有多个窗口,其中一些窗口为RichEdit20W类窗口。“收件人”字段是第一个字段。


注意:当第二个参数为0时,FindWindowEx将始终搜索行中的第一个参数–因此,如果您要这样做:

Window:=FindWindow('ATH_Note',nil);<br>
if (Window = 0) then Exit;<br>
Window:= FindWindowEx(Window,0,'OE_Envelope',nil);<br>
if (Window = 0) then Exit;<br>
Sibling:= FindWindowEx(Window,0,'RichEdit20W',nil);<br>
if (Sibling = 0) then Exit;<br>
Window:=FindWindowEx(Window, Sibling, 'RichEdit20W',nil);<br>
if (Window = 0) then Exit;<br>
Text:='test@test.com';<br>
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br>
Window:=FindWindow('ATH_Note',nil)
如果(窗口=0),则退出
窗口:=FindWindowEx(窗口,0,'OE_信封',无)
如果(窗口=0),则退出
同级:=FindWindowEx(窗口,0,'RichEdit20W',nil)
如果(同级=0),则退出
Window:=FindWindowEx(Window,同级,'RichEdit20W',nil)
如果(窗口=0),则退出
文本:='test@test.com';
SendMessage(窗口,WM_SETTEXT,0,整数(文本))
文本将放在第二个编辑字段中。FindWindowEx见msdn。

因此,这对OE(XP SP3 IE7)有好处。但是Outlook女士怎么办?我在工作时用Spy++检查了它,“To”字段是第二个连续的“RichEdit20WPT”类(最后请注意T),父类是“#32770(Dialog)”,父类是“AfxWndW”,父类是“AfxWndW”(这是TPanel中的某种MS样式TPanel)和–tadam!–邮件窗口属于“rctrl_renwnd32”类。因此,此操作的伪代码为:

Window:=FindWindow('rctrl_renwnd32',nil);<br>
Window:= FindWindowEx(Window,0,’AfxWndW’,nil);<br>
Window:= FindWindowEx(Window,0,’AfxWndW’,nil);<br>
Window:= FindWindowEx(Window,0,’#32770 (Dialog)’,nil);<br>
//Search for FIRST (don’t know what it is)<br>
Sibling:= FindWindowEx(Window,0,’RichEdit20WPT’,nil);<br>
//Search for TO field<br>
Window:= FindWindowEx(Window,Sibling,’RichEdit20WPT’,nil);<br>
Text:='test@test.com';<br>
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br>
Window:=FindWindow('rctrl_renwnd32',nil)
Window:=FindWindowEx(Window,0,'AfxWndW',nil)
Window:=FindWindowEx(Window,0,'AfxWndW',nil)
窗口:=FindWindowEx(窗口,0,#32770(对话框),无)
//搜索第一个(不知道是什么)
同级:=FindWindowEx(窗口,0,'RichEdit20WPT',无)
//搜索“收件人”字段
Window:=FindWindowEx(Window,同级,'RichEdit20WPT',nil)
文本:='test@test.com';
SendMessage(窗口,WM_SETTEXT,0,整数(文本))


您可能希望使用WM_GETTEXT提取当前文本并相应地更新新文本,但这超出了进入编辑字段的范围。

顺便说一句:此代码强烈依赖于outlook版本,因此请尝试在之前使用Spy++检查您的版本)。
smok1:您是否检查了您的解决方案是否实际有效?尝试单击“发送”按钮。OE说,虽然在文本框中,但前面并没有地址。或者单击文本框左侧的图标。OE没有看到使用WM_SETTEXT输入的地址。您必须手动输入。

这非常复杂,完全没有必要。您可以使用MAPI或自动Outlook创建电子邮件;最好是以一种经过批准和记录的方式进行,而不是诉诸于粗糙的黑客手段。当你以非管理员用户的身份在Vista上运行你的代码但它不起作用时,你会怎么做?是的,你是对的。我通过添加WM_CHAR改进了代码-这实际上使代码工作,因为一个额外的空间迫使OE看到输入的电子邮件地址。
Window:=FindWindow('rctrl_renwnd32',nil);<br>
Window:= FindWindowEx(Window,0,’AfxWndW’,nil);<br>
Window:= FindWindowEx(Window,0,’AfxWndW’,nil);<br>
Window:= FindWindowEx(Window,0,’#32770 (Dialog)’,nil);<br>
//Search for FIRST (don’t know what it is)<br>
Sibling:= FindWindowEx(Window,0,’RichEdit20WPT’,nil);<br>
//Search for TO field<br>
Window:= FindWindowEx(Window,Sibling,’RichEdit20WPT’,nil);<br>
Text:='test@test.com';<br>
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br>