end;
procedure TMyFtp.FileDeleteItemClick(Sender: TObject);
begin
if (DirTree.Selected <> nil) and (FileList.Selected <> nil) then
FTP.DeleteFile(FileList.Selected.Caption);
procedure TMyFtp.FTPListItem(Sender: TObject; const Item: FTPDirItem);
var
Node: TTreeNode;
CreateItem(Item.FileName, Item.Attributes, Item.Size, Item.Date);
if Item.Attributes = 1 then
if DirTree.Selected <> nil then
Node := DirTree.Selected.GetFirstChild
else
Node := nil;
while Node <> nil do
if AnsiCompareFileName(Node.Text, Item.FileName) = 0 then
exit
Node := DirTree.Selected.GetNextChild(Node);
if Node = nil then
Node := DirTree.Items.AddChild(DirTree.Selected,
Item.FileName);
Node.ImageIndex := Folder;
Node.SelectedIndex := OpenFolder;
end
DirTree.Items.AddChild(Root, Item.FileName);
end.
файл nntp.pas
unit nntp;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, OleCtrls, StdCtrls, ComCtrls, ExtCtrls, Buttons, ActiveX, isp3;
const
efListGroups = 0;
efGetArticleHeaders = 1;
efGetArticleNumbers = 2;
efGetArticle = 3;
type
TNewsForm = class(TForm)
NNTP1: TNNTP;
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
N1: TMenuItem;
FileDisconnectItem: TMenuItem;
FileConnectItem: TMenuItem;
Panel1: TPanel;
Bevel1: TBevel;
StatusBar: TStatusBar;
SmallImages: TImageList;
Panel2: TPanel;
NewsGroups: TTreeView;
Bevel2: TBevel;
Panel3: TPanel;
Memo1: TMemo;
Panel5: TPanel;
Panel4: TPanel;
ConnectBtn: TSpeedButton;
RefreshBtn: TSpeedButton;
Bevel3: TBevel;
MsgHeaders: TListBox;
Label1: TLabel;
Label2: TLabel;
procedure FileConnectItemClick(Sender: TObject);
procedure NNTP1ProtocolStateChanged(Sender: TObject;
ProtocolState: Smallint);
procedure NNTP1StateChanged(Sender: TObject; State: Smallint);
procedure Exit1Click(Sender: TObject);
procedure MsgHeadersDblClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure NewsGroupsChange(Sender: TObject; Node: TTreeNode);
procedure RefreshBtnClick(Sender: TObject);
procedure FileDisconnectItemClick(Sender: TObject);
procedure NNTP1Banner(Sender: TObject; const Banner: WideString);
procedure NNTP1DocOutput(Sender: TObject; const DocOutput: DocOutput);
procedure NNTP1Error(Sender: TObject; Number: Smallint;
var Description: WideString; Scode: Integer; const Source,
HelpFile: WideString; HelpContext: Integer;
var CancelDisplay: WordBool);
procedure NNTP1SelectGroup(Sender: TObject;
const groupName: WideString; firstMessage, lastMessage,
msgCount: Integer);
private
EventFlag: Integer;
function NodePath(Node: TTreeNode): String;
public
Data: String;
NewsForm: TNewsForm;
Remainder: String;
Nodes: TStringList;
CurrentGroup: String;
GroupCount: Integer;
implementation
uses Connect;
{$R *.DFM}
{ TParser }
TToken = (etEnd, etSymbol, etName, etLiteral);
TParser = class
FFlags: Integer;
FText: string;
FSourcePtr: PChar;
FSourceLine: Integer;
FTokenPtr: PChar;
FTokenString: string;
FToken: TToken;
procedure SkipBlanks;
procedure NextToken;
constructor Create(const Text: string; Groups: Boolean);
sfAllowSpaces = 1;
constructor TParser.Create(const Text: string; Groups: Boolean);
FText := Text;
FSourceLine := 1;
FSourcePtr := PChar(Text);
if Groups then
FFlags := sfAllowSpaces
FFlags := 0;
NextToken;
procedure TParser.SkipBlanks;
while True do
case FSourcePtr^ of
#0:
if FSourcePtr^ = #0 then Exit;
Continue;
#10:
Inc(FSourceLine);
#33..#255:
Exit;
Inc(FSourcePtr);
procedure TParser.NextToken;
P, TokenStart: PChar;
SkipBlanks;
FTokenString := '';
P := FSourcePtr;
while (P^ <> #0) and (P^ <= ' ') do Inc(P);
FTokenPtr := P;
case P^ of
'0'..'9':
TokenStart := P;
Inc(P);
while P^ in ['0'..'9'] do Inc(P);
SetString(FTokenString, TokenStart, P - TokenStart);
FToken := etLiteral;
#13: Inc(FSourceLine);
FToken := etEnd;
if FFlags = sfAllowSpaces then
while not (P^ in [#0, #13, ' ']) do Inc(P)
while not (P^ in [#0, #13]) do Inc(P);
FToken := etSymbol;
FSourcePtr := P;
function FirstItem(var ItemList: ShortString): ShortString;
P: Integer;
P := AnsiPos('.', ItemList);
if P = 0 then
Result := ItemList;
P := Length(ItemList);
Result := Copy(ItemList, 1, P - 1);
Delete(ItemList, 1, P);
procedure AddItem(GroupName: ShortString);
Index, i: Integer;
Groups: Integer;
Item: ShortString;
TheNodes: TStringList;
Groups := 1;
for i := 0 to Length(GroupName) do
if GroupName[i] = '.' then
Inc(Groups);
TheNodes := Nodes;
for i := 0 to Groups - 1 do
Item := FirstItem(GroupName);
Index := TheNodes.IndexOf(Item);
if Index = -1 then
Index := TheNodes.AddObject(Item, TStringList.Create);
TheNodes := TStringList(TheNodes.Objects[Index]);
TheNodes.Sorted := True;
Inc(GroupCount);
procedure ParseGroups(Data: String);
Parser: TParser;
OldSrcLine: Integer;
Parser := TParser.Create(Data, True);
OldSrcLine := 0;
while Parser.FToken <> etEnd do
if Parser.FSourceLine <> OldSrcLine then
AddItem(Parser.FTokenString);
OldSrcLine := Parser.FSourceLine;
Parser.NextToken;
procedure ParseHeaders(Data: String);
MsgNo: LongInt;
Header: String;
Parser := TParser.Create(Data, False);
MsgNo := StrToInt(Parser.FTokenString);
Header := '';
while (OldSrcLine = Parser.FSourceLine) do
Header := Header + ' ' + Parser.FTokenString;
if Parser.FToken = etEnd then
Break;
NewsForm.MsgHeaders.Items.AddObject(Header, Pointer(MsgNo));
procedure DestroyList(AList: TStringList);
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17