Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Kotaktgruppen aus Kontakte von Outlook (https://www.delphipraxis.net/185950-kotaktgruppen-aus-kontakte-von-outlook.html)

DelTurbo 21. Jul 2015 11:22

Kotaktgruppen aus Kontakte von Outlook
 
Hallo,
ich suche mich schon dusselig. Ich habe folgenden Code.

http://www.swissdelphicenter.ch/de/showcode.php?id=897

Der wird hier im Forum öfters erwähnt. Das klappt auch wunderbar. Problem ist allerdings wenn man eine Kontaktgruppe hat. Dann kommt folgender Fehler:
Die Methode 'FirstName' wird vom Automatisierungsobjekt nicht unterstützt.

Wie komme ich an die Daten die in den Kontaktgruppen stehen?


Vielen dank im Voraus

Sir Rufo 21. Jul 2015 12:47

AW: Kotaktgruppen aus Kontakte von Outlook
 
Jedes Item hat eine Eigenschaft
Delphi-Quellcode:
Class
und die hat bei einem
Delphi-Quellcode:
ContactItem
den Wert
Delphi-Quellcode:
40
und bei einem
Delphi-Quellcode:
DistListItem
den Wert 69.

Daran kannst du diese unterscheiden.

DelTurbo 21. Jul 2015 13:08

AW: Kotaktgruppen aus Kontakte von Outlook
 
Hi,
erstmal danke für die Antwort. Schau mal was ich gemacht habe. Wo müsste denn die Class stehen und wie wechslen ich dann in die Gruppe?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  olFolderContacts = $0000000A;
var
  flds, outlook, NameSpace, Contacts, Contact: OleVariant;
  i: Integer;
begin
  outlook := CreateOleObject('Outlook.Application');
  NameSpace := outlook.GetNameSpace('MAPI');

  Contacts := NameSpace.GetDefaultFolder(olFolderContacts);
  flds := NameSpace.Folders(1);
  WriteLn(flds.Name);   //<<--- Ich dachte hier müsste die erste Gruppe stehen, sofern vorhanden.
  for i := 1 to Contacts.Items.Count do
  begin
    Contact := Contacts.Items.Item(i);
    Writeln('-----------------------');
    WriteLn('Vor und Nachname: '+Contact.FirstName+' '+Contact.LastName); //Wenn es eine Gruppe ist, gibt es hier den Fehler: Die Methode 'FirstName' wird vom Automatisierungsobjekt nicht unterstützt.
    WriteLn('Firma: '+Contact.CompanyName);
    WriteLn('FirmaTel.: '+Contact.BusinessTelephoneNumber);
    WriteLn('FirmaFax: '+Contact.BusinessFaxNumber);
    WriteLn('EMailadr.: '+Contact.Email1Address);
    WriteLn('Adresse: '+Contact.BusinessAddress);
    WriteLn;
  end;

  Outlook := UnAssigned;
end;
Nicht wundern wenn es sch.... aussieht. Ich Fummel da nun schon lange dran rum. Das habe ich mir auf folgenden Seiten "zusammen gereimt".

http://www.delphipraxis.net/101082-b...-auslesen.html
https://msdn.microsoft.com/de-de/lib.../ff860950.aspx

Ich bekomme aber nur meine Mailadresse zurück. Nicht den Namen der Gruppe die ich in Kontakte angelegt habe.

Nehme ich statt Namespace.Folders(1); Contacts.Folders(1); kommt Array-Index außerhalb des zulässigen Bereichs.

Sir Rufo 21. Jul 2015 13:23

AW: Kotaktgruppen aus Kontakte von Outlook
 
Der größte Fehler ist die Benamung der Variablen, denn die führen dich aufs falsche Gleis. Ein weiterer Fehler ist, dass du es bislang versäumt hast in die Doku zu schauen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  olFolderContacts = $0000000A;
var
  flds, outlook, NameSpace, ContactFolder, Item: OleVariant;
  i: Integer;
begin
  outlook := CreateOleObject('Outlook.Application');
  NameSpace := outlook.GetNameSpace('MAPI');

  ContactFolder := NameSpace.GetDefaultFolder(olFolderContacts);
  for i := 1 to ContactFolder.Items.Count do
  begin
    Item := ContactFolder.Items.Item(i);
    // Hier stellt sich bei dem Item die berühmte Frage: "Was bin ich?"
    if Item.Class = 40 then // ein ContactItem
    begin

    end
    else if Item.Class = 69 then // ein DistListItem
    begin

    end;
  end;

  Outlook := UnAssigned;
end;

DelTurbo 21. Jul 2015 14:00

AW: Kotaktgruppen aus Kontakte von Outlook
 
Hi,
erst mal 1.000 dank für deine Hilfe. So ergibt es sinn. Wie gesagt, ich änder an dem Code seit gestern rum. Wenn ich ehrlich bin habe ich schon nixmehr gepeilt.

Eine einzige Frage hätte ich da noch. Keine angst, gegoogelt hab ich schon. Ich find aber nicht wie ist an die Daten in der Distlist komme. Mit .MemberCount kann ich die schleife "eröffnen". Dann kann ich mit GetMember(i) die Daten hohlen. Ich finde aber nur .Name. Kann man das nicht FirstName, LastName, CompanyName usw. abfragen?

EDIT:
Nachtrag: So wie ich das sehe muss das ähnlich FindFirst, Findnext laufen. Richtig? Also Rekursiv.

Nachtrag 2: Ich kann die EntryID lesen. Ist es vielleicht damit möglich an die Daten zu kommen?

DelTurbo 21. Jul 2015 15:52

AW: Kotaktgruppen aus Kontakte von Outlook
 
Tut mir leid. Habe nun die ganze Zeit gesucht. Finde nur diese Seiten. Auch ALLE Beispiele die ich gefunden habe, missachten das DistListItem. Das heißt im Umkehrschluss ich komme an dieser Stelle einfach nicht weiter. Wäre toll wenn dir nochwas einfällt.

Das find ich zu ContactItem
https://msdn.microsoft.com/en-us/lib...roperties.aspx

Das zu DistListItem
https://msdn.microsoft.com/en-us/lib...roperties.aspx

Netten Gruß und danke im Voraus

Sir Rufo 21. Jul 2015 16:25

AW: Kotaktgruppen aus Kontakte von Outlook
 
DistListItem hat eine Methode https://msdn.microsoft.com/en-us/lib...getmember.aspx.
Diese liefert einen https://msdn.microsoft.com/en-us/lib...recipient.aspx zurück.
Dies hat eine Eigenschaft https://msdn.microsoft.com/en-us/lib...ressentry.aspx was uns auch ein https://msdn.microsoft.com/en-us/lib...ressentry.aspx liefert.
Und das hat dann schlussendlich eine Methode https://msdn.microsoft.com/en-us/lib...etcontact.aspx um den Kontakt zu bekommen.

Das war das kleine Doku-EinmalEins ...

Darauf kommen kann man aber auch durch
Bei Google suchenoutlook distlistitem recipient get contactitem
;)

