Copyright © 2025 IMIBO. Privacy Statement
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;