【问题标题】:How to get selected cells from TDBGrid in Delphi 5如何在 Delphi 5 中从 TDBGrid 中获取选定的单元格
【发布时间】:2009-05-06 10:07:33
【问题描述】:

我在表单上有一个 DBGrid,并且我进行了多项选择,我现在需要将选定的单元格(它们是电子邮件地址)发送到 Outlook 的“TO Box”我该怎么做,我将不胜感激(德尔福5) 提前致谢

【问题讨论】:

    标签: delphi delphi-5 tdbgrid


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      smok1:你检查过你的解决方案是否真的有效吗?尝试单击发送按钮。 OE 说没有地址,虽然它在文本框中。或单击文本框左侧的图标。 OE 看不到使用 WM_SETTEXT 输入的地址。您必须手动输入。

      【讨论】:

      • 是的,你是对的。我通过添加 WM_CHAR 改进了代码 - 这实际上使代码工作,因为一个额外的空间迫使 OE 看到输入的电子邮件地址。
      【解决方案3】:

      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 类的。 “收件人”字段是第一个字段。

      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>
      

      文本将被放置在第二个编辑字段中。 FindWindowEx 请参见 msdn。

      所以,这对 OE (XP SP3 IE7) 是有好处的。但是 MS 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>
      



      可能您会想要使用 WM_GETTEXT 来提取当前文本并相应地更新新文本,但这超出了进入编辑字段的范围。
      顺便说一句:此代码很大程度上取决于 Outlook 版本,因此请尝试使用 Spy++ 检查您的版本。

      【讨论】:

      • 这非常令人费解,完全没有必要。您可以使用 MAPI 或自动化 Outlook 来创建电子邮件;最好以经过批准和记录的方式进行操作,而不是诉诸粗暴的黑客行为。当您以非管理员用户的身份在 Vista 上运行代码并且它不起作用时,您会怎么做?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      相关资源
      最近更新 更多