DelTurbo 22. Jul 2015 07:27

AW: Kotaktgruppen aus Kontakte von Outlook
 
Zitat:

Zitat von Sir Rufo (Beitrag 1309412)
Darauf kommen kann man aber auch durch
Bei Google suchenoutlook distlistitem recipient get contactitem
;)

Natürlich Google ich (und durchsuche das Forum) IMMER bevor ich überhaupt frage. Problem ist aber wenn man bei Google nicht weiß was man fragen soll. Ich hatte nach z.b. DistListItem +Firstname gesucht. Das ist aber nur eine von zig suchen.

Was ich aber auch erstaunlich fand, ist das ALLE Beispiele die ich gefunden habe, sei es Delphi, VB, C(++) diese DistlistItem missachten. Nicht ein example hat die Class abgefragt. Das muss doch dann genauso "scheppern" wie bei mir, wenn Gruppen angelegt sind.

Ich werde mich nun dranmachen und "versuchen" das umzusetzen was du geschrieben hast.

Auf jeden fall vielen vielen dank für deine Hilfe.

Sir Rufo 22. Jul 2015 08:45

AW: Kotaktgruppen aus Kontakte von Outlook
 
Ich wette da haben einige "ganz Schlaue" einfach blind von einem abgeschrieben. ;)

