📄 c14_4f.cpp
字号:
//----------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include <shellapi.hpp>
#include "C14_4f.h"
#include "usrinfo.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
String __fastcall TMainForm::NodePath(TTreeNode *Node)
{ // 该函数用于返回当前节点的路径
if (Node == Root)
return ".";
else
return NodePath(Node->Parent) + "/" + Node->Text;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ConnectBtnClick(TObject *Sender)
{ // 单击“连接”按钮(或选择“连接”菜单项)执行该程序
if (FTP->State == prcConnected) Disconnect();
ConnectForm = new TConnectForm(this); // 创建用于输入对话框
if (ConnectForm->ShowModal() == mrOk) // 有模式显示对话框
{ // 用户确定连接
FTP->UserId = ConnectForm->UserNameEdit->Text; // 设置用户名
FTP->Password = ConnectForm->PasswordEdit->Text; // 设置口令
FTP->RemoteHost = ConnectForm->RemoteHostEdit->Text; // 设置远程主机地址
FTP->RemotePort = ConnectForm->RemotePortEdit->Text.ToInt(); // 设置端口号
// ToInt() 成员函数用于将字符串转换为整数
FTP->Connect(FTP->RemoteHost, FTP->RemotePort); // 申请连接
Root = DirTree->Items->AddChild(NULL, FTP->RemoteHost); // 增加当前连接节点
Root->ImageIndex = FTPServer; // 设置节点位置
Root->SelectedIndex = FTPServer;
DirTree->Selected = Root; // 设置目录位置
}
delete ConnectForm; // 删除对话框对象实例。
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FileExitItemClick(TObject *Sender)
{ // 结束程序,用户选择“文件”菜单的“退出”项执行该程序
FTP->Quit(); // 结束 FTP 控件
Application->ProcessMessages(); // 处理消息
while (FTP->Busy)
Application->ProcessMessages();
Close(); // 关闭主窗体
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ViewSmallItemClick(TObject *Sender)
{ // 显示小图标
FileList->ViewStyle = vsSmallIcon;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ViewRefreshItemClick(TObject *Sender)
{ // 刷新窗口
DirTreeChange(NULL, DirTree->Selected);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ViewListItemClick(TObject *Sender)
{ // 显示文件列表
FileList->ViewStyle = vsList;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ViewLargeItemClick(TObject *Sender)
{ // 显示大图标,选择“查看”菜单的“大图标”项执行该程序
FileList->ViewStyle = vsIcon;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ViewDetailsItemClick(TObject *Sender)
{ // 显示文件细节
FileList->ViewStyle = vsReport;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ToolsDisconnectItemClick(TObject *Sender)
{ // 结束连接。用户选择“工具”菜单的“断开”项执行该程序
Disconnect();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::RefreshBtnClick(TObject *Sender)
{ // 刷新
FileList->Items->Clear();
FTP->List(NodePath(DirTree->Selected));
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PasteFromItemClick(TObject *Sender)
{ // 用户选择弹出菜单的“粘贴”项执行该程序
if (OpenDialog1->Execute()) // 显示打开文件对话框
// 发送文件
FTP->PutFile(OpenDialog1->FileName, NodePath(DirTree->Selected));
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{ // 窗体关闭时(执行Close方法后),执行该程序
FTP->Cancel(); // 取消 FTP 操作
FTP->Quit(); // 结束 FTP
while(FTP->Busy)
Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{ // 程序开始运行时(创建主窗体),执行该程序
TSHFileInfo SHFileInfo;
// 初始化程序设置
DirTree->Images = SmallImages;
SmallImages->ResourceLoad(rtBitmap, "IMAGES", clOlive);
FileList->SmallImages = new TImageList(16, 16);
FileList->SmallImages->ShareImages = true;
FileList->SmallImages->Handle = SHGetFileInfo("*.*", 0, &SHFileInfo,
sizeof(SHFileInfo), SHGFI_SMALLICON|SHGFI_ICON|SHGFI_SYSICONINDEX);
FileList->LargeImages = new TImageList(32, 32);
FileList->LargeImages->ShareImages = true;
FileList->LargeImages->Handle = SHGetFileInfo("*.*", 0, &SHFileInfo,
sizeof(SHFileInfo), SHGFI_LARGEICON|SHGFI_ICON|SHGFI_SYSICONINDEX);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FTPBusy(TObject *Sender, WordBool isBusy)
{ // 当 FTP 开始忙或开始空闲时,触发该事件
if(isBusy)
{ // FTP 忙
Screen->Cursor = crHourGlass; // 设置光标
FileList->Items->BeginUpdate(); // 更新列表
Previous = RefreshBtn->Enabled;
RefreshBtn->Enabled = false;
}
else
{ // FTP 空闲
Screen->Cursor = crDefault; // 设置光标
FileList->Items->EndUpdate(); // 停止更新
RefreshBtn->Enabled = Previous;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FTPListItem(TObject *Sender, const Variant &Item)
{ // FTP 完成文件列表传输
TTreeNode *Node;
String filename((String)Item.OlePropertyGet("Filename"));
String Date((String)Item.OlePropertyGet("Date"));
int Attributes(Item.OlePropertyGet("Attributes"));
int Size(Item.OlePropertyGet("Size"));
CreateItem(filename, Attributes, Size, Date);
StatusBar->Panels->Items[1]->Text = " " + FTP->ReplyString;
if (Attributes == 1)
{
if (DirTree->Selected != NULL)
{
if (DirTree->Selected !=NULL)
Node = DirTree->Selected->getFirstChild();
else
Node = NULL;
while(Node)
if (CompareText(Node->Text, filename) == 0)
return;
else
Node = DirTree->Selected->GetNextChild(Node);
if (!Node)
{
Node = DirTree->Items->AddChild(DirTree->Selected, filename);
Node->ImageIndex = Folder;
Node->SelectedIndex = OpenFolder;
}
}
else
DirTree->Items->AddChild(Root, filename);
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FTPProtocolStateChanged(TObject *Sender,
short ProtocolState)
{
switch(ProtocolState)
{
case ftpAuthentication:
FTP->Authenticate(FTP->UserId, FTP->Password);
break;
case ftpTransaction:
FTP->List("/");
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FTPStateChanged(TObject *Sender, short State)
{ // FTP 状态改变时,触发该事件
switch(State)
{
case prcConnecting : // 开始连接
StatusBar->Panels->Items[0]->Text = "正在连接...";
break;
case prcResolvingHost : // 正在解析主机名(将主机名转换为 IP 地址)
StatusBar->Panels->Items[0]->Text = "正在解析IP地址...";
break;
case prcHostResolved : // 完成主机名解析
StatusBar->Panels->Items[0]->Text =
"找到主机 !";
break;
case prcConnected:
{ // 实现连接
StatusBar->Panels->Items[0]->Text = "连接到: " + FTP->RemoteHost;
ConnectBtn->Hint = "断开";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -