jjzjj

关于vcl:在Delphi中创建一个表单编辑器

codeneng 2023-03-28 原文

Creating a forms editor in Delphi

我的目标是创建一个简单的表单编辑器,就像我们在 Delphi IDE 上找到的那样。

现在用户可以选择和添加组件,使其成为 TPanel 的父级,TPanel 是表单的持有者。为简单起见,也请考虑将 TPanel 作为添加到表单的可视组件。

我有 2 个缺失的部分,我想找出一些想法/代码来帮助完成:

1 - 如何移动创建的可视化组件?与 IDE 中用于移动可视组件(例如 Tpanel)的效果相同,左右移动其顶部和左侧位置
2 - 如何在表单编辑器上为组件绘制钩子
3 - 如何使用钩子调整大小

我只想要与处理视觉部分相关的部分。我没有生成 DFM 或类似的东西。


简单地把你的移动代码需要这样做:

  • 当鼠标向下时,检查鼠标位置是否在可以拖动的控件上。如果是这样,则设置一个名为 FDragControl 的变量来引用该控件。此代码位于 OnMouseDown 事件处理程序中。
  • 当鼠标移动时,如果 FDragControl 不为零,则移动控件。此代码位于 OnMouseMove 事件处理程序中。
  • 当鼠标上升时,将 FDragControl 设置为 nil。
  • 这就是它的全部内容。主要的细微差别是您还必须记住拖动开始时鼠标的 X、Y 值。所以在你的 OnMouseDown 处理程序中你写:

    1
    2
    FStartMousePos := Point(X, Y);
    FStartDragControlPos := Point(FDragControl.Left, FDragControl.Top);

    然后在 OnMouseMove 中,您的位置代码为:

    1
    2
    FDragControl.Left := FStartDragControlPos.X + (X-FStartX);
    FDragControl.Top := FStartDragControlPos.Y + (Y-FStartY);

    您还需要在开始拖动时捕获鼠标。

    调整大小的代码类似。同样,您需要在 OnMouseDown 中决定要调整大小而不是拖动,但代码仍涉及处理鼠标向下、移动和向上事件。

    至于绘画,每当您的事件处理程序之一更改将影响表单视觉外观的属性时,您都需要强制重新绘画。您可以使用 FDragControl 的值来决定是否使用控件的特殊绘图并指示它正在被拖动。同样用于调整大小。

    我没有编写完整的工作实现,因为您的问题是高级和概念性的。实施取决于您。

    • 太棒了!但是对于调整大小来说,在控件周围放置这些钩子和框架很重要,怎么做?
    • @eelias 使用表单 OnPaint 事件在表单画布上绘制它
    • 有一个非常好的组件,它是名为 Cindy 组件的包的一部分 - 您想要的组件称为 cyResizer,它可以移动、调整大小并防止超出面板边界等...链接:sourceforge.net/项目/tcycomponents 看看你认为它是非常可定制的......
    • 这就是它的样子:a.fsdn.com/con/app/proj/tcycomponents/screenshots/234287.jpg


    // 我已将其作为答案,因为我刚刚阅读了您的最新更新,该更新确实应该作为对您原始问题的编辑,但无论如何。

    您可以下载 Cindy 组件包并使用 cyResizer 组件,该组件几乎可以满足您的所有需求,并且还可以自定义。

    您可以从这里下载它:http://sourceforge.net/projects/tcycomponents/

    • @eelias我认为您的回答不应该是对该问题的更新。但我也不认为这是一个很好的答案。这只是网络搜索的结果。任何人都可以这样做。所以我不认为你的回答实际上回答了这个问题。或者,如果确实如此,那么这个问题应该被关闭,因为它不是一个真正的问题。


    寻找更多答案我可以找到这些文章:

    如何在运行时移动和调整控件大小
    http://delphi.about.com/library/weekly/aa102505a.htm

    如何为在运行时调整大小的控件添加大小句柄
    http://delphi.about.com/library/weekly/aa110105a.htm

    几乎所有信息都可以通过源代码示例完成此任务。

    这些文章展示了如何实现和使用 TMover 类。我已经完成并且工作正常。

    我还下载了 TcyComponents 包并使用了 TcyResizer。它是一个功能齐全的表单编辑器,几乎包含了类似 Delphi 的表单编辑器所需的一切。我建议。它带有源代码,适用于 XE2 版本。

    有关关于vcl:在Delphi中创建一个表单编辑器的更多相关文章

    1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

      我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

    2. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

      我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

    3. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

      我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

    4. ruby - 如何在 Ruby 中创建无类 DSL? - 2

      我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中

    5. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

      有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

    6. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

      这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

    7. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

      假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

    8. ruby-on-rails - 关于 Ruby 的一般问题 - 2

      我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

    9. ruby-on-rails - 尝试打开 .gitignore 以在文本编辑器中对其进行编辑,但在 OS X Mountain Lion 上找不到文件位置 - 2

      我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位

    10. ruby-on-rails - 从 ActiveAdmin has_many 表单助手中删除 "Add new"按钮 - 2

      我在事件管理员编辑页面中有嵌套资源,但我只想允许管理员编辑现有资源的内容,而不是添加新的嵌套资源。我的代码看起来像这样:formdo|f|f.inputsdof.input:authorf.input:contentf.has_many:commentsdo|comment_form|comment_form.input:contentcomment_form.input:_destroy,as::boolean,required:false,label:'Remove'endendf.actionsend但它在输入下添加了“添加新评论”按钮。我怎样才能禁用它,并只为主窗体保留f.ac

    随机推荐