Я не уверен, правильно ли я это делаю. У меня есть список объектов в списке, и мне нужно использовать IndexOf, чтобы получить индекс объекта в списке.
if AlarmListBox.items.indexOf(alrm.Tagname) = -1 then
alrm - это объект класса TAlarm.
На основе вопроса StackOverflow C # (Как Могу ли я получить индекс элемента в ListBox?), я пытаюсь переопределить метод GetHashCode и Equals, но он все равно не работает.
Метод переопределения:
TAlarm = class(System.Object)
TagName:string;
private
protected
public
method Equals(obj:System.Object):Boolean; override;
method GetHashCode:Int32; Override;
end;
method TAlarm.Equals(obj: system.Object):Boolean;
begin
result := TAlarm(obj).Tagname.Equals(self.Tagname);
end;
method TAlarm.GetHashCode:Int32;
begin
result := self.GetHashCode;
end;
Вот как я заполняю AlarmListBox:
AlmGrp:= new TAlarmGroup;
AlarmListBox.items.Add(AlmGrp);
Компилятор компилируется без ошибок, но когда я построчно отлаживаю программу, он всегда возвращает -1, а эти переопределенные методы никогда не вызываются и не запускаются.
Правильно ли я реализую эти переопределения? Если нет, как мне их переопределить?
Будем признательны за образец кода, подсказки или подсказки. Спасибо,
ОБНОВЛЕНИЕ: Дэвиду Хеффернану и другим, кто прокомментировал или ответил, я думаю, что проблема может заключаться в том, что я передаю два разных объекта, как говорится в последнем комментарии Роба. Я заполняю Listbox (UI) с помощью TAlarmGroup, но передаю TAlarm в IndexOf, хотя оба они являются идентичными классами. Это наверное моя проблема. Что я действительно пытаюсь сделать, так это заполнить Listbox объектами TAlarmGroup и через listbox.indexof, передав строку (Tagname), которую я ищу для местоположения объекта. Вот как это сделано в Delphi XE, он отлично работает. Приведенный выше код не является фактическим кодом. Как только я устраню путаницу в своем коде, он, вероятно, будет работать без переопределения методов GetHashcode и Equals.
ОБНОВЛЕНИЕ: Думаю, я кое-что здесь наткнулся. В Delphi XE или более ранней версии ListBox (UI) предоставляет метод под названием AddObject. Его параметры - это строка и объект соответственно. Итак, когда я заполнил объекты в список, я также предоставил строку, которая будет им соответствовать. Когда я искал, я вводил строку или имя группы сигналов тревоги. IndexOf произвел поиск в этой строке по строке, которую он имел для каждого предоставленного мной объекта, а не по полю объекта (TagName). В Delphi Prism у listbox нет метода, аналогичного методу AddObject, а есть только Add, который принимает объект только в качестве параметра.
Items.IndexOf
работает и здесь. Что произойдет, если вы не переопределитеEquals
иGetHashCode
, а просто используетеIndexOf
? (Кроме того, в качестве отступления: вы можете изменить свой кодEquals
на простоResult := TAlarm(obj).TagName.Equals(self.TagName);
. Назначениеresult := false;
иif..then
в тесте можно исключить. - person Ken White   schedule 16.09.2011ListBox.Items
? - person Ken White   schedule 16.09.2011AlarmListBox
предполагает, что это элемент управления пользовательского интерфейса ListBox. Такие элементы управления содержат строки, а неTAlarm
объекты, хотя вы добавляете к немуTAlarmGroup
, который также неTAlarm
, так зачем вам вообще нужныTAlarm
методы? ? Вы демонстрируете поиск элемента, соответствующегоalrm.name
, но вашTAlarm
класс не имеетname
члена. Может ли причина того, что вы не находите то, что ищете, просто в том, что того, что вы ищете, действительно нет в списке? - person Rob Kennedy   schedule 16.09.2011