Перетащите N Отключить элементы управления в GridPanel. - PullRequest
0 голосов
/ 19 марта 2011

Я дурачился с перетаскиванием элементов управления на панели сетки в delphi 2010. Перемещайте панель / кнопку / независимо от того, находится ли содержимое из одной ячейки в другую. Замена существующих или обмен мест. Я не выяснил, откуда я знаю, какая ячейка была сброшена, поскольку они работают с индексами столбцов, а также с индексами строк.

так что, если у меня есть сеточная панель, которая имеет 3 столбца и 3 строки, и у меня есть кнопка в ячейке 1/1 ... и я перетаскиваю эту кнопку из 1/1 в 3/3, как я могу получить расположение этой ячейки из события dragdrop? Я получаю координаты x, y на капле, но как я могу определить ячейку из этого?

Ответы [ 2 ]

3 голосов
/ 19 марта 2011

Вы можете использовать TGridPanel.CellRect, чтобы получить ограничивающий прямоугольник для каждой из ячеек. Вот пример того, как использовать CellRect:

// GP: TGridPanel
// This is the "OnDragDrop" handler.

procedure TForm13.GPDragDrop(Sender, Source: TObject; X, Y: Integer);
var DropPoint: TPoint;
    CellRect: TRect;
    i_col, i_row: Integer;
begin
  if Source = Panel1 then // Simple test, is this a drop I want to handle?
  begin
    DropPoint := Point(X, Y); // Where did the suer drop? We need this so we can easily call PtInRect
    for i_col := 0 to GP.ColumnCollection.Count-1 do
      for i_row := 0 to GP.RowCollection.Count-1 do
      begin
        CellRect := GP.CellRect[i_col, i_row]; // Get the bounding rect for Col[i_col, i_row]
        if PtInRect(CellRect, DropPoint) then
        begin
          // Panel1 was dropped over Cell[i_col, i_row]
        end;
      end;
  end;
end;
0 голосов
/ 21 ноября 2018

Основано на ответе Космина (что является хорошей отправной точкой, но не работает в реальной жизни).

Мой код написан на C ++, но, поскольку он является «клоном» ответа Consmin, пользователи Delphi могут легко его понять (и посмотреть, что изменилось).
PS: обратите внимание, что я перетаскиваю TPanels вместо TButtons (очень незначительное изменение).

void __fastcall TfrmVCL::ButtonDragDrop(TObject *Sender, TObject *Source, int X, int Y)
{
  TRect CurCellRect;
  TRect DestCellRect;
  int Col;
  int Row;
  int srcCol; int srcRow;
  int destCol; int destRow;
  int srcIndex; int destIndex;
  TPanel *SrcBtn;
  TPanel *DestBtn;

  SrcBtn = dynamic_cast<TPanel *>(Source);
  if (SrcBtn)
     {
     int ColCount = GridPnl->ColumnCollection->Count ;
     int RowCount = GridPnl->RowCollection->Count ;

     // SOURCE
     srcIndex = GridPnl->ControlCollection->IndexOf( SrcBtn );
     srcCol   = GridPnl->ControlCollection->Items[ srcIndex ]->Column;  // the column for the dragged button
     srcRow   = GridPnl->ControlCollection->Items[ srcIndex ]->Row;

     // DESTINATION
     // we get coordinates of the button I drag onto
     DestBtn= dynamic_cast<TPanel *>(Sender);
     if (!DestBtn) return;
     destIndex    = GridPnl->ControlCollection->IndexOf( DestBtn );
     destCol      = GridPnl->ControlCollection->Items[ destIndex ]->Column;  // the column for the dragged button
     destRow      = GridPnl->ControlCollection->Items[ destIndex ]->Row;
     DestCellRect = GridPnl->CellRect[ destCol ][ destRow ];

     // Check all cells
     for ( Col = 0 ; Col < ColCount ; Col++ )
        {
        for ( Row = 0 ; Row < RowCount ; Row++ )
           {
             // Get the bounding rect for this cell
             CurCellRect = GridPnl->CellRect[ Col ][ Row ];

             if (IntersectRect_ForReal(DestCellRect, CurCellRect))
                {
                GridPnl->ControlCollection->Items[srcIndex]->SetLocation(Col, Row, false);
                return;
                }
             else
               lblCurCellRect->Caption= "NO HIT";
           }
        }
     }
}
...