【问题标题】:Dynamically put checkboxes on form在表单上动态放置复选框
【发布时间】:2011-10-24 15:02:04
【问题描述】:

我在数据库中有一张表,其中包含一些商品的信息。商品可能是可填充的,因此我们可以向其添加文本。因此,我想动态生成与表格中的信息相关的复选框列表,甚至某些复选框必须与 TEdit 组件一起使用,才能为该项目添加文本。那么我该怎么做呢?我应该使用什么组件?我发现 TTreeView 几乎足够了,但它不允许在复选框附近“绘制”TEdit。我正在使用 Delphi 2010。提前致谢!希望得到您的帮助!

【问题讨论】:

  • Edit := TEdit.Create(Self); Edit.Parent := Self; Edit.Top := NextTop; inc(NextTop, Spacing);

标签: database delphi checkbox components


【解决方案1】:

如果我正确阅读了您的问题,您想根据表格的内容在表单上创建一些控件。在以下示例中,我假设您希望根据 TDBGrid 中当前记录的内容来执行此操作,因此您必须根据需要进行调整。

该示例假定一个带有 TDBGrid 和一个 TPanel (Panel1) 的表单将保存在运行时创建的控件。

TDBGrid 将连接到 TDataSource 组件,并将连接到带有信息的表/查询的某些 TDataSet 后代。 TDataSource 有一个 OnDataChanged 事件。当字段中的数据发生更改或数据集中的当前记录发生更改时,将触发此事件。因此,您可以使用它在当前记录更改时更改控件。

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
  i: Integer;
  Chk: TCheckBox;
  Edit: TEdit;
begin
  // When the Field is assigned, the call is the result of a change in the field.
  // When the Field is unassigned, the call is the result of changing the current record.
  if Assigned(Field) then
    Exit;

  // Remove controls on panel
  for i := Panel1.ControlCount - 1 downto 0 do
    Panel1.Controls[i].Free;

  // Add controls on panel for current record
  if True then      // Replace this with condition based on contents of current record (if any!)
  begin
    Chk := TCheckBox.Create(Self);  // Set Owner, so it is freed when form is closed.
    Chk.Parent := Panel1;           // Set Parent, so the control is shown.
    Chk.Left := FLeftIndent;        // Create FLeftIndent as a member field of the form, set value in OnCreate.
    Chk.Top := FNextTop;            // Create FNextTop as a member field of the form.
    Inc(FNextTop, FSpacing);        // Create FSpacing as a member field of the form, set value in OnCreate.

    if True then    // Replace this with condition that dictates creation of Edit
    begin
      Edit := TEdit.Create(Self);
      Edit.Parent := Panel1;
      Edit.Left := Chk.Left + Chk.Width + FSpacing;
      Edit.Top := Chk.Top;          // Add offset as needed for proper alignment of CheckBox and Edit.
    end;
  end;
end;

请注意,如果您在表单上没有任何其他复选框或编辑,则您必须自己包含正确的 vcl 单元。最简单的方法是将它们放在表单上,​​保存表单,然后再次删除控件。

【讨论】:

  • +1 大概需要某种方法来识别动态创建的带有 DB 字段的编辑框,以便代码可以响应用户在编辑框中的更改。
  • 感谢您的完整回答,Marjan!你提供的方式是我一开始就想实施的方式。我认为有更简单的方法,但你确认了这种方式。再次感谢!
  • 有什么比让 Marjan 为您编写它更容易的了! [眨眼]。干得好马里安。我建议在每个对象中设置 Chk.Tag 以便复选框对象可以与某些东西相关联,或者作为索引 (0,1,2,...n) 或作为指针存储为整数 (当您迁移到 win64 时,它可能会中断)。
  • @Warren:这是一种方法,我已经做过很多次了。如今,我倾向于创建一个“链接列表”(不是链接列表),在其中链接两个(或更多)指针或索引。可以是一个 TStringList(名称、值和对象!)或者只是两个在索引上保持同步的 TList 或 TObjectList。但也许这真的只有在编写组件或其他可重用的 GUI 东西时才重要,其中 (CheckBox') 标记可能已经用于其他用途。是的,64 位是需要考虑的,尽管我认为他们可能会将标签“提升”到指针大小,因为标签已被用于所有用途。
【解决方案2】:

我很想使用像 ExGridView 这样的网格视图,让它绘制我的复选框,并为我的每一行执行“编辑”控件。但是,如果您真的想要一个编辑框而不是网格,您也可以尝试使用控件网格方法(1 个复选框 + 1 个编辑控件,在控件网格中)。

【讨论】:

    【解决方案3】:

    尝试this 在运行时创建复选框的示例,它可以帮助您动态修改位置。您可以创建一个新组件,其中包含带有 Edit 的复选框,也可以在需要的地方动态创建 TEdit。

    考虑创建一个 TCheckbox 数组和一个 TEdit 数组,并使用 IsEditNeeded 布尔函数等设置每个 Edit 的可见属性,如果需要 Edit 字段,您可以在其中编码条件。

    【讨论】:

    • 虽然是一个很好的资源,但您链接的示例是关于向标准窗口对话框添加复选框。不确定,从问题来看,但我猜 kseen 只是想在运行时在他/她自己的表单上创建控件。
    猜你喜欢
    • 2018-03-18
    • 2023-03-17
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多