Compiliert und läuft unter Idealbedingungen. Mit dem Thema wirklich auseinandergesetzt hat sich da niemand (bis auf den Ersten, aber der hat das auch nur mit der heissen Nadel zusammengeklopft).

Es gibt übrigens in der Doku auch eine komplette Liste der Klassen-Nummern. Da ist man gut beraten, diese als Konstanten zu definieren ;)

DelTurbo 22. Jul 2015 09:36

AW: Kotaktgruppen aus Kontakte von Outlook
 
Hi Sir Rufo,
also, ich scheine auch zu dumm zu sein. Ich bekomme es nicht hin.

Delphi-Quellcode:
Item.GetMember(1).AddressEntry.GetContact.FirstName
müsste doch richtig sein, oder? z.b.
Delphi-Quellcode:
Item.GetMember(1).AddressEntry.Name
geht. Dort bekomme ich den Namen zurück.

Sobald ich aber GetContact hinter AddressEntry habe, kommt die Fehlermeldung...

Das element kann nicht gefunden werden.

Langsam Zweifel ich bissl an mir. Ich nutze das in folgendem System...

Windows 7 x64
Outlook 2010
Delphi 2007

Das "Programmgerüst" ist oben das von dir. Wäre toll wenn du mir noch einmal Helfen könntest.

Gruß und danke im Voraus

DelTurbo 23. Jul 2015 10:28

AW: Kotaktgruppen aus Kontakte von Outlook
 
Hi,
ich habe nun wirklich alles durch was mir eingefallen ist. Ich habe auch eine Outlook_Tlb erstellt. Dort ist unter dem Eintrag

Delphi-Quellcode:
AddressEntry = interface(IDispatch)
ein Eintrag der heißt
Delphi-Quellcode:
function GetContact: _ContactItem; safecall;

Gehe ich richtig in der Annahme das die Funktion da sein MUSS? Wenn ja, das verstehe ich wirklich nicht warum ich immer "Das element kann nicht gefunden werden." bekomme.

Damit versuche ich an den Vornamen zu kommen.

Delphi-Quellcode:
WriteLn('GetMember: '+Item.GetMember(1).AddressEntry.GetContact.FirstName);


Was mache ich falsch???? Es wäre wirklich schade wenn der Thread als Leiche zurück bleiben würde.

Gruß und danke im Voraus

Sir Rufo 23. Jul 2015 11:23

AW: Kotaktgruppen aus Kontakte von Outlook
 
Wenn du so darauf zugreifst
Delphi-Quellcode:
Item.GetMember(1).AddressEntry.GetContact.FirstName
und du dann den Fehler
Zitat:

Das element kann nicht gefunden werden.
bekommst, dann hast du die Dokumentation nicht komplett gelesen.

Denn dort steht explizit:
Zitat:

