我想检查用户点击标签时是否在ListBox中选择了一个项目
如果我这样执行我得到了这个错误list index out of bounds
procedure TfrMain.Label15Click(Sender: TObject);
var
saveDialog : TSaveDialog;
FileContents: TStringStream;
saveLine,Selected : String;
begin
saveDialog := TSaveDialog.Create(self);
saveDialog.Title := 'Save your text or word file';
saveDialog.InitialDir := GetCurrentDir;
saveDialog.Filter := 'text file|*.txt';
saveDialog.DefaultExt := 'txt';
saveDialog.FilterIndex := 1;
Selected := ListBox1.Items.Strings[ListBox1.ItemIndex];
if Selected <> '' then
begin
if saveDialog.Execute then
begin
FileContents := TStringStream.Create('', TEncoding.UTF8);
FileContents.LoadFromFile(ListBox1.Items.Strings[ListBox1.ItemIndex]);
FileContents.SaveToFile(saveDialog.Filename);
ShowMessage('File : '+saveDialog.FileName)
end
else ShowMessage('Save file was not succesful');
saveDialog.Free;
end;
end;
答案 0 :(得分:5)
此代码
if Selected then
将无法编译,因为Selected
是一个字符串。我猜你在发布之前就在试验。
所有相同的错误消息和问题标题表明ListBox1.ItemIndex
等于-1。因此列表索引超出界限错误。
在从列表框中读取之前,您需要添加ListBox1.ItemIndex
不是-1的检查。 ItemIndex=-1
是您检测到没有选择任何项目的方式。因此,您的代码应如下所示:
.....
saveDialog.DefaultExt := 'txt';
saveDialog.FilterIndex := 1;
if ListBox1.ItemIndex <> -1 then
begin
.....
答案 1 :(得分:2)
如果列表框中未选择任何内容,则会发生这种情况。
尝试使用:
procedure TfrMain.Label15Click(Sender: TObject);
var
saveDialog : TSaveDialog;
FileContents: TStringStream;
saveLine,Selected : String;
begin
saveDialog := TSaveDialog.Create(self);
saveDialog.Title := 'Save your text or word file';
saveDialog.InitialDir := GetCurrentDir;
saveDialog.Filter := 'text file|*.txt';
saveDialog.DefaultExt := 'txt';
saveDialog.FilterIndex := 1;
if ListBox1.ItemIndex >= 0 then
begin
Selected := ListBox1.Items.Strings[ListBox1.ItemIndex]
if saveDialog.Execute then
begin
FileContents := TStringStream.Create('', TEncoding.UTF8);
FileContents.LoadFromFile(Selected);
FileContents.SaveToFile(saveDialog.Filename);
ShowMessage('File : '+saveDialog.FileName)
end
else ShowMessage('Save file was not succesful');
saveDialog.Free;
end;
end;