【问题标题】:OnMouseMove in TDrawGrid on touch screen触摸屏上 TDrawGrid 中的 OnMouseMove
【发布时间】:2018-07-17 15:12:39
【问题描述】:

在触摸屏 Windows 平板电脑上使用程序。有一个网格,我们需要在其中连续选择一些单元格:目标光标在单元格上,单击鼠标左键,按住它,将鼠标拉到一边,然后松开鼠标左键(同时在OnDrawCell 正在绘制单元格)。 通过鼠标或笔记本的触摸板效果很好。但是在平板的触摸屏上根本就不行。

我使用 TDrawGrid 和 OnMouseDown、OnMouseMove、OnMouseUp 事件。 在 Shift 中使用所有选项:ssLeft、ssTouch、ssPen。查看完整代码:

procedure TfmMain.GridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ACol, ARow: Integer;
  ARect: TRect;
begin
  (Sender as TDrawGrid).MouseToCell(X, Y, ACol, ARow);
  ARect := (Sender as TDrawGrid).CellRect(ACol, ARow);

  pmIsLeft := X<(ARect.Left+((ARect.Right-ARect.Left) div 2));
  pmCol := ACol;
  pmRow := ARow;
  if (ssLeft in Shift) or (ssTouch in Shift) or (ssPen in Shift) then
  begin
    ChooseDaysInGridRowIndex := ARow;
SetLength(ChooseDays, 0);
  end;
end;

procedure TfmMain.GridMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  ACol, ARow: Integer;
begin
  if (ssLeft in Shift) or (ssTouch in Shift) or (ssPen in Shift) then
  begin
    (Sender as TDrawGrid).MouseToCell(X, Y, ACol, ARow);
    if (ChooseDaysInGridRowIndex>0) and
      (ChooseDaysInGridRowIndex<=(Sender as TDrawGrid).RowCount-1) and
  ((PagesDays[pagesBuildings.ActivePageIndex][ARow, ACol][0].ReservID<=0) or
        ((Length(ChooseDays)=0) and         ((PagesDays[pagesBuildings.ActivePageIndex][ARow, ACol][1].ReservID<=0)))) then
    begin
      SetLength(ChooseDays, Length(ChooseDays)+1);
      ChooseDays[High(ChooseDays)] := Point(ACol, ChooseDaysInGridRowIndex);

      InvalidateRect((Sender as TDrawGrid).Handle,
        (Sender as TDrawGrid).CellRect(ACol, ARow),
        True);
    end;
    ChooseDaysInGrid := True;
  end;
end;

procedure TfmMain.GridMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ACol, ARow: Integer;
begin
  if ChooseDaysInGrid then
  begin
    (Sender as TDrawGrid).MouseToCell(X, Y, ACol, ARow);
    ChooseDaysInGrid := False;

    fmGuestArrival.roomID := GridRowTitles[(Sender as TDrawGrid).Tag]    [ARow].RoomID;
//      Integer((Sender as TDrawGrid).Objects[0, ARow]);

    if Length(ChooseDays)>0 then
    begin
      fmGuestArrival.dateArrival.DateTime :=
        IncDay(StartDatePeriod, ChooseDays[0].X-1);
      if Length(ChooseDays)>1 then
      begin
        fmGuestArrival.dateDeparture.DateTime :=
          IncDay(StartDatePeriod, ChooseDays[High(ChooseDays)].X - 1);
      end
      else
      begin
        fmGuestArrival.dateDeparture.DateTime :=
          IncDay(fmGuestArrival.dateArrival.DateTime, 1);
      end;
    end;

    fmGuestArrival.IsEditing := False;
    fmGuestArrival.cbStatus.ItemIndex := 0;
    fmGuestArrival.ShowModal;
  end;
end;

【问题讨论】:

    标签: delphi grid touch


    【解决方案1】:

    通过添加TGestureManager (GestureManager1) 来添加Gesturing 支持。然后将GestureManager1 分配给TDrawGridTouch.GestureManager 属性。打开 TDrawGrid 的 Touch.Gestures.Standard 属性并选择您想要通知的手势。创建一个OnGesture 事件并根据需要添加代码。

    详情documented by Embarcadero

    【讨论】:

    • 是的,我也是这样看的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2013-07-06
    • 1970-01-01
    • 2015-08-03
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多