2

問題は、さまざまなタイプのオブジェクトに対してコードを再利用する必要があることから生じます。

  • シナリオ:

別のリストボックスまたは同じリストボックスからリストボックスにドラッグ アンド ドロップします。
上記の質問は、同じコントロールにドラッグ アンド ドロップを実装しようとすると発生します。
ユーザーはリストボックス内の項目を上下にドラッグして並べ替えることができます。
私はロジックを書きました、それは動作します。
問題は、私のアプリで、要件ごとに異なる種類のリストボックスを使用したことです。
そのため、タイプが変更されます。ドラッグ アンド ドロップに同じコードを使用するために
、ソースと送信者が同じ場合、異なるリスト ボックスを共通の祖先 TCustomListBox に型キャストし、
それをアイテムの移動を実行する関数に送信しました。
この関数は、項目コレクションの項目を新しい位置にスワップします。

  • 今特定のシナリオ:

    各項目に関連付けられたチェックボックスを持つチェックリストボックスを使用しました。
    たまたま、各アイテムに checkstate のオブジェクトが関連付けられています。
    関数では、項目を移動するために、項目とそのオブジェクトを一時的に保存するために tstringlist を使用し、
    それらをコントロールから削除してから、コントロールに再挿入します。
    しかし、このチェックリストボックスの場合、アイテムを削除すると、アイテムは削除されます
    が、対応する checkstate オブジェクトが残り、次のアイテムに関連付けられ
    ます。これは望ましくありません。
    そのため、現在、int 変数を通常のモード インジケーター
    と特別なドラッグドロップのインジケーターとして使用しています。
    それが特別な場合、checklistbox の場合のように、tchecklist に型キャストし、
    次に、checkstate とともに項目を削除する delete メソッドにアクセスします。

    そのため、モードとして int を使用する代わりに、
    すべてのリストボックスの基本クラスのクラス参照を使用できるかどうか
    、必要に応じて特定のリストボックス タイプのプロパティにアクセスするにはどうすればよいかを考えていました。
    上記の解決策は最適ではありません。そのため、より一般的で適切な方法が必要です。あなたが助けることができるかどうかを確認してください。ありがとう。アドバイスをありがとう、私はこのコミュニティを気にかけています。機能の編集には慣れていません。ごめん。


関数の宣言は次のとおり
です。- DragDropItemsInListBox(p_HostIndex : Integer; p_HostListBox : TCustomListBox; p_Mode
:Integer);

call:-
hostindex はドロップ サイト インデックス、hostlistbox はアイテムがドロップされる
コントロールです。この場合、ソース コントロールと宛先コントロールは同じで
あり、mode は削除方法を示します。
DragDropItemsInListBox(3,TCustomListBox(ソース), 1);


モードが 0 の場合、次のように通常どおりアイテムを削除します


1 の場合は、特別な処理を示します
。この場合、何をすべきかわかっているので、

p_Mode = 1 の場合
(p_HostListBox as TRzCheckList).items.delete(i);


これにより、checkstate オブジェクトとともにアイテムが削除されます。
しかし、私はこのintベースの微分に頼りたくありません。
メタクラスを使用できますか?通常、items.delete を呼び出すと、
その特定のタイプに適用されますか?

4

1 に答える 1

0

したがって、p_Mode = 1 の場合 (p_HostListBox as TRzCheckList).items.delete(i); を使用します。

これにより、checkstate オブジェクトとともにアイテムが削除されます。しかし、私はこのintベースの微分に頼りたくありません。メタクラスを使用できますか?通常、items.delete を呼び出すと、その特定のタイプに適用されますか?

メタクラス変数は使用できません。メタクラス ポインターは、その型のすべてのオブジェクトで同じです。Delphiがそれを許可した場合、どのチェックリストから削除するかを知る方法がありません。

ただし、 int を使用することは実際には不十分なソリューションです。

if p_HostListBox is TRzCheckList 
   then TRzCheckList(p_HostListBox).items.delete(i); 

補足: Component Pascal ではさらに多くのシュガーがあります: IS はそこに AS を意味します: p_HostListBox が TRzCheckList の場合、 p_HostListBox.items.delete(i);

RzChkLst.TRzCheckList.Items (TStrings 型のプロパティ) に関するヘルプを読むには、おそらくさらに良い方法です。

宣言を修正する

procedure DragDropItemsInListBox(p_HostIndex : Integer; p_HostListBox : TCustomListBox; p_Items : TStrings);

DragDropItemsInListBox(0, RzCheckList1, RzCheckList1.Items); のように呼び出します。

そして手順で

p_Items.Delete(i);
于 2012-10-02T08:45:03.853 に答える