i: Integer;
begin
for i := 0 to AList.Count - 1 do
if AList.Objects[i] <> nil then
DestroyList(TStringList(AList.Objects[i]));
AList.Free;
end;
procedure BuildTree(Parent: TTreeNode; List: TStrings);
var
Node: TTreeNode;
for i := 0 to List.Count - 1 do
if List.Objects[i] <> nil then
Node := NewsForm.NewsGroups.Items.AddChild(Parent, List[i]);
Node.ImageIndex := 0;
Node.SelectedIndex := 1;
BuildTree(Node, TStrings(List.Objects[i]));
end
else
NewsForm.NewsGroups.Items.AddChild(Parent, List[i]);
function TNewsForm.NodePath(Node: TTreeNode): String;
if Node.Parent = nil then
Result := Node.Text
Result := NodePath(Node.Parent) + '.' + Node.Text;
procedure TNewsForm.FileConnectItemClick(Sender: TObject);
ConnectDlg := TConnectDlg.Create(Self);
try
if ConnectDlg.ShowModal = mrOk then
with NNTP1 do
Connect(ConnectDlg.ServerEdit.Text, RemotePort);
finally
ConnectDlg.Free;
procedure TNewsForm.NNTP1ProtocolStateChanged(Sender: TObject;
ProtocolState: Smallint);
case ProtocolState of
nntpBase: ;
nntpTransaction:
EventFlag := efListGroups;
Nodes := TStringList.Create;
Nodes.Sorted := True;
NNTP1.ListGroups;
procedure TNewsForm.NNTP1StateChanged(Sender: TObject; State: Smallint);
with Memo1.Lines do
case NNTP1.State of
prcConnecting : Add('Connecting');
prcResolvingHost: Add('Resolving Host: ' + NNTP1.RemoteHost);
prcHostResolved : Add('Host resolved');
prcConnected :
Add('Connected to: ' + NNTP1.RemoteHost);
Statusbar.Panels[0].Text := 'Connected to: ' + NNTP1.RemoteHost;
ConnectBtn.Enabled := False;
FileConnectItem.Enabled := False;
RefreshBtn.Enabled := True;
prcDisconnecting: Text := NNTP1.ReplyString;
prcDisconnected :
Statusbar.Panels[0].Text := 'Disconnected';
Caption := 'News Reader';
Label1.Caption := '';
ConnectBtn.Enabled := True;
FileConnectItem.Enabled := True;
RefreshBtn.Enabled := False;
procedure TNewsForm.Exit1Click(Sender: TObject);
if NNTP1.State <> prcDisconnected then
if NNTP1.Busy then NNTP1.Cancel;
NNTP1.Quit;
while NNTP1.State <> prcDisconnected do
Application.ProcessMessages;
Close;
procedure TNewsForm.MsgHeadersDblClick(Sender: TObject);
Article: Integer;
if NNTP1.Busy then exit;
EventFlag := efGetArticle;
Memo1.Clear;
if MsgHeaders.ItemIndex = -1 then exit;
Caption := 'News Reader: ' + MsgHeaders.Items[MsgHeaders.ItemIndex];
Article := Integer(MsgHeaders.Items.Objects[MsgHeaders.ItemIndex]);
NNTP1.GetArticlebyArticleNumber(Article);
procedure TNewsForm.FormClose(Sender: TObject; var Action: TCloseAction);
procedure TNewsForm.NewsGroupsChange(Sender: TObject; Node: TTreeNode);
NP: String;
if (NNTP1.State = prcConnected) and not NNTP1.Busy then
with MsgHeaders do
Items.BeginUpdate;
Items.Clear;
Memo1.Lines.Clear;
NP := NodePath(NewsGroups.Selected);
Statusbar.Panels[2].Text := 'Bytes: 0';
Statusbar.Panels[1].Text := '0 Article(s)';
if NNTP1.Busy then
NNTP1.Cancel;
NNTP1.SelectGroup(NP);
Label1.Caption := 'Contents of ''' + NP + '''';
Items.EndUpdate;
procedure TNewsForm.RefreshBtnClick(Sender: TObject);
if NewsGroups.Selected <> nil then
NewsGroupsChange(nil, NewsGroups.Selected);
procedure TNewsForm.FileDisconnectItemClick(Sender: TObject);
while NNTP1.Busy do
with NewsGroups.Items do
BeginUpdate;
Clear;
EndUpdate;
MsgHeaders.Items.Clear;
procedure TNewsForm.NNTP1Banner(Sender: TObject; const Banner: WideString);
Memo1.Lines.Add(Banner);
procedure TNewsForm.NNTP1DocOutput(Sender: TObject;
const DocOutput: DocOutput);
Statusbar.Panels[2].Text := Format('Bytes: %d',[DocOutput.BytesTransferred]);
case DocOutput.State of
icDocBegin:
if EventFlag = efListGroups then
Memo1.Lines.Add('Retrieving news groups...');
Data := '';
GroupCount := 0;
icDocData:
Data := Data + DocOutput.DataString;
if EventFlag = efGetArticle then
Memo1.Lines.Add(Data);
icDocEnd:
case EventFlag of
efListGroups:
ParseGroups(Data);
Memo1.Lines.Add('Done.'#13#10'Building news group tree...');
NewsGroups.Items.BeginUpdate;
BuildTree(nil, Nodes);
DestroyList(Nodes);
Statusbar.Panels[1].Text := Format('%d Groups',[GroupCount]);
NewsGroups.Items.EndUpdate;
Memo1.Lines.Add('Done.');
efGetArticleHeaders: ParseHeaders(Data);
efGetArticle:
Memo1.SelStart := 0;
SendMessage(Memo1.Handle, EM_ScrollCaret, 0, 0);
SetLength(Data, 0);
Refresh;
procedure TNewsForm.NNTP1Error(Sender: TObject; Number: Smallint;
var Description: WideString; Scode: Integer; const Source,
HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool);
// MessageDlg(Description, mtError, [mbOk], 0);
procedure TNewsForm.NNTP1SelectGroup(Sender: TObject;
const groupName: WideString; firstMessage, lastMessage,
msgCount: Integer);
EventFlag := efGetArticleHeaders;
Statusbar.Panels[1].Text := Format('%d Article(s)',[msgCount]);
NNTP1.GetArticleHeaders('subject', FirstMessage, lastMessage);
end.
файл smtp.pas
unit Smtp;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, OleCtrls,
ISP3;
type
TMail = class(TForm)
OpenDialog: TOpenDialog;
SMTP1: TSMTP;
POP1: TPOP;
PageControl1: TPageControl;
SendPage: TTabSheet;
RecvPage: TTabSheet;
ConPage: TTabSheet;
Panel1: TPanel;
Label1: TLabel;
Label3: TLabel;
Label2: TLabel;
eTo: TEdit;
eCC: TEdit;
eSubject: TEdit;
SendBtn: TButton;
ClearBtn: TButton;
reMessageText: TRichEdit;
SMTPStatus: TStatusBar;
Panel3: TPanel;
mReadMessage: TMemo;
POPStatus: TStatusBar;
cbSendFile: TCheckBox;
GroupBox1: TGroupBox;
ePOPServer: TEdit;
Label6: TLabel;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17