2012-04-20 3 views
4

Я хочу, чтобы проверить, если элемент был выбран в ListBox, когда пользователь нажимает на этикетке
, если я исполняю так я получил эту ошибку list index out of bounds
проверить, если элемент был выбран в ListBox

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; 

ответ

4

Этот код

if Selected then 

не будет компилироваться, так как Selected строка. Думаю, вы экспериментировали, прежде чем публиковать это.

Все одинаковые сообщения об ошибках, а заголовок вопроса предполагает, что ListBox1.ItemIndex равно -1. Следовательно, ошибка индекса индекса за пределами ошибки.

Вам необходимо добавить чек, чтобы ListBox1.ItemIndex не был первым перед чтением из списка. ItemIndex=-1 - способ обнаружения того, что элемент не выбран. Поэтому Ваш код должен выглядеть следующим образом:

..... 
saveDialog.DefaultExt := 'txt'; 
saveDialog.FilterIndex := 1; 
if ListBox1.ItemIndex <> -1 then 
begin 
..... 
+0

это я пробовал много вещей, чтобы проверить 'Selected', как' if Selected <> '' ', и закончил с этим becasue, я не знал, как его протестировать, в любом случае спасибо –

2

Этот возникает, если в списке не выбрано ничего.

Try Использование:

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; 
+0

Если вы упомянули мой код говорит 'если ListBox1.ItemIndex> = 0 '(больше или равно 0), и, как вы знаете,' ItemIndex' имеет тип 'Integer 'и нет другого целочисленного значения между -1 и 0, поэтому' ItemIndex> = 0' определенно равно 'ItemIndex> -1';) –

+0

Но его гораздо труднее прочитать, и это не так, как обычно написано , Проводка кода, которую сложнее читать, никогда не бывает хорошей, особенно когда вы публикуете ее для кого-то, кто, очевидно, совершенно незнакомо с языком. Вы правы; технически это не так, и я удалю свой комментарий. (Тем не менее, нужно дать Давиду преимущество).) То, что вы написали, эквивалентно написанию 'if (something = true) и (something <> false) then' - это избыточный, бесполезный тест. 'if ItemIndex> -1' является одним и тем же тестом и имеет гораздо более четкое значение. –

+0

Как вы уже упоминали в своем первом комментарии, 'ItemIndex' основан на нулевом уровне, поэтому было бы не« труднее прочитать », если вы сравните его с нолем, а не с -1. ;) –

Смежные вопросы