2016-04-05 8 views
-1

Я работаю с Delphi 10 Seattle DX Studio. Я devoloping приложение, в котором я использую ListBox. Я хочу удалить выбранные элементы в своем ListBox, но у меня есть проблема с этим кодом. Когда я запускаю этот код, я получаю сообщение об ошибке «Тип выражения должен быть логическим», несмотря на то, что мой код имеет правильный синтаксис. Ваши ответы будут оценены.Delphi Error ListBox

procedure TForm1.Button2Click(Sender: TObject); 
var 
    ii : integer; 
begin 
    with ListBox1 do 
    for ii := -1 + Items.Count downto 0 do 
     if Selected[ii] then Items.Delete(ii) ; 
end; 
end; 
+0

На какой линии находится отладчик? –

+1

Этот код отлично работает для меня: 'var i: Integer; begin for i: = ListBox1.Items.Count - 1 downto 0 do, если ListBox1.Selected [i] then ListBox1.Items.Delete (i); конец; '. –

+0

Проблема с ** Selected [ii] ** – Dominikis

ответ

3

Ваш код (который я подозреваю, что отличается от того, в вопросе) не имеет правильный синтаксис, который является то, что компилятор говорит вам.

Тот факт, что ваш код отличается от кода, который мы видим в вопросе, и что мы не можем сказать, используете ли вы VCL или FMX, делает этот вопрос несколько сомнительным. В другой день я, вероятно, проголосую за закрытие как не по теме, но сегодня я буду пахать независимо, что, вероятно, неосмотрительно. Вот оно.

Код в вопросе (почти) действительный код VCL. Существует дополнительный end, и я могу только предположить, что это ошибка транскрипции. Очевидно, что ваш фактический код не выглядит так, потому что вы не будете так отступать.

Ваш код недопустим Код FMX, даже после того, как бродячий end удален. Объекты компилятора в Selected[ii] с:

[dcc32 Error]: E2149 Класс не обладает свойством по умолчанию

Это другая ошибка от одного вы сообщили. Причиной ошибки является то, что Selected является неиндексированным свойством типа TListBoxItem.

Я думаю, что действительно происходит то, что код в вопросе отличается от кода, который вы пытаетесь скомпилировать. Код, который вы пытаетесь скомпилировать, недействителен. Как правило, когда компилятор сообщает вам, что ваш код недействителен, вы должны поверить в это, даже если вы не можете сразу его понять.

Ваша жизнь станет намного проще при прекращении использования with. Every time you use with, a puppy dies. Кроме того, ваше пространство имен расширяется с часто неожиданными и непредсказуемыми результатами, поскольку имена из внутреннего пространства имен скрывают их от внешнего пространства имен.

Хотя ясно, что -1 + Items.Count - это то же самое, что и Items.Count - 1, вам придется искать по всему миру, чтобы найти программиста, который бы написал первый. Вы могли бы продолжать это делать, но вы будете плавать против прилива. Ваш код будет выглядеть иначе, чем любой другой код, и будет большой импеданс для любых других читателей вашего кода. Я предлагаю вам пойти с потоком на этом.

+1

Бедные, бедные щенки: -/ –

+0

* щенкам не было нанесено вреда при написании этого кода *. :) Это пример, где * все * в * с * является прямой ссылкой на внутреннюю область или простую переменную цикла. Проблемы с 'with' [sic] возникают при использовании как внутренних, так и * более широких областей. Или с отладчиком.Итог: использование 'with' было совершенно не связано с проблемой в вопросе. Поднять это чистая догма. Что не означает, что 'с' не может потенциально повредить. Это очень мало. ;) – Deltics

+0

Кстати, я всегда использую 'Pred()', а не '' -1'. ime намного легче пропустить отсутствующий * tail-end * '-1' при чтении кода (активность слева направо). Подобная причина может вдохновить этот подход «-1 +». Он ставит 0-базовую настройку вверх, более заметно, делая ее (возможно) более вероятно зарегистрированной, когда она * не * там. Я согласен, что это необычно, но это не обязательно плохо. В конце концов, «Going with the flow» - это основной принцип, который приводит к ** Cargo Cultism **. – Deltics