5

TListViewマージの形式として、1つまたは複数のアイテムを他の1つのアイテムにドラッグするドラッグ/ドロップ機能を備えたを使用しています。アイテムをコントロールの上部または下部にドラッグすると、自動的に上下にスクロールする必要がありますが、そうではありません。同じことが、特定のビュースタイルで右または左にスクロールする場合にも当てはまります。ユーザーがアイテムをドラッグしている方向に自動的にスクロールさせるにはどうすればよいですか?

PS:VCLテーマも有効にしています

4

1 に答える 1

6

あまりテストしませんでしたが、以下の試行では、アイテムが親(この例の場合はフォーム)のコントロールの外にドラッグされたときにタイマーが有効になり、タイマーイベントがカーソル位置をテストしてスクロールメッセージかどうかを確認しますリストビューに送信する必要があります。

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
  Timer1.Interval := 500;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source = ListView1 then 
    Timer1.Enabled := True
  else
    Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Pt: TPoint;
begin
  // Stop timer and exit if not dragging any more
  if not ListView1.Dragging then begin
    Timer1.Enabled := False;
    Exit;
  end;

  Pt := ListView1.ScreenToClient(Mouse.CursorPos);
  if Pt.Y < 0 then
    ListView1.Perform(WM_VSCROLL, SB_LINEUP, 0)
  else
    if Pt.Y > ListView1.ClientHeight then
      ListView1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
    else
      Timer1.Enabled := False;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  Timer1.Enabled := False;
end;

正常に機能する場合は、水平スクロールも組み込むことができます。

于 2012-09-17T00:22:41.267 に答える