これを正しく行っているかどうかはわかりません。リストボックスにオブジェクトのリストがあり、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 行ずつデバッグすると常に -1 が返され、これらのオーバーライドされたメソッドが呼び出されたり起動されたりすることはありません。
これらのオーバーライドを正しく実装していますか? そうでない場合、どのようにオーバーライドすればよいですか?
サンプル コードやヒント、手がかりをいただければ幸いです。ありがとう、
更新:コメントまたは回答した David Heffernan と他の人へ、問題は、Rob の最後のコメントが述べているように、2 つの異なるオブジェクトを渡していることだと思います。リストボックス (UI) に TAlarmGroup を入力しますが、TAalarm を IndexOf に渡しますが、どちらも同じクラスです。これはおそらく私の問題です。私が実際にやろうとしているのは、Listbox に TAlarmGroup オブジェクトを設定し、listbox.indexof を介して文字列 (Tagname) を渡してオブジェクトの場所を検索することです。それがDelphi XEで行われる方法で、うまく機能します。上記のコードは実際のコードではありません。コードの混乱を解消すれば、おそらく GetHashcode と Equals メソッドをオーバーライドしなくても機能するでしょう。
更新:ここで何かに遭遇したと思います。Delphi XE 以下では、ListBox (UI) は AddObject と呼ばれるメソッドを提供します。パラメータはそれぞれ文字列とオブジェクトです。そのため、オブジェクトをリストボックスに入力するときに、それに合わせて文字列も提供しました。検索時に、文字列またはアラーム グループ名を渡しました。IndexOf は、オブジェクトのフィールド (TagName) ではなく、提供した各オブジェクトの文字列に対してこの文字列を検索しました。Delphi Prism では、listbox には AddObject メソッドと同様のメソッドはなく、オブジェクトのみをパラメーターとして受け入れる Add のみです。