J'ai un DBGrid sur un formulaire et j'ai fait plusieurs sélections, je dois maintenant envoyer les cellules sélectionnées (ce sont des adresses e-mail) à la "TO Box" d'Outlook comment puis-je faire cela, j'apprécierai toute aide (Delphi5) Merci d'avanceComment obtenir des cellules sélectionnées de TDBGrid dans Delphi 5
Répondre
Pour obtenir la liste des E-Mails sélectionnés, vous pouvez utiliser cette procédure. Pour Outlook, vous pouvez utiliser shellexec et mailto: ou utiliser l'API s'il y en a.
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;
Chaque contrôle (presque) dans Windows est une fenêtre elle-même. Il a son nom de classe et d'instance. Puisque la construction de chaque fenêtre MailTo dans chaque client de messagerie reste la même, après avoir acquis des connaissances pour trouver le contrôle approprié, une solution peut être construite.
C'est là que Spy ++ de Visual Studio est très pratique (si vous ne l'avez pas, essayez de trouver un outil similaire, il existe une version freeware au http://msdn.microsoft.com/pl-pl/magazine/cc163617(en-us).aspx mais il manque d'outil de recherche cool).
Donc, après avoir lancé Spy ++ et le programme de messagerie, nous avons frappé "New mail" et la fenêtre de diffusion apparaîtra. Actualisez dans Spy ++, et utilisez l'outil "Trouver une fenêtre" - cliquez sur votre liste TO, et vous verrez comment elle est construite.
J'ai commencé avec Outlook Express. La fenêtre de courrier est de la classe ATH_Note, alors la zone d'adresse à l'intérieur est une fenêtre de la classe OE_Envelope et dans cette fenêtre il y a plusieurs fenêtres, certaines d'entre elles sont de la classe RichEdit20W. Le champ "À" est le premier.
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;
Note: FindWindowEx lorsque le deuxième param est 0 sera toujours chercher d'abord dans la ligne -, mais si vous allez faire qqch comme ceci:
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>
Le texte sera mis dans un deuxième champ d'édition. Voir msdn pour FindWindowEx. Donc, ceci est bon pour l'OE (XP SP3 IE7). Mais avec MS Outlook? Je l'ai vérifié avec Spy ++ au travail et "To" Field est une deuxième classe "RichEdit20WPT" (note T à la fin), la classe parent est "# 32770 (Dialog)", parent de ceci est "AfxWndW" et une fois encore une fois la classe parente est "AfxWndW" (c'est un genre TPanel type MS dans TPanel) et - tadam! - La fenêtre de courrier est d'une classe "rctrl_renwnd32". Ainsi, le pseudo-code pour ce sera:
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>
probablement vous voudrez utiliser WM_GETTEXT pour extraire le texte actuel et mettre à jour un nouveau texte en conséquence, mais cela dépasse la portée d'obtenir dans le champ d'édition.
BTW: Ce code dépend fortement de la version de Outlook, alors essayez de vérifier votre version avec Spy ++ avant).
smok1: avez-vous vérifié si votre solution fonctionne réellement? Essayez de cliquer sur le bouton Envoyer. OE dit qu'il n'y a pas d'adresse, même si elle est dans la zone de texte. Ou cliquez sur l'icône à gauche de la zone de texte. OE ne voit pas l'adresse saisie en utilisant WM_SETTEXT. Vous devez le taper manuellement.
Oui, vous avez raison. J'ai amélioré le code en ajoutant WM_CHAR - ceci fait effectivement fonctionner le code, parce qu'un espace supplémentaire force OE à voir l'adresse email entrée. – smok1
- 1. Comment obtenir des lignes sélectionnées dans vb6 Datagrid
- 2. Modification des attributs de style des cellules de tableau sélectionnées avec jQuery?
- 3. Comptage des lignes dans un TDbGrid
- 4. Delphi 5: comment suspendre les dispositions d'ancre?
- 5. Pourquoi StrToInt ('X5') renvoie 5 dans Delphi?
- 6. Comment obtenir des images de l'URL dans Delphi
- 7. L'ordre des cellules dans DataGridView.SelectedCells?
- 8. TDBGrid onSelect
- 9. pascal gratuit, tdbgrid, ligne actuelle
- 10. TMenuItem auto vérifié avec Delphi 5
- 11. Copie de parties d'un tdbgrid dans le presse-papier?
- 12. Y a-t-il un meilleur multi-select que le TDBGrid par défaut dans Delphi?
- 13. Affichage des colonnes sélectionnées
- 14. Comment obtenir le GIT dans Delphi 7?
- 15. Comment créer un client Telnet avec Delphi 5
- 16. Retourne les colonnes sélectionnées sélectionnées
- 17. comment obtenir des ID/noms/guids d'images sélectionnées dans la bibliothèque d'images
- 18. Comment sélectionner des cellules de tableau sans sélectionner de cellules de tableau imbriquées dans jQuery
- 19. Comment désélectionner toutes les cellules d'un NSBrowser
- 20. Espacement horizontal des cellules CSS: comment?
- 21. Comment placer des cellules dans certaines sections d'une table groupée?
- 22. Déclaration de variables dans des cellules Excel
- 23. Récupération de cellules dans UITableView
- 24. Insérer des caractères dans des cellules existantes
- 25. Comment dessiner des bordures de cellules dans un FlexGridSizer wxPython?
- 26. Comment afficher du texte enrichi dans un TDBGrid?
- 27. application en utilisant TIdFTP ne migrant pas de Delphi 5 à Delphi 2009 ... correctifs corrompus
- 28. Comment puis-je obtenir des conseils pour sélectionner toutes les cellules non vides dans Excel?
- 29. obtenir seulement 5 éléments de tableau
- 30. Personnalisation des cellules dans l'application iPhone
Ceci est terriblement compliqué et totalement inutile. Vous pouvez utiliser MAPI ou automatiser Outlook pour créer l'email; il est préférable de le faire d'une manière approuvée et documentée plutôt que de recourir à des hacks bruts. Et que faites-vous lorsque vous exécutez votre code sur Vista en tant qu'utilisateur non administrateur et que cela ne fonctionne pas? –