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?
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;