A ContactItem object that corresponds to the AddressEntry. Returns Nothing (a null reference (Nothing in Visual Basic) in C#) if the AddressEntry object does not correspond to a contact in a Contacts Address Book.
Und was sonst soll das System zurückliefern, wenn du den Vornamen von nichts lesen willst?

Hast du dir auch schon die anderen Methoden angeschaut?
  • GetExchangeUser
  • GetExchangeDistributionList
Und um was für Einträge handelt es sich denn in der Gruppe? Sind das evtl. Exchange-User?

Da du nur vage Angaben machst kannst du auch nur vage Aussagen bekommen.

DelTurbo 23. Jul 2015 13:18

AW: Kotaktgruppen aus Kontakte von Outlook
 
Huhu,
ich hoffe ich habe dich nun nicht verärgert. Aber du hast sicherlich schon gemerkt das wir nicht auf dem selben Level sind. Etwas übertrieben gesagt bin ich froh über jede If abfrage die klappt. :?

Aber du hast recht. Ich hatte es zwar gelesen aber anders verstanden. Obwohl man es eigentlich nicht falsch verstehen kann. Da ich so lange an dem Problem gesessen habe, habe ich einfach nicht drüber nachgedacht. So was passiert leider.

Hier nochmal alles was (nach der änderung) immernoch zu dem Fehler führt. Leider weiß ich nicht was ich immer noch Falsch mache.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  olFolderContacts = $0000000A;
var
  outlook, NameSpace, ContactFolder,Item: OleVariant;
  i: Integer;
begin
  outlook := CreateOleObject('Outlook.Application');
  NameSpace := outlook.GetNameSpace('MAPI');
  ContactFolder := NameSpace.GetDefaultFolder(olFolderContacts);
   for i := 1 to ContactFolder.Items.Count do
   begin
     Item := ContactFolder.Items.Item(i);
     // Hier stellt sich bei dem Item die berühmte Frage: "Was bin ich?"
     if Item.Class = 40 then // ein ContactItem
     begin
        WriteLn(Item.Firstname);
     end
     else if Item.Class = 69 then // ein DistListItem
     begin
      WriteLn(Item.MemberCount);  // Liefert --> 1
      WriteLn(Item.DLName);      // Liefert --> TestGruppe (TestGruppe hat ein Mitglied. Max Mustermann)
      WriteLn(Item.GetMember(1)); // liefert --> Max Mustermann
      WriteLn(Item.GetMember(1).AddressEntry); // liefert --> Max Mustermann
      WriteLn(VarIsNull(Item.GetMember(1).AddressEntry));  // Liefert False
      if not VarIsNull(Item.GetMember(1).AddressEntry) then
      begin
        WriteLn('Firstname: '+Item.GetMember(1).AddressEntry.GetContact.FirstName); // Erste Gelegenheit für Exception bei $752FC41F. Exception-Klasse EOleException mit Meldung 'Das Element kann nicht gefunden werden'. Prozess Project1.exe (1544)
      end;
     end;
   end;
  Outlook := UnAssigned;
end;

Du sagtest das meine Angaben "etwas vage" wären. Ich hoffe das ist nun richtig. Wenn nicht dann schreibe doch bitte was du wissen willst/musst.


Nochmals, vielen dank für deine Geduld und die Hilfe.

DelTurbo 25. Jul 2015 09:06

AW: Kotaktgruppen aus Kontakte von Outlook
 
Hi,
schade das keiner weiß was da schief läuft. Ich habe nun auch aufgegeben. Im netz findet man nix. Nur Beispiele die das DistListItem missachten.

Falls noch einer eine Lösung oder eine Idee hat werde ich es gerne Testen.

Gruß

zeras 25. Jul 2015 10:51

AW: Kotaktgruppen aus Kontakte von Outlook
 
Nach meinem Wissen ist jede Kontaktgruppe auch wieder eine Liste. Somit kannst du nicht mit dem Index vom
Delphi-Quellcode:
ContactFolder.Items.Count
durchsteppen.

Bei mir geht es so:

Delphi-Quellcode:
procedure TForm6.Button1Click(Sender: TObject);
const
  olFolderContacts = $0000000A;

var
  outlook, NameSpace, ContactFolder, Item, myDistList: OleVariant;
  i, j: Integer;

begin
  outlook := CreateOleObject('Outlook.Application');
  NameSpace := outlook.GetNameSpace('MAPI');
  ContactFolder := NameSpace.GetDefaultFolder(olFolderContacts);
   for i := 1 to ContactFolder.Items.Count do
   begin
     Item := ContactFolder.Items.Item(i);
     // Hier stellt sich bei dem Item die berühmte Frage: "Was bin ich?"
     if Item.Class = 40 then // ein ContactItem
     begin
        //Memo1.Lines.Add(Item.Firstname + Item.LastName);
     end
     else if Item.Class = 69 then // ein DistListItem
     begin

      //wir haben eine Kontaktliste und diese wollen wir auslesen

      myDistList := Item;

      for j := 1 to myDistList.MemberCount do begin
        Memo1.Lines.Add(myDistList.DLName); // Liefert --> TestGruppe (TestGruppe hat ein Mitglied. Max Mustermann)
        Memo1.Lines.Add(myDistList.GetMember(j).Name); // liefert --> Max Mustermann
      end;

     end;
   end;
  Outlook := UnAssigned;
end;

DelTurbo 25. Jul 2015 11:06

AW: Kotaktgruppen aus Kontakte von Outlook
 
Hi,
das ist richtig. Dort gibt es einen eigenen Count. Aber über DIESEN GetMember bekommt man nur den Name. Weder Firstname noch Lastname, Telefon oder sonstwas in der Art.

Das hatte ich auch erst versucht und war happy. Bis ich versuchte an die anderen Daten zu kommen.

Gruß und Danke für die mühe....

zeras 25. Jul 2015 11:18

AW: Kotaktgruppen aus Kontakte von Outlook
 
Ich habe meine Kontaktgruppe aus den vorhandenen Kontakten zusammengestellt. Da könnte es sein, dass du dann den Namen und weitere Details aus der vorhandenen Kontaktliste lesen musst. Vielleicht ist das auch nur ein Link auf einen vorhandenen Namen.
Aber das nur meine Annahme, da ich bisher nichts mit Kontakten gemacht habe.

DelTurbo 25. Jul 2015 11:31

AW: Kotaktgruppen aus Kontakte von Outlook
 
Da bist du im Vorteil. :-D Ich habe bisher nix mit Outlook gemacht. Ich dachte mir schon das es "hässlich" wird. ;)

