TStrings vs TStringList в TCheckListBox - PullRequest
       5

TStrings vs TStringList в TCheckListBox

3 голосов
/ 11 декабря 2011

В Delphi 7 я использую TCheckListBox. Я хочу, чтобы он использовал TStringList, а не TStrings, поэтому я могу установить для Duplicates значение dupIgnore и Sorted to TRUE.

Могу ли я просто сделать это:

Form1 = class(TObject
    CheckListBox1: TCheckListBox;  // created by the IDE
end;

procedure TForm1.FormCreate
begin
   CheckListBox1.Items.Free;
   CheckListBox1.Items := TStringList.Create;
   CheckListBox1.Items.Sorted := TRUE;
   CheckListBox1.Items.Duplicates := dupIgnore;
end;

Это безопасно? Любые предостережения или предложения?

РЕДАКТИРОВАТЬ: Удалено объявление для MyStringList и добавлены. Элементы в две последние строки назначения.

РЕДАКТИРОВАТЬ 2: Попытка скомпилировать выше, похоже, что мне нужно было бы бросить две последние строки, как это:

        TStringList(CheckListBox1.Items).Sorted := TRUE;
        TStringList(CheckListBox1.Items).Duplicates := dupIgnore;

Хотя я мог бы заставить это работать, я задаю вопрос, потому что просто запустить его не значит, что он всегда будет работать или безопасен.

1 Ответ

8 голосов
/ 11 декабря 2011

Вы не контролируете, какой класс TCheckListBox использует для хранения своих предметов. Присвоение свойству Items значения присваивает его элементам только внутреннее хранилище.

Кроме того, вы не должны звонить Items.Free;. TCheckListBox зависит от его внутреннего экземпляра TListBoxStrings.

Чтобы ответить на ваши правки в вашем вопросе: не следует также жестко приводить свойство Items к TStringList. Типовое преобразование неверно (экземпляр, представленный Items, не является TStringList) и вызовет только проблемы.

Отредактируйте, чтобы предложить обходной путь для достижения того, чего вы, кажется, пытаетесь достичь: чтобы сохранить сортировку контрольного списка, вы можете установить его свойство Sorted в True. Чтобы избежать дубликатов, вы можете проверить список перед добавлением элемента в код.

...