Extended MAPI in DELPHI
LazyMAPI # 7
Test TMAPITable wrapper, FastFilter and FastSort
Based on an example LazyMAPI # 6 + Includes how to use the TMAPITableAdvise class.
Includes event handling, as a new entry, delete entry, change the record, etc.
usage:
procedure TfrmMain.SetAdviseSink(const Enable: Boolean);
begin
if not Assigned(MessagesTable) then
Exit;
if Enable then
begin
SetEvents(False);
if not Assigned(TableAdvise) then
TableAdvise := TMAPITableAdvise.Create;
TableAdvise.OnChanged := TableBasicEvent;
TableAdvise.OnError := TableErrorEvent;
TableAdvise.OnReload := TableBasicEvent;
TableAdvise.OnRestrictDone := TableBasicEvent;
TableAdvise.OnSetColDone := TableBasicEvent;
TableAdvise.OnSortDone := TableBasicEvent;
TableAdvise.OnRowAdd := TableRowAddOrModifiedEvent;
TableAdvise.OnRowModified := TableRowAddOrModifiedEvent;
TableAdvise.OnRowDeleted := TableRowDeletedEvent;
TableAdvise.Advise(MessagesTable.RawTable);
end
else
begin
if not Assigned(TableAdvise) then
Exit;
TableAdvise.UnAdvise;
TableAdvise.OnChanged := nil;
TableAdvise.OnError := nil;
TableAdvise.OnReload := nil;
TableAdvise.OnRestrictDone := nil;
TableAdvise.OnSetColDone := nil;
TableAdvise.OnSortDone := nil;
TableAdvise.OnRowAdd := nil;
TableAdvise.OnRowModified := nil;
TableAdvise.OnRowDeleted := nil;
end;
end;
procedure TfrmMain.SetEvents(const Allow: Boolean);
begin
if not Assigned(MessagesTable) then
Exit;
if Allow then
begin
MessagesTable.AllowEvents := True;
MessagesTable.OnChanged := TableBasicEvent;
MessagesTable.OnError := TableErrorEvent;
MessagesTable.OnReload := TableBasicEvent;
MessagesTable.OnRestrictDone := TableBasicEvent;
MessagesTable.OnSetColDone := TableBasicEvent;
MessagesTable.OnSortDone := TableBasicEvent;
MessagesTable.OnRowAdd := TableRowAddOrModifiedEvent;
MessagesTable.OnRowModified := TableRowAddOrModifiedEvent;
MessagesTable.OnRowDeleted := TableRowDeletedEvent;
end
else
begin
MessagesTable.AllowEvents := False;
MessagesTable.OnChanged := nil;
MessagesTable.OnError := nil;
MessagesTable.OnReload := nil;
MessagesTable.OnRestrictDone := nil;
MessagesTable.OnSetColDone := nil;
MessagesTable.OnSortDone := nil;
MessagesTable.OnRowAdd := nil;
MessagesTable.OnRowModified := nil;
MessagesTable.OnRowDeleted := nil;
end;
end;
procedure TfrmMain.AddEventDelimiter;
begin
MemoEvents.Lines.Add('============================');
end;
procedure TfrmMain.TableBasicEvent(Sender: TObject; EventType: TTableEventType);
begin
MemoEvents.Lines.Add(Format('%s raise %s', [Sender.ClassName, sTableEventType[EventType]]));
AddEventDelimiter;
end;
procedure TfrmMain.TableErrorEvent(Sender: TObject; Error: HRESULT);
begin
MemoEvents.Lines.Add(Format('%s raise %s', [Sender.ClassName, sTableEventType[tbleErrorEvent]]));
MemoEvents.Lines.Add('Error ID: ' + IntToHex(Error, 8));
if Sender is TMAPITable then
MemoEvents.Lines.Add('Error Message: ' + GetMapiError((Sender as TMAPITable).RawTable, Error))
else if Sender is TMAPITableAdvise then
MemoEvents.Lines.Add('Error Message: ' + GetMapiError((Sender as TMAPITableAdvise).AdvisedTable, Error));
AddEventDelimiter;
end;
procedure TfrmMain.TableRowAddOrModifiedEvent(Sender: TObject; EventType: TTableEventType; PriorRowID: TBytes; RowID: TBytes; Fields: TMAPITableRow;
var AllowUpdate: Boolean);
begin
MemoEvents.Lines.Add(Format('%s raise %s', [Sender.ClassName, sTableEventType[EventType]]));
if Assigned(PriorRowID) then
MemoEvents.Lines.Add('Prior RowID: ' + BytesToHex(PriorRowID));
if Assigned(RowID) then
MemoEvents.Lines.Add('RowID: ' + BytesToHex(RowID));
AddEventDelimiter;
if Assigned(MessagesTable) and Assigned(RowID) then
begin
if Sender is TMAPITable then
AllowUpdate := True
else
MessagesTable.Refresh();
RefreshTableViewList;
end;
end;
procedure TfrmMain.TableRowDeletedEvent(Sender: TObject; RowID: TBytes; Fields: TMAPITableRow; var AllowUpdate: Boolean);
begin
MemoEvents.Lines.Add(Format('%s raise %s', [Sender.ClassName, sTableEventType[tbleRowDeleted]]));
if Assigned(RowID) then
MemoEvents.Lines.Add('RowID: ' + BytesToHex(RowID));
AddEventDelimiter;
if Assigned(MessagesTable) and Assigned(RowID) then
begin
if Sender is TMAPITable then
AllowUpdate := True
else
MessagesTable.Refresh();
RefreshTableViewList;
end;
end;

