Delphi Indy从列表框下载所选文件

Delphi Indy从列表框下载所选文件,delphi,indy,Delphi,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.Select

我从来没有用过印地,现在正在努力学习基础知识。我花了一些时间弄清楚如何填充列表框。既然我已经这样做了,我如何才能下载列表框中所选的文件? 我试过:

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错误]FTP_Form.pas(75):E2250没有重载版本 可以使用这些参数调用的“Get”的


还是我也需要使用保存对话框?请帮我做这个。:)

列表框1.所选[i]
是一个
布尔值。请注意,您在前一行中写道:

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]

您想对下载的内容做什么?记住它?是否将其保存到文件?还有别的吗?你提供的目的地取决于你对这些问题的回答

我给你的建议是暂时将列表框放在一边,编写一个简单的程序,一个没有任何UI的程序,只需从FTP服务器下载一个文件。使用本地文件名或
TFileStream
将下载的内容保存到本地磁盘。检查内容是否符合预期。一旦可以下载一个文件,就可以将任意数量的文件下载到其他类型的目的地

一旦掌握了这一点,就转到用户界面。花一些时间学习ListBox控件如何工作、如何填充它、如何从中读回字符串、如何测试选择,等等


只有当你对所有涉及的部分都有了很好的理解,你才应该尝试将它们组合在一起。

ListBox1。选中的[i]
是一个
布尔值。请注意,您在前一行中写道:

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]

您想对下载的内容做什么?记住它?是否将其保存到文件?还有别的吗?你提供的目的地取决于你对这些问题的回答

我给你的建议是暂时将列表框放在一边,编写一个简单的程序,一个没有任何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;
单程

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;

假设列表框包含要下载的远程文件名(例如在调用
TIdFTP.List()
)后从
TIdFTP.DirectoryListing
属性下载):


假设列表框包含要下载的远程文件名(例如在调用
TIdFTP.List()
)后从
TIdFTP.DirectoryListing
属性下载):


如何将ListBox1.Selected[i]转换为字符串,以便使用它?它是一个
布尔值。这意味着它可以有两个值之一,
False
True
。是否确实要将其转换为字符串?我决定使用savedialog,因此需要将listbox项的值作为savedialog.filename传递。我建议您阅读我答案的第二部分。你犯了一个常见的初学者错误,就是试图在一个完整的程序中解决你的问题。把问题分解。首先,找出如何获得文件名。在给定文件名的情况下,分别计算如何下载文件。将这些任务分开。将它们分解为不同的方法。@user3351050:这不是将ListBox1.Selected[i]转换为字符串的问题,而是如何获取与此布尔值对应的字符串的问题。使用联机帮助。如何将ListBox1.Selected[i]转换为字符串以便使用?它是一个
布尔值。这意味着它可以有两个值之一,
False
True
。是否确实要将其转换为字符串?我决定使用savedialog,因此需要将listbox项的值作为savedialog.filename传递。我建议您阅读我答案的第二部分。你犯了一个常见的初学者错误,就是试图在一个完整的程序中解决你的问题。把问题分解。首先,找出如何获得文件名。在给定文件名的情况下,分别计算如何下载文件。将这些任务分开。将它们分解为不同的方法。@user3351050:这不是将ListBox1.Selected[i]转换为字符串的问题,而是如何获取与此布尔值对应的字符串的问题。使用联机帮助。