Hallo,
Ich verwende Outlook 97 und Delphi 6.02 und möchte in einem TreeView die Ordner von Outlook anzeigen. Angeregt durch einen Tip auf delphi3000.com, wurden zunächst alle Folders durchlaufen und sukzessive in den TreeView eingelesen. Da dies in unserem Netzwerk extrem lang dauert, bin ich jedoch dazu übergegangen, zunächst nur die oberste Ebene einzulesen und jeden Unterordner erst nach einen Klick auf das (+) Symbol des TreeView zu öffnen, wozu ich das OnExpanding Event heranziehe. Dazu speichere ich vorher das Feld "EntryID" (string!) jedes geöffneten Foldes als PChar im Data-Feld der betreffenden TreeNodes. Jetzt habe ich aber das Problem, dass in der OnExpanding-Ereignisbehandlung die Ordner nicht wiedergefunden werden. Der zurückgelesene EntryID-Wert ist zwar richtig, jedoch ist der daraus via "Namespace.GetFolderByID" ermittelte Ordner falsch (Zeile **** (1) unten), und in der nachfolgenden Zeile **** (2) wird dann folgerichtig angemeckert, dass "die Methode Count vom Automatisierungsobjekt nicht unterstützt" wird.
Was mache ich falsch?
Der gesamte Code sieht derzeit folgendermaßen aus:
<PRE>
type
TMainForm = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
OutlookTreeView: TTreeView;
OutlookApplication: TOutlookApplication;
procedure FormCreate(Sender: TObject);
procedure OutlookTreeViewExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
private
{ Private-Deklarationen }
namespace : OLEVariant;
procedure OutlookTree_AddNode(ParentNode:TTreeNode; Folder:OLEVariant);
procedure OutlookTree_Populate;
public
{ Public-Deklarationen }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
uses
ComObj;
procedure TMainForm.FormCreate(Sender: TObject);
begin
NameSpace := OutlookApplication.GetNameSpace('MAPI');
OutlookTree_Populate;
end;
procedure TMainForm.OutlookTree_AddNode(ParentNode:TTreeNode ;
Folder:OLEVariant);
var
i : integer;
node : TTreeNode;
entryID : string;
begin
for i:=1 to Folder.Count do begin
entryID := Folder.Item[i].EntryID;
node := OutlookTreeView.Items.AddChildObject(ParentNode,
Folder.Item[i].Name, StrNew(PChar(entryID)));
with node do begin
node.HasChildren := Folder.Item[i].Folders.Count>0;
end;
end;
end;
procedure TMainForm.OutlookTree_Populate;
begin
OutlookTreeView.Items.BeginUpdate;
OutlookTree_AddNode(nil, NameSpace.Folders);
OutlookTreeView.Items.EndUpdate;
OutlookTreeView.SortType := stText;
end;
procedure TMainForm.OutlookTreeViewExpanding(Sender: TObject;
Node: TTreeNode; var AllowExpansion: Boolean);
var
folder : OLEVariant;
entryID : string;
begin
entryID := StrPas(Node.Data);
folder := namespace.GetFolderFromID(entryID); // xxxx (1)
OutlookTree_AddNode(Node, folder); // xxxx (2)
end;
</PRE>
Ich verwende Outlook 97 und Delphi 6.02 und möchte in einem TreeView die Ordner von Outlook anzeigen. Angeregt durch einen Tip auf delphi3000.com, wurden zunächst alle Folders durchlaufen und sukzessive in den TreeView eingelesen. Da dies in unserem Netzwerk extrem lang dauert, bin ich jedoch dazu übergegangen, zunächst nur die oberste Ebene einzulesen und jeden Unterordner erst nach einen Klick auf das (+) Symbol des TreeView zu öffnen, wozu ich das OnExpanding Event heranziehe. Dazu speichere ich vorher das Feld "EntryID" (string!) jedes geöffneten Foldes als PChar im Data-Feld der betreffenden TreeNodes. Jetzt habe ich aber das Problem, dass in der OnExpanding-Ereignisbehandlung die Ordner nicht wiedergefunden werden. Der zurückgelesene EntryID-Wert ist zwar richtig, jedoch ist der daraus via "Namespace.GetFolderByID" ermittelte Ordner falsch (Zeile **** (1) unten), und in der nachfolgenden Zeile **** (2) wird dann folgerichtig angemeckert, dass "die Methode Count vom Automatisierungsobjekt nicht unterstützt" wird.
Was mache ich falsch?
Der gesamte Code sieht derzeit folgendermaßen aus:
<PRE>
type
TMainForm = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
OutlookTreeView: TTreeView;
OutlookApplication: TOutlookApplication;
procedure FormCreate(Sender: TObject);
procedure OutlookTreeViewExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
private
{ Private-Deklarationen }
namespace : OLEVariant;
procedure OutlookTree_AddNode(ParentNode:TTreeNode; Folder:OLEVariant);
procedure OutlookTree_Populate;
public
{ Public-Deklarationen }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
uses
ComObj;
procedure TMainForm.FormCreate(Sender: TObject);
begin
NameSpace := OutlookApplication.GetNameSpace('MAPI');
OutlookTree_Populate;
end;
procedure TMainForm.OutlookTree_AddNode(ParentNode:TTreeNode ;
Folder:OLEVariant);
var
i : integer;
node : TTreeNode;
entryID : string;
begin
for i:=1 to Folder.Count do begin
entryID := Folder.Item[i].EntryID;
node := OutlookTreeView.Items.AddChildObject(ParentNode,
Folder.Item[i].Name, StrNew(PChar(entryID)));
with node do begin
node.HasChildren := Folder.Item[i].Folders.Count>0;
end;
end;
end;
procedure TMainForm.OutlookTree_Populate;
begin
OutlookTreeView.Items.BeginUpdate;
OutlookTree_AddNode(nil, NameSpace.Folders);
OutlookTreeView.Items.EndUpdate;
OutlookTreeView.SortType := stText;
end;
procedure TMainForm.OutlookTreeViewExpanding(Sender: TObject;
Node: TTreeNode; var AllowExpansion: Boolean);
var
folder : OLEVariant;
entryID : string;
begin
entryID := StrPas(Node.Data);
folder := namespace.GetFolderFromID(entryID); // xxxx (1)
OutlookTree_AddNode(Node, folder); // xxxx (2)
end;
</PRE>
Comment