Search code examples
delphidrag-and-dropgridpanel

Drag N Drop controls in a GridPanel


I have been fooling around with dragging and dropping controls in a grid panel in delphi 2010. Move a panel/button/whateever the contents are from one cell to another cell. Replacing existing or swapping places. I have not figured out how I know which cell was dropped on because they work with column indexes and also row indexes.

so if I have a gridpanel which has 3 columns and 3 rows, and I have a button in cell 1/1... and I drag that button from 1/1 into 3/3 how can I get that cell location from the dragdrop event? I get the x,y coords on the drop but how can I determine the cell from that?


Solution

  • You can use TGridPanel.CellRect to get the bounding rectangle for each of the cells. Here's an example of how to use 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;