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

时间:2009-05-06 10:07:34

标签: delphi delphi-5 tdbgrid

我在表单上有一个DBGrid并且我已经做了多个选择,我现在需要将所选单元格(它们是电子邮件地址)发送到Outlook的“TO Box”我该怎么做,我将不胜感激任何帮助(Delphi5) 提前致谢

3 个答案:

答案 0 :(得分:3)

要获取所选电子邮件的列表,您可以使用此过程。对于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;

答案 1 :(得分:1)

smok1:你检查过你的解决方案是否真的有效吗?尝试单击“发送”按钮。 OE表示尽管文本框在文本框中,但没有地址。或者单击文本框左侧的图标。 OE没有看到使用WM_SETTEXT进行的地址。你必须手动输入它。

答案 2 :(得分:-2)

Windows中的每个(几乎)控件都是一个窗口本身。它有它的类和实例名称。由于每个邮件客户端中每个MailTo窗口的构建保持不变,因此在获得如何找到适当控制的知识后,可以构建解决方案。
这是来自Visual Studio的Spy ++派上用场的地方(如果你没有它,试着找一些类似的工具,http://msdn.microsoft.com/pl-pl/magazine/cc163617(en-us).aspx有一个免费软件版本,但它没有很酷的搜索工具)。
因此,启动Spy ++和邮件程序后,我们点击“新邮件”,将出现邮件窗口。在Spy ++中刷新,并使用“查找窗口”工具 - 单击您的TO列表,您将看到它是如何构建的。
我开始使用Outlook Express。邮件窗口是ATH_Note类,然后内部地址区域是类OE_Envelope的窗口,在这个窗口内有几个窗口,其中一些是RichEdit20W类。 “To”字段是第一个

procedure UpdateToOE;
var
  Window:Thandle;
Text:PChar;
begin
  {Lets find Mail window}
  Window:=FindWindow('ATHNote',nil);
  if (Window = 0) then Exit;
  {Lets find adress area inside}
  Window:= FindWindowEx(Window,0,'OEEnvelope',nil);
  if (Window = 0) then Exit;
  {Lets find TO field - remeber this is the first field of this class}
  Window:= FindWindowEx(Window,0,'RichEdit20W',nil);
  if (Window = 0) then Exit;
  {Prepare text into PChar}
  Text:='test@test.com';
  {Send message WMSETTEXT which will set our text in control}
  SendMessage(Window,WMSETTEXT,0,Integer(Text));

  {Sending one extra space to prevent OE does not notice - answer to grzegorz's question}
  SendMessage(Window,WM_CHAR,32,1);
  //done!
End;


注意:当第二个参数为0时,FindWindowEx将始终在行中搜索FIRST - 所以,但如果你这样做的话,那么:

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>

该文本将放在SECOND编辑字段中。有关FindWindowEx的信息,请参见msdn
所以,这对OE(XP SP3 IE7)有好处。但MS Outlook有什么用?我在工作时使用Spy ++检查了它,并且“To”Field是连续第二个“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>



您可能希望使用WM_GETTEXT来提取当前文本并相应地更新新文本,但这超出了进入编辑字段的范围。
顺便说一句:这段代码很大程度上取决于outlook版本,所以在尝试用Spy ++检查你的版本之前。)