ListViewでの複数行選択をマウスドラッグで実現するには?

解決


おかっぴき  2005-05-31 19:40:30  No: 15227

ListBoxではMultiSelect:=Trueにするだけで
ドラッグ開始&終了で複数行選択できますが
ListViewではShiftキーを押下して選択しなければなりません。
これをListBoxと同様にマウスドラッグで複数行選択で
きるようにするにはどのようにすればいいでしょうか?
環境はWin2000Pro+Delphi2005です。
ListViewの設定は以下のようにしてあります。
ViewStyle:=vsReport;
RowSelect:=True;
MultiSelect:=True;
DragMode:=dmManual;


ン?  2005-05-31 20:51:18  No: 15228

ListViewのCaption部(左端のカラム)の 文字が無い空き部分(空きが無ければカラム幅を広げる)をドラッグすれば複数行選択が出来るけど…(D6の場合)


おかっぴき  2005-06-01 00:05:37  No: 15229

ほんとですね。Caption部(文字のない部分)でやれば
できますね。2005でも確認しました!知りませんでした!
でも。。。やっぱりRowSelect:=Trueにしてあるんだし
行のどこからでも自然な感じにドラッグしたいのですが無理でしょうか?
(↑それが無理ならitems部分だけでもいいです。)


ン?ン?  2005-06-02 16:19:43  No: 15230

>でも。。。やっぱりRowSelect:=Trueにしてあるんだし
>行のどこからでも自然な感じにドラッグしたいのですが…
ん〜そやな〜

var
  IsMouseDown: Boolean;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  IsMouseDown := True;
end;

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  IsMouseDown := False;
end;

procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  aItem: TListItem;
begin
  aItem := ListView1.GetItemAt(X, Y);
  if aItem <> nil then begin
    if IsMouseDown then ListView1.Selected := aItem;
  end;
end;


おかっぴき  2005-06-03 03:44:55  No: 15231

ン?ン?さんありがとうございました!
無事解決です。
マウスの速度をあげると選択範囲に歯抜けがでちゃったので
以下のように変更してみました。(かなり強引です。すみません。)

var
  IsMouseDown: Boolean;
  Yd,Ymax,Ymin:integer;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    Yd:=ListView1.GetItemAt(X,Y).Index;
    Ymax:=Yd;
    Ymin:=Yd;
    IsMouseDown := True;
end;

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     IsMouseDown := False;
end;

procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  aItem:TListItem;
  i:integer;
  Yst,Yed:Integer;
begin
  aItem:=ListView1.GetItemAt(X,Y);
  if aItem<>nil then begin
    if IsMouseDown then begin

        if (Ymax<aItem.Index) then Ymax:=aItem.Index;//範囲の最大値
        if (Ymin>aItem.Index) then Ymin:=aItem.Index;//範囲の最小値

        //ドラッグ開始位置と現在カーソル位置による判定
        if Yd<=aItem.Index then begin
            Yst:=Yd;
            Yed:=aItem.Index;
        end else begin
            Yst:=aItem.Index;
            Yed:=Yd;
        end;

        //範囲全体の選択を解除する。
        for i:=Ymax downto Ymin do begin
          ListView1.Items[i].Selected:=False;
        end;

        //判定内を選択する。
        for i:=Yed downto Yst do begin
          ListView1.Items[i].Selected:=True;
        end;

    end;
  end;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加