DelphiのListViewでDrag&Dropによる項目移動方法

このQ&Aのポイント
  • Delphiのlistview(vsReport)で、Drag&Dropを使用して項目を上下に移動させる方法がわかりません。
  • ListView上の右クリックのポップアップメニューで項目を一つ上に、一つ下に移動させる方法も試してみましたがうまく機能しません。
  • DelphiのListViewで項目のドラッグアンドドロップ移動の方法について教えてください。
回答を見る
  • ベストアンサー

delphiにて(listviewでのDrag&Drop)

タイトルの通りです。 listview(vsReport)で、Drag&Dropで 項目を上下に移動させたいのですが、 ヘルプやネットで検索しても、いまいちヒットせず、 ツリーの時のようにMoveToがないようなので、 どういうふうにしたらいいかつまっています。 単純ソートでは、思うように並んでもらえないし…。 もしくは、ListView上の右クリックのポップアップメニューで 選択した項目を「一つ上に」「一つ下に」という形でも いいのですが、試してみてもどうも思ったように 機能してくれません。 上記どちらでもいいのですが、その考え方というか、 作業手順、ヒントみたいなものでも結構なので、 どなたか教えていただけないでしょうか? また、上記内容に関するサンプル等公開しているページがあれば、 教えていただけるとありがたいです。 よろしくお願いします。

  • yo-ya
  • お礼率65% (145/221)

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

こんにちは。 もっと上手いやり方があるかも知れませんが、ListViewのMultiSelectをFalse、RowSelectをTrue、DragModeをdmAutomaticにして、下記の感じでそれっぽくなりましたよ。 procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;  State: TDragState; var Accept: Boolean); begin  Accept := (Source = Sender) and (ListView1.Selected <> nil ) and  ([htOnIcon,htOnItem,HtOnLabel] >= ListView1.GetHitTestInfoAt(x,y)); end; procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer); var cItem,mItem : TListItem; begin  mItem := ListView1.Selected;  cItem := ListView1.GetItemAt(x,y);  if cItem <> nil then begin    cItem := ListView1.Items.Insert(cItem.Index);    cItem.Assign(mItem);    cITem.Focused :=True;    cItem.Selected :=True;    mItem.Delete;  end; end;

yo-ya
質問者

お礼

遅れましてもうしわけありませんでした。 回答、ありがとうございました。 精進します…。 が、 また詰まったときには質問させていただくことになるのでしょう…(^^;)。 ありがとうございました。

