Indy 从列表框中下载选定的文件
Indy download selected file from the listbox
我从未使用过 Indy,正在努力学习基础知识。我花了一些时间弄清楚如何填充列表框。现在我已经完成了,我怎样才能在列表框中下载选定的文件?
我试过了:
procedure TFTP.Button2Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do begin
if ListBox1.Selected[i] then begin
IdFTP1.Get(listbox1.Selected[i]);
end;
end;
end;
但我得到了:
[dcc32 Error] FTP_Form.pas(75): E2250 There is no overloaded version
of 'Get' that can be called with these arguments
或者我是否也需要使用保存对话框?请帮我解决一下这个。 :)
ListBox1.Selected[i]
是一个 Boolean
。请注意,您在上一行中写道:
if ListBox1.Selected[i] then begin
现在,看看 TIdFTP.Get()
方法。它有两个重载:
procedure Get(const ASourceFile: string; ADest: TStream;
AResume: Boolean = false); overload;
procedure Get(const ASourceFile, ADestFile: string; const ACanOverwrite: boolean = false;
AResume: Boolean = false); overload;
您需要提供:
- 您要下载的远程文件的源文件名。
- 接收远程文件内容的目标文件名或流。
我不知道你打算从哪里得到这些。据推测,文件名来自 ListBox,因此应该是 ListBox1.Items[i]
.
您想对下载的内容做什么?留在记忆中?保存到文件?还有别的吗?您提供的目的地取决于您对这些问题的回答。
我对你的建议是暂时将 ListBox 放在一边,编写一个更简单的程序,一个没有任何 UI 的程序,它只是从 FTP 服务器下载一个文件.使用本地文件名或 TFileStream
将下载的内容保存到本地磁盘。检查内容是否符合您的预期。一旦可以下载一个文件,就可以将任意数量的文件下载到其他类型的目的地。
一旦你掌握了它,就可以继续使用用户界面了。花一些时间了解 ListBox 控件的工作原理、如何填充它、如何从中读回字符串、如何测试选择等等。
只有当你对所涉及的所有部分都有很好的了解时,你才应该尝试将它们组合在一起。
一种方式....
procedure TFTP.Button2Click(Sender: TObject);
Var
Name{, Line}: String;
begin
Name := IdFTP1.DirectoryListing.Items[ListBox1.ItemIndex].FileName;
SaveDialog1.FileName := Name;
if SaveDialog1.Execute then begin
IdFTP1.Get(Name, SaveDialog1.FileName, true);
end;
end;
假设 ListBox 包含要下载的远程文件名(例如从 TIdFTP.DirectoryListing
属性 调用 TIdFTP.List()
后):
procedure TFTP.Button2Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
begin
if ListBox1.Selected[i] then begin
IdFTP1.Get(ListBox1.Items[i], 'C:\Some Local Path\' + ListBox1.Items[i]);
end;
end;
end;
我从未使用过 Indy,正在努力学习基础知识。我花了一些时间弄清楚如何填充列表框。现在我已经完成了,我怎样才能在列表框中下载选定的文件? 我试过了:
procedure TFTP.Button2Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do begin
if ListBox1.Selected[i] then begin
IdFTP1.Get(listbox1.Selected[i]);
end;
end;
end;
但我得到了:
[dcc32 Error] FTP_Form.pas(75): E2250 There is no overloaded version of 'Get' that can be called with these arguments
或者我是否也需要使用保存对话框?请帮我解决一下这个。 :)
ListBox1.Selected[i]
是一个 Boolean
。请注意,您在上一行中写道:
if ListBox1.Selected[i] then begin
现在,看看 TIdFTP.Get()
方法。它有两个重载:
procedure Get(const ASourceFile: string; ADest: TStream;
AResume: Boolean = false); overload;
procedure Get(const ASourceFile, ADestFile: string; const ACanOverwrite: boolean = false;
AResume: Boolean = false); overload;
您需要提供:
- 您要下载的远程文件的源文件名。
- 接收远程文件内容的目标文件名或流。
我不知道你打算从哪里得到这些。据推测,文件名来自 ListBox,因此应该是 ListBox1.Items[i]
.
您想对下载的内容做什么?留在记忆中?保存到文件?还有别的吗?您提供的目的地取决于您对这些问题的回答。
我对你的建议是暂时将 ListBox 放在一边,编写一个更简单的程序,一个没有任何 UI 的程序,它只是从 FTP 服务器下载一个文件.使用本地文件名或 TFileStream
将下载的内容保存到本地磁盘。检查内容是否符合您的预期。一旦可以下载一个文件,就可以将任意数量的文件下载到其他类型的目的地。
一旦你掌握了它,就可以继续使用用户界面了。花一些时间了解 ListBox 控件的工作原理、如何填充它、如何从中读回字符串、如何测试选择等等。
只有当你对所涉及的所有部分都有很好的了解时,你才应该尝试将它们组合在一起。
一种方式....
procedure TFTP.Button2Click(Sender: TObject);
Var
Name{, Line}: String;
begin
Name := IdFTP1.DirectoryListing.Items[ListBox1.ItemIndex].FileName;
SaveDialog1.FileName := Name;
if SaveDialog1.Execute then begin
IdFTP1.Get(Name, SaveDialog1.FileName, true);
end;
end;
假设 ListBox 包含要下载的远程文件名(例如从 TIdFTP.DirectoryListing
属性 调用 TIdFTP.List()
后):
procedure TFTP.Button2Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
begin
if ListBox1.Selected[i] then begin
IdFTP1.Get(ListBox1.Items[i], 'C:\Some Local Path\' + ListBox1.Items[i]);
end;
end;
end;