delphidelphi-2007tgridpanel

Getting the cell clicked on in a TGridPanel


I have a TGridPanel on a form and wish to add a control to a specific "cell" that is clicked on.

I can get the point easily enough:

procedure TForm1.GridPanel1DblClick(Sender: TObject);
var
  P : TPoint;
  InsCol, InsRow : Integer;
begin
  P := (Sender as TGridPanel).ScreenToClient(Mouse.CursorPos);
  if (Sender as TGridPanel).ControlAtPos(P) = nil then
    begin
      InsCol := ???;
      InsRow := ???;
      (Sender as TGridPanel).ControlCollection.AddControl(MyControl, InsCol, InsRow)
    end;
end;

I probably don't need the if ControlAtPos(P) = nil then line, but I want to make sure I'm not inserting a control in a cell that already has one in it.

So... what code do I use to get InsCol and InsRow? I've been up and down the TGridPanel and TControlCollection class code and can't find anything that will give me a column or row value from mouse coordinates. Nor does their seem to be a relevant event to use other than OnDblClick().

Any help would be greatly appreciated.

EDIT: Changed variable Result to MyControl to avoid confusion.


Solution

  • procedure TForm1.GridPanel1Click(Sender: TObject);
    var
      P: TPoint;
      R: TRect;
      InsCol, InsRow : Integer;
    begin
      P := (Sender as TGridPanel).ScreenToClient(Mouse.CursorPos);
      for InsCol := 0 to GridPanel1.ColumnCollection.Count - 1 do
      begin
        for InsRow := 0 to GridPanel1.RowCollection.Count - 1 do
        begin
          R:= GridPanel1.CellRect[InsCol,InsRow];
          if PointInRect(P,R) then
          begin
            ShowMessage (Format('InsCol = %s and InsRow = %s.',[IntToStr(InsCol), IntToStr(InsRow)]))
          end;
        end;
      end;
    
    
    end;
    
    function TForm1.PointInRect(aPoint: TPoint; aRect: TRect): boolean;
    begin
      begin
        Result:=(aPoint.X >= aRect.Left  ) and
                (aPoint.X <  aRect.Right ) and
                (aPoint.Y >= aRect.Top   ) and
                (aPoint.Y <  aRect.Bottom); 
      end;
    end;