光标位置的运行时组件

Posted

技术标签:

【中文标题】光标位置的运行时组件【英文标题】:Run-time Component at cursor position 【发布时间】:2017-07-31 23:19:10 【问题描述】:

我在网络上的任何地方都找不到答案。尝试过 Google 和其他许多人。

在Delphi 7中如何在光标位置创建运行时组件?

我尝试了一个简单的代码:

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;

但这不正确。组件未出现在光标处,我无法将它们放置在我想要的任何位置。代码放置组件就像我单击按钮而不是当我单击要放置它的表单时一样。我想创建即将创建的组件的视觉效果,并将其从工具栏上的按钮一直拖到表单中。

我尝试了拖放但没有任何效果,Drop 过程总是向我显示拒绝标志并且什么都不做。

【问题讨论】:

我们在这里需要更多上下文,“它不能正常工作”是什么意思?也许你想要实现的截图会有所帮助。 GetCursorPos() 报告屏幕坐标Left/Top 属性使用相对于Parent客户端坐标。使用Parent的ScreenToClient()方法进行翻译,例如:CPos := Form1.ScreenToClient(CPos); 这不会有好的结局。您的所有控件都将在该按钮之上开始生命...... 【参考方案1】:

当您右键单击表单时,下面的代码将创建您的复选框。它可以做一些细化,例如处理添加多个复选框等,但可能会帮助您朝着正确的方向前进。

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;

顺便说一句,当您在表单上使用拖放操作时,获得入口标志意味着您尚未为将 Accept 参数设置为 True 的表单设置 OnDragOver 事件。

【讨论】:

这会改变一些事情。但是如果我有一个工具栏来保存每个组件的图像,当我点击那里时,我想将一个新创建的组件拖到页面控件的页面上。 " 但是如果..." 一旦你掌握了 Delphi 的拖放功能,实现它会相当复杂,但也不是很困难。事实上,最困难的部分可能是为工具栏上的每个组件创建自定义拖动图像 了解这些内容,尝试自己的实现,如果遇到困难,请发布新的 q。 好的。然而,我猜我走错路了。 嗯,知道这些事情是件好事,但能走多远取决于你的目标是什么。如果您想实现运行时表单设计,现有的库已经可以做到这一点,而您不必重新发明一个相当大的***。免费软件 JEDI 库包含至少一个 rt/time 表单设计器,例如 iirc。 我发布了一个关于我希望得到什么结果的问题。

以上是关于光标位置的运行时组件的主要内容,如果未能解决你的问题,请参考以下文章

vc MFC EDIT控件 设置光标位置

如何更改当前光标位置指示器的颜色?

ASP.NET / HTML - 使用光标时的文本区域光标位置

编辑控件 MFC 中光标位置更改时是不是有通知代码?

当TextWatcher存在时退格/删除时按EditText光标位置

在普通视图和代码视图之间切换时保持光标位置