VCL CheckListBox 传递选中的 Item 并删除它

yes*_*ded 1 delphi vlc

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

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

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

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

泰褪色。

And*_*and 5

这是一个更好的方法:

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

  2. 添加一个TCheckListBox控件,上面有几个项目:

    表单设计器的屏幕截图。 窗体上存在单个 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;
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,@yesIamFaded。是的,VCL 的动作非常棒。为了更清楚地看到这一点,您可以将两个“TButton”控件放在与我的答案相同的表单上,并将它们放在复选框下方,彼此相邻。然后将它们的操作分别设置为“aDelete”和“aRename”。您会注意到这些按钮也从操作中获取标题、提示和行为。例如,在您选择复选框中的一项之前,它们都将被禁用。 (2认同)