関連するQ&A

  • Drag'n Drop CDを隠したい

    Drag'n Drop CDというバックアップソフトがあります。 今までは後ろに表示されていましたが、設定が変わってしまったのか、常時上に表示されて邪魔です。 今までのように後ろに表示させるにはどうしたらよいでしょうか? アイコンの削除も考えましたが、削除という項目がないのです。 ソフトのヘルプも見ましたが、表示位置を変える項目はありませんでした。

  • ListViewの複数項目削除で再度質問です

    ArrayListのソートの件とListViewのおかしな挙動は解決できたのですが 最初に質問して解決したはずの削除の部分で再び分からなくなって しまったので質問させて頂きます。 今回は本体に今までのコードを正式に組み込んで、動作の確認を 行っていたのですが、複数件(連続や個別選択)のデータ削除を 行おうとしたら意図しないデータ(未整列状態の並びのデータ)が 削除されてしまうという事態が発生してしまいました。 これはどうすれば解決できるのでしょうか? また複数件の未読既読を制御(選択された項目に対してフラグを 入れ替える)するのも同様の方法で出来るのでしょうか? 環境はVS2005(C#)、.NET Framework2.0です。 以下に問題の削除時のコードを載せます。 private void menuDelete_Click(object sender, EventArgs e) { // 選択アイテムが0のときは反応にしない if(listView1.SelectedItems.Count == 0){ return; } if(listView1.Columns[0].Text == "差出人"){ // 受信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[RECEIVE][sel_index]); collectionMail[RECEIVE].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "宛先"){ // 送信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[SEND][sel_index]); collectionMail[SEND].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "差出人または宛先"){ // 削除メールのとき if(MessageBox.Show("選択されたメールは完全に削除されます。\nよろしいですか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK){ for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].RemoveAt(sel_index); } } this.textBody.Text = ""; } } // ツリービューとリストビューの表示を更新する UpdateTreeView(); UpdateListView(); // 選択している位置がリストの件数よりも少ないとき if(currentRow < listView1.Items.Count){ // 選択していた位置-1の行にフォーカスを当て直す listView1.Items[currentRow - 1].Selected = true; listView1.Items[currentRow - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } else{ // リストの件数が1以上の時 if(listView1.Items.Count > 0){ // ListViewの行数位置-1の行にフォーカスを当て直す listView1.Items[listView1.Items.Count - 1].Selected = true; listView1.Items[listView1.Items.Count - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } } }

  • Drag&Dropが出来ない;;

    List1からList2へアイテムをDrag&Dropを使い移動したいと考えています。Commandボタンでは移動できています。 しかし、DragMode=1にすると、移動したいアイテムをクリックして選択できなくなります。 どのようにすれば、アイテムをクリックして、選択したアイテムを移動させることが出来るのでしょうか? ご教授お願いします。

  • ListViewの複数項目削除で意図しない挙動

    前回質問した内容でほとんど複数削除は解決したように 見えたのですが、どういう条件か分からないのですが 複数選択(1件選択の場合は発生しない)して削除ロジックを 実行すると選択している項目と異なる内容の配列(ArrayList)の データを削除してしまうという事が発生します。 これは何が原因で発生しているのでしょうか? またこれの解決法をご教授頂けないでしょうか。 環境はVS2005(C#)、.NET Framework2.0です。 以下に該当部分のコードを載せます。 2000文字を超えてしまったので問題の部分以外は省略しました。 ※添付画像が見にくかったので以下のURLに再掲示しましたので 参考にしてもらえるとありがたいです。 http://angelteatime.punyu.net/questionbox_20090312.jpg 画像では350件ある受信メール(ArrayListに1件ずつMailクラスで 格納されている)の先頭から8件ぐらい選択削除をしようとしている 画面です。 private void menuDelete_Click(object sender, EventArgs e) { // 選択アイテムが0のときは反応にしない if(listView1.SelectedItems.Count == 0){ return; } if(listView1.Columns[0].Text == "差出人"){ // 受信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { int nIndex = (int)listView1.Items[sel_index].Tag; if (listView1.Items[sel_index].SubItems[1].Text == ((Mail)collectionMail[RECEIVE][nIndex]).subject) { collectionMail[DELETE].Add(collectionMail[RECEIVE][nIndex]); collectionMail[RECEIVE].RemoveAt(nIndex); } else{ MessageBox.Show(string.Format("選択した件名と削除するデータが異なっています。\nリスト位置件名:{0}\n実位置件名:{1}\n(リスト位置:{2}, 実位置:{3}", listView1.Items[sel_index].SubItems[1].Text, ((Mail)collectionMail[RECEIVE][nIndex]).subject, sel_index, nIndex), "エラー", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "宛先"){ (上記のRECEIVEがSENDに変更のみでロジック変更なし) } else if(listView1.Columns[0].Text == "差出人または宛先"){ (上記のDELETEに変更されDELETEの配列に格納されたデータを削除) } // ツリービューとリストビューの表示を更新する UpdateTreeView(); UpdateListView(); (ListViewのフォーカスを設定し直す) }

  • ListView1.Drag vbBeginDragって何でしょうか?

    "大変"申し訳ありません!!教えて頂けないでしょうか? 今VB2005を使用しているのですが、ネットで検索したのですが例えば ListView1.Drag vbBeginDrag というのは2005より古いバージョンのみで使える物でしょうか? スミマセン。よろしくお願いします。

  • Drag'n Drop について。

     いつもお世話になっています。私はDrag'n Drop でCDをCD-Rにコピーしています。つい2週間ほど前まで調子よくコピーができていたのですが、今日借りてきたCDをいつもと同じ手順でコピーしようとしたところ、CD-Rを入れて、いざ書き込みとなると、次のような警告がでて、書き込みができませんでした。それは「キャブレーションエラーが発生しました。ドライブがそのメディアに対応していない可能性があります。メディアをお確かめください。(コード:011-01-3058)(1E 2A 03 73 03)」です。これはどういう意味でしょうか。よろしくお願いします。

  • Drag'n Drop

    富士通のXPをつかっています。リカバリをして、アプリケーションCDをいれましたが、CD3をいれわすれて 終了しました。Drag,’nDrpoガつかえません。アプリケーションCDをいれなおしても、だめです。 どうしたら、よいのでしょうか。

  • Drag`n Dropがつかえない

    Windows Xpをつかっています。2日位前、リカバリをしました。ユーザーアカウントを追加しました。マイドキュメントのファイルをのアイコンをDataのところまでドラッグします。ownerのほうでは、成功します。記録できますが、別のアカウントでは、同じCD-RWをつかっても、記録できません。ブランクメディアに入れ替えてください。の表示がでます。CD-RWをいれかえたわけでもなく、空き容量も十分なのに、どうしてなのでしょうか。両方のアカウントで、Drag`n Dropが使えるように、できるのでしょうか。ブランクメディア でないと、つかえないのは、おかしいです。回答お願いします。

  • ListBoxでの Drag&Dropについて

    List1で複数選択された項目をList2へドラッグ&ドロップでコピ ーしようと思います。 まず最初にList1のListIndex(1-3)を選択し色を反転させるとし ます。 その状態でドラッグ&ドロップを開始しようとし、List1の任意 のListIndexの部分をクリックするとその後からクリックされた 任意のListIndexの部分がドラッグ&ドロップの対象になり、最 初に予定したListIndex1-4は選択が解除されてしまいます。 これを回避するにはどのようにすればいいのでしょうか? VB6です。 よろしくお願いします。

  • Drag`n Drop

    マイドキュメントのあるファイルをDrag`n Dropで、CD-RWに記録しようと思いドラッグしたら、RWではなくて、DVDで、記録できないものでした。 CD-RWと取り替えて、ドラッグしましたが、記録できません。どのようにしたら、記録できるのでしょうか。回答お願いします。

専門家に質問してみよう