2009-05-06 9 views
1

Ich habe ein DBGrid auf einem Formular und ich habe mehrere Auswahlen gemacht, ich muss jetzt die ausgewählten Zellen (sie sind E-Mail-Adressen) an die "TO-Box" von Outlook, wie kann ich dies tun, ich werde jede Hilfe zu schätzen wissen (Delphi5) Vielen Dank im VorausWie man ausgewählte Zellen aus TDBGrid in Delphi 5

Antwort

3

Um Liste der ausgewählten E-Mails zu erhalten, können Sie dieses Verfahren verwenden. Für Outlook möchten Sie vielleicht shellexec und mailto: verwenden oder API verwenden, wenn es welche gibt.

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

Jede (fast) Kontrolle in Windows ist ein Fenster selbst. Es hat seinen Klassen- und Instanznamen. Da die Konstruktion jedes MailTo-Fensters in jedem Mail-Client gleich bleibt, kann nach dem Wissen, wie eine geeignete Steuerung zu finden ist, eine Lösung erstellt werden.
Hier ist Spy ++ von Visual Studio praktisch (wenn Sie es nicht haben, versuchen Sie, ein ähnliches Tool zu finden, gibt es eine Freeware-Version unter http://msdn.microsoft.com/pl-pl/magazine/cc163617(en-us).aspx, aber es fehlt cool Suchwerkzeug).
Also, nach dem Starten von Spy ++ und Mail-Programm, drücken wir "Neue Mail" und Mailing-Fenster wird angezeigt. Aktualisieren Sie in Spy ++, und verwenden Sie das "Find window" Tool - klicken Sie auf Ihre TO-Liste, und Sie werden sehen, wie es gebaut wird.
Ich begann mit Outlook Express. Das Mail-Fenster hat die Klasse ATH_Note, dann ist im Adressbereich ein Fenster der Klasse OE_Envelope und in diesem Fenster befinden sich mehrere Fenster, von denen einige der Klasse RichEdit20W angehören. Das Feld "An" ist das erste.

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:='[email protected]'; 
    {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; 


Hinweis: FindWindowEx, wenn der zweite param 0 wird immer für die erste in der Reihe suchen - so, aber wenn man etw wie dies tun:

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:='[email protected]';<br> 
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br> 

Der Text wird in ein zweites Bearbeitungsfeld gelegt. Siehe msdn für FindWindowEx.

Also, das ist gut für OE (XP SP3 IE7). Aber was ist mit MS Outlook? Ich habe es mit Spy ++ bei der Arbeit überprüft und "To" Field ist eine zweite in Folge "RichEdit20WPT" -Klasse (Note T am Ende), Elternklasse ist "# 32770 (Dialog)", Elternteil davon ist "AfxWndW" und einmal wieder Elternklasse ist "AfxWndW" (das ist eine Art MS-Stil TPanel in TPanel) und - Tadam! - Das Mail-Fenster gehört zur Klasse "rctrl_renwnd32". So ist der Pseudo-Code hierfür wird sein:

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:='[email protected]';<br> 
SendMessage(Window,WM_SETTEXT,0,Integer(Text));<br> 



Wahrscheinlich wollen Sie WM_GETTEXT verwenden aktuellen Text zu extrahieren und neuen Text entsprechend zu aktualisieren, aber das ist über den Rahmen in dem Bearbeitungsfeld zu bekommen.
BTW: Dieser Code hängt stark von Outlook-Version ab, also versuchen Sie Ihre Version mit Spy ++ vorher zu überprüfen).

+3

Dies ist furchtbar verschlungen und völlig unnötig. Sie können MAPI verwenden oder Outlook automatisieren, um die E-Mail zu erstellen. Es ist besser, dies auf eine genehmigte und dokumentierte Art und Weise zu tun, anstatt auf grobe Hacks zurückzugreifen. Und was tun Sie, wenn Sie Ihren Code auf Vista als Nicht-Admin-Benutzer ausführen und es nicht funktioniert? –

1

smok1: Haben Sie überprüft, ob Ihre Lösung tatsächlich funktioniert? Versuchen Sie, auf die Schaltfläche Senden zu klicken. OE sagt, dass keine Adresse angetastet ist, obwohl sie in einem Textfeld ist. Oder klicken Sie auf das Symbol links neben dem Textfeld. OE sieht keine Adresse mit WM_SETTEXT. Sie müssen es manuell eingeben.

+0

Ja, Sie haben Recht. Ich habe den Code verbessert, indem ich WM_CHAR hinzugefügt habe - das macht Code wirklich funktionierend, weil ein Extraraum OE zwingt, eingegebene email Adresse zu sehen. – smok1