AddEditMailList.pas
上传用户:dh8233980
上传日期:2014-10-16
资源大小:1015k
文件大小:24k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit AddEditMailList;
  2. (******************************************************************************)
  3. (*                                                                            *)
  4. (* Hermes Add / Edit Mail List Dialog Box                                     *)
  5. (* Part of Hermes SMTP/POP3 Server.                                           *)
  6. (* Copyright(C) 2000 by Alexander J. Fanti, All Rights Reserver Worldwide.    *)
  7. (*                                                                            *)
  8. (* Created January 11, 2000 by Alexander J. Fanti.  See License.txt           *)
  9. (*                                                                            *)
  10. (* Used by: ManageMailLists                                                   *)
  11. (* Uses: DataU1                                                               *)
  12. (*       ChooseUser                                                           *)
  13. (*       UtilU1                                                               *)
  14. (*                                                                            *)
  15. (* Description: This Modal dialog window pulls double duty, allowing both     *)
  16. (*              adding and editing of mailing lists                           *)
  17. (*              Adding: Let user specify List Name and all other list data    *)
  18. (*              Editing: Let user re-specify list data, but not change Name   *)
  19. (*                                                                            *)
  20. (* Revisions: 1/21/2000  AJF  Commented and re-wrote OK button procedure to   *)
  21. (*                       clarify behavior                                     *)
  22. (*                                                                            *)
  23. (******************************************************************************)
  24. interface
  25. uses
  26.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  27.   StdCtrls, Buttons, Menus, ComCtrls, ExtCtrls, Spin,
  28.   DataU1;
  29. type
  30.   TfrmAddEditMailList = class(TForm)
  31.     btnOK: TBitBtn;
  32.     txtListName: TEdit;
  33.     Label1: TLabel;
  34.     btnCancel: TBitBtn;
  35.     PageControl1: TPageControl;
  36.     tsGeneral: TTabSheet;
  37.     tsWelcome: TTabSheet;
  38.     tsSignature: TTabSheet;
  39.     tsFarewell: TTabSheet;
  40.     tsMembers: TTabSheet;
  41.     Panel1: TPanel;
  42.     Panel2: TPanel;
  43.     Panel3: TPanel;
  44.     Label2: TLabel;
  45.     Label3: TLabel;
  46.     Label4: TLabel;
  47.     lvMembers: TListView;
  48.     popupMembers: TPopupMenu;
  49.     cbxLB_AllowPublicSubscription: TCheckBox;
  50.     cbxLB_ForceRepliesToList: TCheckBox;
  51.     cbxLB_DoNotReportListMembers_SMTP: TCheckBox;
  52.     cbxLB_DoNotReportListMembers: TCheckBox;
  53.     cbxLB_MemberSubmissionOnly: TCheckBox;
  54.     Label8: TLabel;
  55.     txtArchiveFile: TEdit;
  56.     btnSelectArchiveFile: TButton;
  57.     memoSL_Welcome: TMemo;
  58.     memoSL_Signature: TMemo;
  59.     memoSL_Farewell: TMemo;
  60.     puMbr_Add: TMenuItem;
  61.     puMbr_Delete: TMenuItem;
  62.     N1: TMenuItem;
  63.     puMbr_Active: TMenuItem;
  64.     puMbr_Inactive: TMenuItem;
  65.     puMbr_Edit: TMenuItem;
  66.     SaveDialog1: TSaveDialog;
  67.     puMbr_AddLocal: TMenuItem;
  68.     OpenDialogText: TOpenDialog;
  69.     SaveDialogText: TSaveDialog;
  70.     popupMessage: TPopupMenu;
  71.     puMsg_LoadfromFile: TMenuItem;
  72.     puMsg_SavetoFile: TMenuItem;
  73.     puMsg_Clear: TMenuItem;
  74.     puMsg_Copy: TMenuItem;
  75.     puMsg_Paste: TMenuItem;
  76.     N2: TMenuItem;
  77.     puMsg_Cut: TMenuItem;
  78.     N3: TMenuItem;
  79.     puMbr_Manager: TMenuItem;
  80.     puMbr_NoManager: TMenuItem;
  81.     Label5: TLabel;
  82.     txtErrorsMailedTo: TEdit;
  83.     Label6: TLabel;
  84.     btnViewArchive: TButton;
  85.     procedure FormCreate(Sender: TObject);
  86.     procedure FormDestroy(Sender: TObject);
  87.     procedure btnOKClick(Sender: TObject);
  88.     procedure FormShow(Sender: TObject);
  89.     procedure btnSelectArchiveFileClick(Sender: TObject);
  90.     procedure puMsg_LoadfromFileClick(Sender: TObject);
  91.     procedure puMsg_SavetoFileClick(Sender: TObject);
  92.     procedure puMsg_ClearClick(Sender: TObject);
  93.     procedure puMsg_CutClick(Sender: TObject);
  94.     procedure puMsg_CopyClick(Sender: TObject);
  95.     procedure puMsg_PasteClick(Sender: TObject);
  96.     procedure puMbr_AddClick(Sender: TObject);
  97.     procedure puMbr_AddLocalClick(Sender: TObject);
  98.     procedure puMbr_EditClick(Sender: TObject);
  99.     procedure puMbr_DeleteClick(Sender: TObject);
  100.     procedure puMbr_ActiveClick(Sender: TObject);
  101.     procedure puMbr_InactiveClick(Sender: TObject);
  102.     procedure popupMembersPopup(Sender: TObject);
  103.     procedure lvMembersDblClick(Sender: TObject);
  104.     procedure puMbr_ManagerClick(Sender: TObject);
  105.     procedure puMbr_NoManagerClick(Sender: TObject);
  106.     procedure btnViewArchiveClick(Sender: TObject);
  107.   private
  108.     { Private declarations }
  109.     ListInfo : TMailListInformation; // The mail list information we're
  110.                                      // adding or editing
  111.     procedure DisplayInfo;      // Display the user information in the dialog
  112.   public
  113.     { Public declarations }
  114.     function Add : Boolean;                     // Add a new list
  115.     function Edit(ListName : String) : Boolean; // Edit an existing list
  116.     // Both functions return true if successful, false if not (cancelled)
  117.   end;
  118. var
  119.   frmAddEditMailList: TfrmAddEditMailList;
  120. implementation
  121. uses UtilU1,      {for email address validity check}
  122.      ChooseUser, ViewMailListArchive;  {For choosing local users as list members}
  123. {$R *.DFM}
  124. procedure TfrmAddEditMailList.FormCreate(Sender: TObject);
  125. begin
  126.   // Create the Mail List Information object that will hold mail list
  127.   // information and provide functions such as loading and saving mail
  128.   // list data to the disk.
  129.   ListInfo := TMailListInformation.Create;
  130. end;
  131. procedure TfrmAddEditMailList.FormShow(Sender: TObject);
  132. begin
  133.   // If we can, set focus on the List Name edit box, unless it's disabled
  134.   // (edit mode) in which case, we focus on the Page Control.
  135.   if txtListName.Enabled then txtListName.SetFocus
  136.     else PageControl1.SetFocus;
  137.   PageControl1.ActivePage := tsGeneral; // start on general info page
  138. end;
  139. procedure TfrmAddEditMailList.FormDestroy(Sender: TObject);
  140. begin
  141.   // Free the User Information object...
  142.   ListInfo.Free;
  143. end;
  144. procedure TfrmAddEditMailList.DisplayInfo;
  145. var
  146.   x : Longint;
  147.   ListMember : PMailListMemberInfoRec;  // pointer to List Member data structure
  148.   ListItem : TListItem;
  149. begin
  150.   // Display the Mail User Information (from the MailListInformation object)
  151.   // in the dialog
  152.   // Display list members
  153.   lvMembers.Items.Clear;
  154.   for x := 0 to ListInfo.MemberCount -1 do begin
  155.     ListMember := ListInfo.Members[x];
  156.     ListItem := lvMembers.Items.Add;
  157.     ListItem.Caption := IntToStr(x);
  158.     if ListMember.Active then ListItem.SubItems.Add('Yes')
  159.       else ListItem.SubItems.Add('No');
  160.     if ListMember.Manager then ListItem.SubItems.Add('Yes')
  161.       else ListItem.SubItems.Add('No');
  162.     ListItem.SubItems.Add(ListMember.EMail);
  163.   end;
  164.   // Messages automatically sent by list server
  165.   memoSL_Welcome.Clear;
  166.   for x := 0 to ListInfo.SL_Welcome.Count -1 do
  167.     memoSL_Welcome.Lines.Add(ListInfo.SL_Welcome[x]);
  168.   memoSL_Signature.Clear;
  169.   for x := 0 to ListInfo.SL_Signature.Count -1 do
  170.     memoSL_Signature.Lines.Add(ListInfo.SL_Signature[x]);
  171.   memoSL_Farewell.Clear;
  172.   for x := 0 to ListInfo.SL_Farewell.Count -1 do
  173.     memoSL_Farewell.Lines.Add(ListInfo.SL_Farewell[x]);
  174.   // List Behaviors
  175.   cbxLB_AllowPublicSubscription.Checked
  176.   := ListInfo.LB_AllowPublicSubscription;
  177.   cbxLB_ForceRepliesToList.Checked
  178.   := ListInfo.LB_ForceRepliesToList;
  179.   cbxLB_DoNotReportListMembers_SMTP.Checked
  180.   := ListInfo.LB_DoNotReportListMembers_SMTP;
  181.   cbxLB_DoNotReportListMembers.Checked
  182.   := ListInfo.LB_DoNotReportListMembers;
  183.   cbxLB_MemberSubmissionOnly.Checked
  184.   := ListInfo.LB_MemberSubmissionOnly;
  185.   // list Archive settings
  186.   txtArchiveFile.Text := ListInfo.ArchiveFile;
  187.   txtErrorsMailedTo.Text := ListInfo.ErrorsMailedTo;
  188. end;
  189. function TfrmAddEditMailList.Add : Boolean;
  190. begin
  191.   // We want to use the dialog as an "Add" dialog...
  192.   Caption := 'Add Mailing List'; // Set the dialog caption to reflect usage
  193.   txtListName.Enabled := True;   // enable the List Name edit box so the
  194.                                  // user can specify a List Name
  195.   txtListName.Text := '';        // clear the List Name we're editing
  196.   ListInfo.Initialize;           // Initialize the Mail List information
  197.                                  // (clean the slate)
  198.   DisplayInfo;                // Display the user information (default user)
  199.   Result := ShowModal = mrOK; // let the user do their thing
  200. end;
  201. function TfrmAddEditMailList.Edit(ListName : String) : Boolean;
  202. begin
  203.   // We want to use the dialog as an "Edit" dialog...
  204.   Caption := 'Edit Mailing List';  // Set the dialog caption to reflect usage
  205.   txtListName.Enabled := False;    // disable the List Name edit box so the
  206.                                    // user can't change the List Name
  207.   txtListName.Text := ListName;    // Display the Name of the List we'll edit
  208.   ListInfo.LoadFromFile(ListName); // read the mail list information from disk
  209.   DisplayInfo;                // Display the user information (default user)
  210.   Result := ShowModal = mrOK; // let the user do their thing
  211. end;
  212. procedure TfrmAddEditMailList.btnOKClick(Sender: TObject);
  213. var
  214.   ListID : String;    // This is the List Name we're adding or editing...
  215.   Editing : Boolean;  // We'll set this to true to know we're editing...
  216.                       // it just makes it that much more readable...
  217.   // These are used for retrieving data from the dialog...
  218.   x : Longint;
  219.   Active, Manager : Boolean;
  220.   EMail : String;
  221.   ListItem : TListItem;
  222. begin
  223.   // First, we need to "read" the mail list data from the dialog.
  224.   // We'll clear the Mail List Information object first, then get
  225.   // all the dialog data
  226.   ListInfo.Initialize;
  227.   // Read member data...
  228.   for x := 0 to lvMembers.Items.Count -1 do begin
  229.     ListItem := lvMembers.Items[x];
  230.     Active := not (ListItem.SubItems[0] = 'No');
  231.     Manager := not (ListItem.SubItems[1] = 'No');
  232.     EMail  := ListItem.SubItems[2];
  233.     if EMail <> '' then ListInfo.MemberAdd(Active, Manager, EMail);
  234.   end;
  235.   // Read List Server Messages
  236.   ListInfo.SetSL_Welcome(memoSL_Welcome.Lines);
  237.   ListInfo.SetSL_Signature(memoSL_Signature.Lines);
  238.   ListInfo.SetSL_Farewell(memoSL_Farewell.Lines);
  239.   // Read List Behaviors
  240.   ListInfo.LB_AllowPublicSubscription
  241.   := cbxLB_AllowPublicSubscription.Checked;
  242.   ListInfo.LB_ForceRepliesToList
  243.   := cbxLB_ForceRepliesToList.Checked;
  244.   ListInfo.LB_DoNotReportListMembers_SMTP
  245.   := cbxLB_DoNotReportListMembers_SMTP.Checked;
  246.   ListInfo.LB_DoNotReportListMembers
  247.   := cbxLB_DoNotReportListMembers.Checked;
  248.   ListInfo.LB_MemberSubmissionOnly
  249.   := cbxLB_MemberSubmissionOnly.Checked;
  250.   // Archive
  251.   ListInfo.ArchiveFile := txtArchiveFile.Text;
  252.   // Is this address valid?
  253.   if (Trim(txtErrorsMailedTo.Text) <> '') and
  254.      not IsAddressValid(Trim(txtErrorsMailedTo.Text)) then begin
  255.     ShowMessage(EMail + ' is not a valid address.');
  256.     ModalResult := mrNone;    Exit;
  257.   end;
  258.   ListInfo.ErrorsMailedTo := Trim(txtErrorsMailedTo.Text);
  259.   // Now we're finished reading the list information...
  260.   ListID := Trim(txtListName.Text);
  261.   Editing := not txtListName.Enabled; // we know we're editing by the condition
  262.                                      // of the UserID Edit Box (Enabled <> Edit)
  263.   // Here, we can make the checks we'll have to do whether we're adding or
  264.   // editing a mailing list
  265.   // Like being specified at all...
  266.   if ListID = '' then begin
  267.     ShowMessage('The Mail List requires a Name (ID)');
  268.     ModalResult := mrNone;      Exit;
  269.   end;
  270.   // We behave differently based on editing or adding...
  271.   // but either way, we prepare to write a list to disk...
  272.   if Editing then begin
  273.     // We're editing a list, it should already exist...
  274.     if not INI.List_Exists(ListID) then begin
  275.       // This should never happen, but if it does...
  276.       ShowMessage('The Mail List ID must exist to be edited.');
  277.       ModalResult := mrCancel;      Exit;
  278.     end;
  279.     // Now we can fall through and save the list at the bottom of the procedure
  280.   end else begin
  281.     // We're creating a new Mail List...
  282.     // First we need to be certain the ListID doesn't contain any
  283.     // invalid characters
  284.     if not IsNameValid(ListID) then begin
  285.       ShowMessage('The Mail List Name (ID) cannot contain ' +
  286.                   INVALIDNAMECHARACTERS);
  287.       ModalResult := mrNone;    Exit;
  288.     end;
  289.     // Then we check to be sure the name's available (it hasn't been used
  290.     // already for an Alias ID or User Name)
  291.     if INI.Alias_Exists(ListID) then begin
  292.       ShowMessage('The List Name (ID) is already taken by an Alias.');
  293.       ModalResult := mrNone;    Exit;
  294.     end;
  295.     if INI.User_Exists(ListID) then begin
  296.       ShowMessage('The List Name (ID) is already taken by a User.');
  297.       ModalResult := mrNone;    Exit;
  298.     end;
  299.     // Finally, we verify the ListID does not exist, and we create it.
  300.     if INI.List_Exists(ListID) then begin
  301.       ShowMessage('The List Name (ID) already exists, ' +
  302.                   'please specify a different ID.');
  303.       ModalResult := mrNone;      Exit;
  304.     end;
  305.     // if we've gotten this far, we can safely create the List.
  306.     // at each check along the way, we would have been thrown out of this
  307.     // procedure by the "ModalResult := mrNone;      Exit;" line which
  308.     // would have left the user looking at the dialog again.
  309.     if not INI.List_Create(ListID) then begin
  310.       ShowMessage('Unable to create Mail List File.');
  311.       ModalResult := mrNone;      Exit;
  312.     end;
  313.     // Now we can fall through and save the list at the bottom of the procedure
  314.   end;
  315.   // if we've gotten this far, we can safely save the List.
  316.   // at each check along the way, we would have been thrown out of this
  317.   // procedure by the "ModalResult := mrNone;      Exit;" line which
  318.   // would have left the user looking at the dialog again.
  319.   // Save the Mail List Information to disk, replacing the current data
  320.   if not ListInfo.SaveToFile(ListID, False) then begin
  321.     x := MessageDlg('These settings may have been changed by ' +
  322.                     'another process.' + #13 + #10 + 'Do you ' +
  323.                     'want to FORCE the save (possibly erasing ' +
  324.                     'some settings)?', mtWarning, [mbYes, mbNo], 0);
  325.     if x = mrYes then begin
  326.       if not ListInfo.SaveToFile(ListID, True) then begin
  327.         ShowMessage('Settings still could not be saved');
  328.         ModalResult := mrNone;
  329.       end;
  330.     end else begin
  331.       ListInfo.LoadFromFile(ListID);
  332.       DisplayInfo;
  333.       ModalResult := mrNone;
  334.     end;
  335.   end;
  336. end;
  337. procedure TfrmAddEditMailList.btnSelectArchiveFileClick(Sender: TObject);
  338. begin
  339.   // User wants to select a file to save list messages to...
  340.   if SaveDialog1.Execute then txtArchiveFile.Text := SaveDialog1.Filename;
  341. end;
  342. procedure TfrmAddEditMailList.btnViewArchiveClick(Sender: TObject);
  343. begin
  344.   frmViewMailListArchive.View(txtListName.Text, txtArchiveFile.Text);
  345. end;
  346. (**************************)
  347. (** List Server Messages **)
  348. (**************************)
  349. procedure TfrmAddEditMailList.puMsg_ClearClick(Sender: TObject);
  350. begin
  351.   // Clear message
  352.   if PageControl1.ActivePage = tsWelcome then memoSL_Welcome.Clear;
  353.   if PageControl1.ActivePage = tsSignature then memoSL_Signature.Clear;
  354.   if PageControl1.ActivePage = tsFarewell then memoSL_Farewell.Clear;
  355. end;
  356. procedure TfrmAddEditMailList.puMsg_CutClick(Sender: TObject);
  357. begin
  358.   // Cut Message
  359.   if PageControl1.ActivePage = tsWelcome then memoSL_Welcome.CutToClipboard;
  360.   if PageControl1.ActivePage = tsSignature then memoSL_Signature.CutToClipboard;
  361.   if PageControl1.ActivePage = tsFarewell then memoSL_Farewell.CutToClipboard;
  362. end;
  363. procedure TfrmAddEditMailList.puMsg_CopyClick(Sender: TObject);
  364. begin
  365.   // Copy Message
  366.   if PageControl1.ActivePage = tsWelcome then
  367.     memoSL_Welcome.CopyToClipboard;
  368.   if PageControl1.ActivePage = tsSignature then
  369.     memoSL_Signature.CopyToClipboard;
  370.   if PageControl1.ActivePage = tsFarewell then
  371.     memoSL_Farewell.CopyToClipboard;
  372. end;
  373. procedure TfrmAddEditMailList.puMsg_PasteClick(Sender: TObject);
  374. begin
  375.   // Paste Message
  376.   if PageControl1.ActivePage = tsWelcome then
  377.     memoSL_Welcome.PasteFromClipboard;
  378.   if PageControl1.ActivePage = tsSignature then
  379.     memoSL_Signature.PasteFromClipboard;
  380.   if PageControl1.ActivePage = tsFarewell then
  381.     memoSL_Farewell.PasteFromClipboard;
  382. end;
  383. procedure TfrmAddEditMailList.puMsg_LoadfromFileClick(Sender: TObject);
  384. begin
  385.   // Load message from file
  386.   if OpenDialogText.Execute then begin
  387.     if PageControl1.ActivePage = tsWelcome then
  388.       memoSL_Welcome.Lines.LoadFromFile(OpenDialogText.Filename);
  389.     if PageControl1.ActivePage = tsSignature then
  390.       memoSL_Signature.Lines.LoadFromFile(OpenDialogText.Filename);
  391.     if PageControl1.ActivePage = tsFarewell then
  392.       memoSL_Farewell.Lines.LoadFromFile(OpenDialogText.Filename);
  393.   end;
  394. end;
  395. procedure TfrmAddEditMailList.puMsg_SavetoFileClick(Sender: TObject);
  396. begin
  397.   // Save message to file
  398.   if SaveDialogText.Execute then begin
  399.     if PageControl1.ActivePage = tsWelcome then
  400.       memoSL_Welcome.Lines.SaveToFile(SaveDialogText.Filename);
  401.     if PageControl1.ActivePage = tsSignature then
  402.       memoSL_Signature.Lines.SaveToFile(SaveDialogText.Filename);
  403.     if PageControl1.ActivePage = tsFarewell then
  404.       memoSL_Farewell.Lines.SaveToFile(SaveDialogText.Filename);
  405.   end;
  406. end;
  407. (******************)
  408. (** List Members **)
  409. (******************)
  410. procedure TfrmAddEditMailList.popupMembersPopup(Sender: TObject);
  411. begin
  412.   // Enable Members Popup menu items
  413.   puMbr_Edit.Enabled := lvMembers.SelCount = 1;
  414.   puMbr_Delete.Enabled := lvMembers.SelCount > 0;
  415.   puMbr_Active.Enabled := lvMembers.SelCount > 0;
  416.   puMbr_InActive.Enabled := lvMembers.SelCount > 0;
  417.   puMbr_Manager.Enabled := lvMembers.SelCount > 0;
  418.   puMbr_NoManager.Enabled := lvMembers.SelCount > 0;
  419. end;
  420. procedure TfrmAddEditMailList.puMbr_AddClick(Sender: TObject);
  421. var
  422.   EMail : String;
  423.   x : Longint;
  424.   Found : Boolean;
  425.   ListItem : TListItem;
  426. begin
  427.   // Add a member to the list...
  428.   // All member data it storred in the TListView.
  429.   EMail := InputBox('Add Member', 'Please enter a complete email address.', '');
  430.   if EMail <> '' then begin
  431.     if IsAddressValid(EMail) then begin
  432.       Found := False;
  433.       for x := 0 to lvMembers.Items.Count -1 do begin
  434.         ListItem := lvMembers.Items[x];
  435.         if LowerCase(ListItem.SubItems[2]) = LowerCase(EMail) then Found := True;
  436.       end;
  437.       if not Found then begin
  438.         ListItem := lvMembers.Items.Add;
  439.         ListItem.Caption := IntToStr(lvMembers.Items.Count -1);
  440.         ListItem.SubItems.Add('Yes');
  441.         ListItem.SubItems.Add('No');
  442.         ListItem.SubItems.Add(EMail);
  443.       end;
  444.     end else begin
  445.       ShowMessage(EMail + ' is not a valid address.');
  446.     end;
  447.   end;
  448. end;
  449. procedure TfrmAddEditMailList.puMbr_AddLocalClick(Sender: TObject);
  450. var
  451.   Name : String;
  452.   x, y : Longint;
  453.   Found : Boolean;
  454.   ListItem : TListItem;
  455. begin
  456.   // Add a local user to the list...
  457.   // All member data it storred in the TListView.
  458.   if frmChooseUser.SelectAddresses then begin
  459.     for y := 0 to frmChooseUser.lstUsers.Items.Count -1 do begin
  460.       if frmChooseUser.lstUsers.Selected[y] then
  461.         Name := frmChooseUser.lstUsers.Items[y] +
  462.                 '@' + frmChooseUser.lstDomain.Text
  463.       else Name := '';
  464.       if Name <> '' then begin
  465.         Found := False;
  466.         for x := 0 to lvMembers.Items.Count -1 do begin
  467.           ListItem := lvMembers.Items[x];
  468.           if LowerCase(ListItem.SubItems[2]) = LowerCase(Name) then Found := True;
  469.         end;
  470.         if not Found then begin
  471.           ListItem := lvMembers.Items.Add;
  472.           ListItem.Caption := IntToStr(lvMembers.Items.Count -1);
  473.           ListItem.SubItems.Add('Yes');
  474.           ListItem.SubItems.Add('No');
  475.           ListItem.SubItems.Add(Name);
  476.         end;
  477.       end;
  478.     end;
  479.   end;
  480. (*
  481.   // Add a local user to the list...
  482.   // All member data it storred in the TListView.
  483.   Name := frmChooseUser.SelectAddress;
  484.   if Name <> '' then begin
  485.     Found := False;
  486.     for x := 0 to lvMembers.Items.Count -1 do begin
  487.       ListItem := lvMembers.Items[x];
  488.       if LowerCase(ListItem.SubItems[2]) = LowerCase(Name) then Found := True;
  489.     end;
  490.     if not Found then begin
  491.       ListItem := lvMembers.Items.Add;
  492.       ListItem.Caption := IntToStr(lvMembers.Items.Count -1);
  493.       ListItem.SubItems.Add('Yes');
  494.       ListItem.SubItems.Add('No');
  495.       ListItem.SubItems.Add(Name);
  496.     end;
  497.   end;
  498. *)
  499. end;
  500. procedure TfrmAddEditMailList.lvMembersDblClick(Sender: TObject);
  501. begin
  502.   puMbr_Edit.Click;
  503. end;
  504. procedure TfrmAddEditMailList.puMbr_EditClick(Sender: TObject);
  505. var
  506.   EMail : String;
  507.   x : Longint;
  508.   Found : Boolean;
  509.   ListItem : TListItem;
  510. begin
  511.   // Edit a member of the list...
  512.   // All member data it storred in the TListView.
  513.   ListItem := lvMembers.Selected;
  514.   if ListItem <> nil then begin
  515.     EMail := Trim(InputBox('Edit Member',
  516.                            'Please enter a complete email address.',
  517.                            ListItem.SubItems[2]));
  518.     if (EMail <> '') and (EMail <> ListItem.SubItems[2]) then begin
  519.       Found := False;
  520.       for x := 0 to lvMembers.Items.Count -1 do begin
  521.         ListItem := lvMembers.Items[x];
  522.         if LowerCase(ListItem.SubItems[2]) = LowerCase(EMail) then
  523.           Found := True;
  524.       end;
  525.       if not Found then ListItem.SubItems[2] := EMail;
  526.     end;
  527.   end;
  528. end;
  529. procedure TfrmAddEditMailList.puMbr_DeleteClick(Sender: TObject);
  530. var
  531.   x : Longint;
  532. begin
  533.   // Delete a member of the list...
  534.   // All member data it storred in the TListView.
  535.   x := MessageDlg('Delete ' + IntToStr(lvMembers.SelCount) +
  536.                   ' Member?', mtConfirmation, [mbYes, mbNo], 0);
  537.   if x = mrYes then
  538.     for x := lvMembers.Items.Count -1 downto 0 do
  539.       if lvMembers.Items[x].Selected then lvMembers.Items.Delete(x);
  540. end;
  541. procedure TfrmAddEditMailList.puMbr_ActiveClick(Sender: TObject);
  542. var
  543.   ListItem : TListItem;
  544.   x : Longint;
  545. begin
  546.   // Activate a member of the list...
  547.   // All member data it storred in the TListView.
  548.   for x := 0 to lvMembers.Items.Count -1 do
  549.     if lvMembers.Items[x].Selected then begin
  550.       ListItem := lvMembers.Items[x];
  551.       if ListItem <> nil then ListItem.SubItems[0] := 'Yes';
  552.     end;
  553. end;
  554. procedure TfrmAddEditMailList.puMbr_InactiveClick(Sender: TObject);
  555. var
  556.   ListItem : TListItem;
  557.   x : Longint;
  558. begin
  559.   // De-Activate a member of the list...
  560.   // All member data it storred in the TListView.
  561.   for x := 0 to lvMembers.Items.Count -1 do
  562.     if lvMembers.Items[x].Selected then begin
  563.       ListItem := lvMembers.Items[x];
  564.       if ListItem <> nil then ListItem.SubItems[0] := 'No';
  565.     end;
  566. end;
  567. procedure TfrmAddEditMailList.puMbr_ManagerClick(Sender: TObject);
  568. var
  569.   ListItem : TListItem;
  570.   x : Longint;
  571. begin
  572.   // Make a member of the list a manager...
  573.   // All member data it storred in the TListView.
  574.   for x := 0 to lvMembers.Items.Count -1 do
  575.     if lvMembers.Items[x].Selected then begin
  576.       ListItem := lvMembers.Items[x];
  577.       if ListItem <> nil then ListItem.SubItems[1] := 'Yes';
  578.     end;
  579. end;
  580. procedure TfrmAddEditMailList.puMbr_NoManagerClick(Sender: TObject);
  581. var
  582.   ListItem : TListItem;
  583.   x : Longint;
  584. begin
  585.   // Demote a manager to an ordinary member of the list...
  586.   // All member data it storred in the TListView.
  587.   for x := 0 to lvMembers.Items.Count -1 do
  588.     if lvMembers.Items[x].Selected then begin
  589.       ListItem := lvMembers.Items[x];
  590.       if ListItem <> nil then ListItem.SubItems[1] := 'No';
  591.     end;
  592. end;
  593. end.