【问题标题】:VCL CheckListBox pass selected Item and delete itVCL CheckListBox 传递选定的项目并删除它
【发布时间】:2020-09-01 02:50:09
【问题描述】:

大家好,我是 Delphi 初学者,我有一个简单的问题,因为在网上为 Delphi 找到一些东西似乎很困难。

我有一个 CheckListBox,当我点击一个项目的复选框时,我想将它传递给另一个表单,可以说创建了 form2。我有 2 个按钮:

  1. 删除 - 它应该删除选定的项目,以便生成表单的项目。如何删除选定的项目?

  2. 编辑条目 - 我需要将选中的项目值传递到另一个表单,我可以在其中编辑值并将其另存为新的。如何将所选项目中的值传递到另一个表单?

Ty 褪色。

【问题讨论】:

  • 您需要第二张表格吗?为什么不简单地使用带有“删除”(Del) 和“重命名”(F2) 项的上下文菜单?
  • 我不需要第二个表格,但我认为可以用第二个表格做这样的事情。你能解释一下上下文菜单是什么或如何实现它吗=

标签: delphi vlc


【解决方案1】:

这里有一个更好的方法:

  1. 创建一个新的 VCL 应用程序。

  2. 添加一个带有一些项目的TCheckListBox 控件:

  3. 在表单上放置一个TActionList 组件。

  4. 创建两个操作:aDeleteaRename。将它们的标题设置为Delete...Rename...,并将它们的提示设置为Removes the selected item from the list.Renames the selected item in the list.

  5. 将以下代码添加到他们的OnExecute 处理程序:

    procedure TForm1.aDeleteExecute(Sender: TObject);
    begin
    
      if CheckListBox1.ItemIndex = -1 then
        Exit;
    
      if MessageBox(Handle, 'Do you want to delete the selected item?',
        'Delete', MB_ICONQUESTION or MB_YESNO) <> IDYES then
        Exit;
    
      CheckListBox1.DeleteSelected;
    
    end;
    
    procedure TForm1.aRenameExecute(Sender: TObject);
    var
      S: string;
    begin
    
      if CheckListBox1.ItemIndex = -1 then
        Exit;
    
      S := CheckListBox1.Items[CheckListBox1.ItemIndex];
      if InputQuery('Rename', 'Please enter the new name:', S) then
        CheckListBox1.Items[CheckListBox1.ItemIndex] := S;
    
    end;
    
  6. 将以下代码添加到他们的 OnUpdate 处理程序中:

    procedure TForm1.aDeleteUpdate(Sender: TObject);
    begin
      aDelete.Enabled := CheckListBox1.ItemIndex <> -1;
    end;
    
    procedure TForm1.aRenameUpdate(Sender: TObject);
    begin
      aRename.Enabled := CheckListBox1.ItemIndex <> -1;
    end;
    
  7. 在表单上添加TPopupMenu。将其命名为pmList。添加两个菜单项。将它们的Action 属性分别设置为aDeleteaRename。这将自动为项目提供操作的标题、提示和热键:

  8. 现在将pmList 分配给复选框控件的PopupMenu 属性。

  9. 测试应用程序。请注意,上下文菜单项仅在选择项目时启用;否则,它们都被禁用。 (这要感谢OnUpdate 处理程序。跳过这些会很草率。但请注意,我们仍然验证在OnExceute 处理程序中选择了一个项目。在质量软件中,您总是同时使用腰带和大括号。)

  10. 当然,我们必须将 DelF2 键映射到删除和重命名操作。我们可以使用操作的ShortCut 属性,但这会使这些键在此列表中删除和重命名,即使另一个 GUI 控件具有焦点,这非常糟糕。相反,我们将OnKeyDown 处理程序添加到复选框控件本身:

    procedure TForm1.CheckListBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      case Key of
        VK_DELETE:
          aDelete.Execute;
        VK_F2:
          aRename.Execute;
      end;
    end;
    

【讨论】:

  • 哥们,你太棒了,我什至都不知道有这样的可能性。非常感谢您抽出宝贵的时间发布这个很棒的答案。从 React Native 开始,互联网上有很多东西,这是我认为 Delphi 最缺乏的东西。因为总的来说,Delphi 似乎是一种有很多可能性的伟大语言。
  • @yesIamFaded,你说的很对。 AndreasR 是这里非常活跃的贡献者,经常提供高质量的答案。
  • 谢谢你,@yesIamFaded。是的,VCL 的动作非常棒。为了更清楚地看到这一点,您可以将两个 TButton 控件放在与我的答案相同的表单上,并将它们放在复选框下方,彼此相邻。然后将他们的动作分别设置为aDeleteaRename。您会注意到这些按钮也可以从操作中获取标题、提示和行为。例如,它们都将被禁用,直到您在复选框中选择一个项目。
  • 请注意,选中(突出显示)项目和选中项目之间存在差异。 TCheckListBox.ItemIndex 是第一个选中项的索引。如果TCheckListBox.MultiSelectTrue,则可能选择了多个项目,因此您必须使用TCheckListBox.SelCountTCheckListBox.Selected[] 属性来发现所有已选择 项目。此外,项目可以选中,但不能选中,因此您必须使用TCheckListBox.Items.CountTCheckListBox.Checked[] 属性来发现所有选中 项目.
猜你喜欢
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2013-09-14
  • 2014-10-14
相关资源
最近更新 更多