Search code examples
delphiruntimecomponentsdelphi-7

Run-time Component at cursor position


I couldn't find the answer anywhere on the web. Tried Google and many others.

In Delphi 7 how to create a run-time component at cursor position?

I tried a simple code:

procedure TForm1.TButton1Click(Sender: TObject);
var NewCheckBox: TCheckBox;
MB: TMouseButton;
CPos: TPoint;
begin
  GetCursorPos(CPos);
  NewCheckBox:=TCheckBox.Create(Self);
  NewCheckBox.Parent:=Form1;
  NewCheckBox.Caption:='NewCheckBox';
  NewCheckBox.Left:=CPos.X;
  NewCheckBox.Top:=CPos.Y;
end;

But this doesn't work right. The components appear not at the cursor and I cannot place them wherever I want. The code places the component just as I click the button not when I click on the form where I want it to be placed. I want to create a visual of the component that is about to be created and drag it all the way to the form from the button on a toolbar.

I tried Drag-And-Drop but nothing works then, the Drop procedure always shows me a deny sign and does nothing.


Solution

  • The code below will create your checkbox when you right-click on the form. It could do with a bit of refinement, e.g. to handle adding multiple checkboxes, etc, but might help you get going in the right direction.

    procedure TForm1.CreateCheckBox(X, Y : Integer);
    begin
      // NewCheckBox is a Form variable
      NewCheckBox:=TCheckBox.Create(Self);
      NewCheckBox.Parent:=Form1;
      NewCheckBox.Caption:='NewCheckBox';
      NewCheckBox.Left:= X;
      NewCheckBox.Top:= Y;
    end;
    
    procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift:
        TShiftState; X, Y: Integer);
    begin
       if Button = mbRight then
         if NewCheckbox = Nil then
           CreateCheckBox(X, Y);
    end;
    

    Btw, when you use drag & drop on your form, getting the entry sign means that you have not set up an OnDragOver event for the form which sets the Accept parameter to True.