Und wieder was nicht beantwortet. Ich trööte.....

Zitat:

Zitat von Sir Rufo (Beitrag 1309628)
Hast du dir auch schon die anderen Methoden angeschaut?
  • GetExchangeUser
  • GetExchangeDistributionList
Und um was für Einträge handelt es sich denn in der Gruppe? Sind das evtl. Exchange-User?

Da du nur vage Angaben machst kannst du auch nur vage Aussagen bekommen.

Nein, sind normale User.

zeras 25. Jul 2015 18:18

AW: Kotaktgruppen aus Kontakte von Outlook
 
Ich komme immer mehr zu der Erkenntnis, dass du nur weiterkommst, wenn du dir den Namen oder die Emailadresse merkst und dann in der normalen Kontaktliste nach dem Namen oder der Emailadresse suchst. Das sollte erst mal eine Lösung sein, die funktioniert.
In meinem Outlook sehe ich bei den Gruppen nur den Namen und die Emailadresse. Ein Anklicken auf die Eigenschaften eines Eintrages geht bei mir nicht.
Willst du es nicht so versuchen?

DelTurbo 26. Jul 2015 09:40

AW: Kotaktgruppen aus Kontakte von Outlook
 
Hi,
ich habe nun gemerkt, das wenn man einen Kontakt in der Gruppe hat und ihn dann aus den "normalen" Kontakten löscht, so das er nur noch in der Gruppe vorhanden ist, man keine Mail mehr dorthin schicken kann.

Man kann nur die Gruppe auswählen. Den einzelnen Kontakt nicht mehr. Das heißt um Umkehrschluss das der Kontakt 2x da sein MUSS. Außer man möchte keine Mail mehr dahinschicken.

Will man trotzdem eine Mail zu solch einem Kontakt schicken, muss man die Gruppe wählen, dann ob im Feld an auf das + Zeichen klicken und alle anderen Empfänger löschen. Bissl umständlich.

Da ich nun davon ausgehe das die Kontakte auch in "Kontakte" stehen, lasse ich es erst mal so. Ich find es trotzdem erstaunlich das nicht geht, so wie es bei MS bzw. von Sir Rufo beschrieben ist.

Falls er (mein bekannter) doch die Gruppen lesen möchte, also Gruppe wählen und dann den Empfänger wählen möchte, dann werde ich es so machen wie du beschrieben hast. Ich glaube auch fast das es die einzige Möglichkeit ist.

Gruß und nochmals danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz