我正在开发适用于Windows的Delphi 10.1 VCL应用程序。
对于整数或浮点输入,我需要一个与滑块连接的数字输入字段。当用户更改输入字段中的数字时,滑块位置会相应地改变。当用户更改滑块位置时,数字字段中的数字会更新。
我可以通过使用TEdit和TTrackBar来解决这个问题,并在他们的OnChange事件处理程序中添加必要的更新功能。
问题是我需要不同形式的许多此类输入。因此,我想创建一个新组件,它将两个控件TEdit和TTrackBar组合在一个组件中。
创建新组件是多次使用此类滑块输入的最佳策略吗?
创建这样一个新组件的最佳方法是什么?
答案 0 :(得分:8)
创建新组件是多重策略的最佳策略 使用这样的滑块输入?
不一定都是真的。 (至少按我的标准)。
创建这样一个新组件的最佳方法是什么?
我知道解决问题的三种方法。
方式1:
使用新组件向导创建组件,您可以动态创建Tedit
后代中的Ttrackbar
和Tgroupbox
子组件。
以下是我将如何做到这一点。
unit Combindedittrack;
interface
uses
System.SysUtils, System.Classes, Vcl.Controls, Vcl.comctrls ,Vcl.StdCtrls;
type
TCombindedittrack = class(Tgroupbox)
private
{ Private declarations }
Fedit:tedit;
Ftrackbar: TTrackBar;
procedure editonchangeproc(Sender: TObject);
procedure trackbaroOnchange(Sender: TObject);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(owner:tcomponent); override;
destructor Destroy; override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TCombindedittrack]);
end;
constructor TCombindedittrack.Create(owner:tcomponent);
begin
inherited Create(owner);
SetBounds(0, 0, 250, 50);
Fedit:=tedit.Create(self);
with Fedit do
begin
text := ''; //<-- you control the appearence here
top := 10;
left := 10;
height := 27;
width := 50;
parent:=self;
Onchange:=editonchangeproc; // your Onchange event handler for the Tedit
end;
Ftrackbar:=ttrackbar.Create(self);
with Ftrackbar do
begin
top := 10; //<-- you control the appearence here
left := 60;
height := 30;
width := 50;
parent:=self;
Onchange:=trackbaronchangeproc; // your Onchange event handler for the Ttrackbar
end;
end;
destructor TCombindedittrack.Destroy;
begin
Ftrackbar.Free;
Fedit.Free;
inherited;
end;
procedure TCombindedittrack.trackbaroOnchange(Sender: TObject);
begin
// <-- track bar onchange handling here.
end;
procedure TCombindedittrack.editonchangeproc(Sender: TObject);
begin
// <-- edit onchange handling here.
end;
end.
方式2:
使用这样的框架(我在delphi 10西雅图上)。
1)文件 - &gt;新增 - &gt;其他 - &gt;(在delphi文件上搜索框架)。
2)现在添加编辑和跟踪栏并设置他们的Onchange事件。
3)保存装置。
4)在工具选项板(标准组件部分)上单击框架组件。
5)选择刚刚创建的框架。
每次使用时都会有一个框架的副本。
方式3:
使用这样的组件模板(再次我在delphi 10西雅图上)
1)选择您已创建和修改的tedit
和ttrackbar
。
2)在工具栏的&#34;组件&#34;单击&#34;创建组件模板&#34;。
3)为您的模板命名,然后按OK。
4)选择模板面板,然后选择模板。
现在请注意,即使您的代码(事件)也会添加到您的项目中。
最后
凭借我在delphi和IDE上的水平,我真的无法给你一个明确的答案,哪个是最好的方法,但是我已经分享了所有可以帮助你的知识。
编辑:由于很多评论都坚持认为答案应该说明哪种方式最好。这是基于以下内容的最佳方式。
让我们提出一些在选择时应该考虑的关键点
1。如果您愿意,可以轻松修改组合控件(根据我的经验,你会)。
2。完成此任务所需的时间(表示需要的时间) 您可以通过最少的调试和编码来完成任务。
3。一般源代码可读性。
4。对您项目的未来有用。
现在让我们开始根据这些标准批评这三种方法。
方式1:
C1 (条件号1):只需修改组件的源实现,每个副本/用户将具有相同的效果和属性。然而,对于第3号方法来说情况并非如此。
C2:这取决于你对组件编写的了解,但对于这个组件,我花了5分钟来创建它,而我只是delphi中的初学者。对于调试,如果出现问题,问题出在组件实现中,而不是只需要修复一次(参见C1)
C3:他们的表单中没有实现您的组件的源代码只需将其添加到您的表单中并隐藏所有内容(例如添加tedit
然后去在表单源中查看实现)。
C4:您正在创建一个组件,这将为您打开一扇门,让您创建自己的一组组件,如Flatstyle或Indy开源组件。所以下次你需要这样的东西时,你只需将它放在表单设计器中即可完成。
方式2:帧
C1:这就像数字1一样,因为你正在创建一个组件,但这次是在视觉上。修改源框架将更改副本的效果和属性,您还可以为副本添加额外的处理。
副本的Onchange事件的事件处理程序就像这样
procedure TForm1.Frame2Edit1Change(Sender: TObject);
begin
Frame2.Edit1Change(Sender); //<-- this is the original onchange event you setup at the beginning
//<-- you can extra handling here if you want one of the replicas to behave differently than the original
end;
C2:同一时间,也许比第一种方式更快。</ p>
C3:总而言之,它与第一种方式相同。
C4:与方法1不同,您不能使用项目B中项目A中创建的框架。因此您的编码和调试将保留在项目A中。
方式3:组件模板。
C1:您没有创建一个组件,您正在创建您在上一个项目中执行的确切步骤的repleca / macro。改变一个不会改变他们分开的其他人。
C2:同一时间,也许比第一种方式更快。</ p>
C3:每次向表单添加模板时,都会添加事件代码(如果是一个很长的Onchange代码,则不是一个好的视图)。
C4:您可以在项目B中使用在项目A中创建的模板。但是您在项目A中编写的内容将在项目B中(参见c1),甚至包含变量的参考文献。 t存在于项目B中(考虑到每次使用模板之间的时间间隔,这可能很难调试和误导)。
结论:所呈现的每种方式都会花费时间进行编码和调试,所有这些方法都可以完成任务,但为了简单起见,以最小的风险重用,方法1是这里安全的选择,因为它将为您提供安全更新和升级的机会。也调试更快。
关于方法1的好处还在于,在一段时间之后,您将忘记实施以及内部工作的方式。唯一应该记住的是组件的用途,因为它将成为您使用的各种组件之一(您不知道Tedit
是如何实现的,并且您不需要但是你在你创建的每个项目中使用它。
根据给定的标准,方法1是最好的。
答案 1 :(得分:4)
使用包含两个控件的容器控件可能是一个更简单的选择。我正在使用ccpack。
https://sourceforge.net/projects/ccpack/
Custom Containers Pack(CCPack)是一个集成工具和组件迷你 - 用于生成和维护复合控件(或简称“复合”)的库 和其他容器(表格,数据模块和框架)。过程 构建复合组件看起来像ActiveForm和Frame创建,但是 结果是本机VCL组件。您可以创建新的复合材料 像往常一样。
答案 2 :(得分:0)
您可以创建一个Frame,然后将该Frame注册为一个组件。最终结果非常类似于创建仅代码组件,其中子组件在构造函数中创建(Nasreddine的#1选项)。但是,此方法允许您可视化地设计组件并使用对象检查器来创建事件处理程序。
这是一个Stack Overflow问题,显示如何注册框架: How to Improve the Use of Delphi Frames