ListBoxではMultiSelect:=Trueにするだけで
ドラッグ開始&終了で複数行選択できますが
ListViewではShiftキーを押下して選択しなければなりません。
これをListBoxと同様にマウスドラッグで複数行選択で
きるようにするにはどのようにすればいいでしょうか?
環境はWin2000Pro+Delphi2005です。
ListViewの設定は以下のようにしてあります。
ViewStyle:=vsReport;
RowSelect:=True;
MultiSelect:=True;
DragMode:=dmManual;
ListViewのCaption部(左端のカラム)の 文字が無い空き部分(空きが無ければカラム幅を広げる)をドラッグすれば複数行選択が出来るけど…(D6の場合)
ほんとですね。Caption部(文字のない部分)でやれば
できますね。2005でも確認しました!知りませんでした!
でも。。。やっぱりRowSelect:=Trueにしてあるんだし
行のどこからでも自然な感じにドラッグしたいのですが無理でしょうか?
(↑それが無理ならitems部分だけでもいいです。)
>でも。。。やっぱり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;
ン?ン?さんありがとうございました!
無事解決です。
マウスの速度をあげると選択範囲に歯抜けがでちゃったので
以下のように変更してみました。(かなり強引です。すみません。)
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;
ツイート | ![]() |