Как я могу установить текущий индекс элемента со списком Delphi, используя метод IndexOfObject с информацией об объекте

Я заполнил объект TStringList, как показано ниже:

var
infoObject: TStringObject;
dataObject: TStringList

_query.First;
for i := 0 to _query.RecordCount-1 do
begin
  infoObject := TStringObject.Create;
  infoObject.stringsData.Add(_query.Fields[0].AsString);
  dataObject.AddObject(_query.Fields[1].AsString, infoObject);

  _query.Next;
end;

а затем используйте его для заполнения comboBox следующим образом:

combo1.Items.Clear;
combo1.Items.AddStrings(dataObject);

Теперь я хочу установить элемент comboBox itemIndex с равным строковым значением из БД. Я знаю, что в обычном сценарии, когда у меня есть текст, который отображается в поле со списком, использование IndexOf поможет мне так:

combo1.ItemIndex := combo1.Items.IndexOf('[text of item]');

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

itemObject := TStringObject.Create;
itemObject.stringsData.Add('[value of item]');
combo1.ItemIndex := combo1.Items.IndexOfObject(itemObject);

Кто-нибудь может помочь? Следует упомянуть, что я использую Delphi 2007 и Raize Componenet ComboBox.


person QMaster    schedule 23.07.2015    source источник
comment
Второй экземпляр itemObject (созданный в вашем последнем блоке кода) не будет существовать в Objects. Первый (созданный в цикле в вашем первом блоке кода) будет иметь другой адрес памяти, и поэтому IndexOfObject вернет -1. Похоже, вы пытаетесь найти тот, который соответствует определенному текстовому значению, но я не уверен, так ли это.   -  person Ken White    schedule 23.07.2015
comment
@KenWhite Ты улучшаешь мое восприятие, спасибо, чувак.   -  person QMaster    schedule 24.07.2015


Ответы (1)


Вы не храните указатели объектов в самом ComboBox, поэтому вы не можете использовать собственный метод IndexOfObject() ComboBox. В любом случае это не сработает, потому что IndexOfObject() ищет указатель на объект, а вы вместо этого ищете текст. Вам придется повторить TStringList поиск текста объекта вручную, например:

var
  dataObject: TStringList;

function IndexOfObjectText(const S: String): Integer;
var
  I : Integer;
begin
  Result := -1;
  for I := 0 to dataObject.Count-1 do
  begin
    if TStringObject(dataObject.Objects[I]).stringData.IndexOf(S) <> -1 then
    begin
      Result := I;
      Exit;
    end;
  end;
end;

Тогда вы можете сделать это:

combo1.ItemIndex := IndexOfObjectText('[value of item]');
person Remy Lebeau    schedule 23.07.2015
comment
Это правильно и сработало для меня. Оцените, и я иду, чтобы использовать его. Я приму это как ответ, но, пожалуйста, сообщите мне об использовании IndexOfObject() для поиска элемента с указателем объекта, как вы упомянули, если это редкий сценарий. Спасибо еще раз. - person QMaster; 24.07.2015
comment
Нет смысла возиться с IndexOfObject(), так как вы нигде не храните указатели на объекты, которые вы можете получить, а затем искать их в одном из ваших списков. - person Remy Lebeau; 24.07.2015