Delphi5实现密码、姓名生成器

news2024/9/19 16:40:31

文章目录

    • 目的
    • 效果图
    • 密码生成器类
      • 类定义
      • 成员函数
    • 点击“密码生成”事件
    • 名字生成器类
      • 类的成员
      • 功能概述
      • 注意点
    • 点击“姓名生成”事件
    • 点击“清空”事件
    • “导出txt”事件
    • “备注”输入框
    • 画图软件
    • 完整代码

目的

写这个程序的目的是生成一个密码和用于快递的名字(生成密码和姓名),并且记下用于哪个电商平台(备注),然后进行保存(导出txt)。为了持续存储,我选择了以不覆盖的方式写入密码和姓名(追加写入)。

效果图

在这里插入图片描述

密码生成器类

unit PasswordGenerator;

interface  
  
uses  
  Windows, SysUtils, Classes, StrUtils;  

{TPasswordGenerator 类封装了密码生成的功能}
type
  TPasswordGenerator = class  
  private
    FAllowedChars: string;    //大小写字母、数字和一系列特殊字符
    FPasswordLength: Integer;   //密码长度
    FGeneratedPasswordsList: TStringList;    //用来装生成的密码
  
    function GenerateChar: Char;
  public  
    constructor Create(passwordLength: Integer; allowedChars: string);
    procedure GeneratePasswords(count: Integer);
    property GeneratedPasswords: TStringList read FGeneratedPasswordsList;
  end;  
  
implementation

{构造函数,接受密码长度和允许的字符集作为参数。}
constructor TPasswordGenerator.Create(passwordLength: Integer; allowedChars: string);
begin
  inherited Create;
  FPasswordLength := passwordLength;
  FAllowedChars := allowedChars;
  FGeneratedPasswordsList := TStringList.Create;
  Randomize; // 初始化随机数生成器
end;

{用于生成一个随机的字符。}
function TPasswordGenerator.GenerateChar: Char;  
var  
  randomIndex: Integer;  
begin  
  randomIndex := Random(Length(FAllowedChars)) + 1;  
  Result := FAllowedChars[randomIndex];  
end;

{生成指定数量的密码,并将它们存储在 FGeneratedPasswordsList 字符串列表中。}
procedure TPasswordGenerator.GeneratePasswords(count: Integer);  
var  
  i, j,n: Integer;
  password: string;  
begin
  FGeneratedPasswordsList.Clear;
  for i := 1 to count do
  begin  
    password := '';  
    for j := 1 to FPasswordLength do  
    begin  
      password := password + GenerateChar;  
    end;  
    FGeneratedPasswordsList.Add(password);  
  end;  
end;  
  
end.

这段代码定义了一个名为 TPasswordGenerator 的Delphi类,该类封装了生成随机密码的功能。以下是代码逻辑的简要概括及作用:

类定义

  • TPasswordGenerator 类是一个用于生成随机密码的类。
  • 它有三个私有成员变量:
    • FAllowedChars:一个字符串,包含了生成密码时可以使用的字符集(如大小写字母、数字和特殊字符)。
    • FPasswordLength:一个整数,表示生成的密码的长度。
    • FGeneratedPasswordsList:一个 TStringList 对象,用于存储生成的密码列表。

成员函数

  • 构造函数 Create(passwordLength: Integer; allowedChars: string)

    • 接受两个参数:密码长度(passwordLength)和允许的字符集(allowedChars)。
    • 初始化 FPasswordLengthFAllowedChars 成员变量。
    • 创建一个新的 TStringList 实例来存储生成的密码,并调用 Randomize 来初始化随机数生成器。
  • GenerateChar 函数

    • 生成并返回一个随机的字符,该字符来自 FAllowedChars 字符串。
    • 使用 Random 函数生成一个随机索引。
  • GeneratePasswords(count: Integer) 过程

    • 接受一个整数参数 count,表示要生成的密码数量。
    • 清空 FGeneratedPasswordsList 列表。
    • 通过两层循环生成指定数量的密码:外层循环控制生成的密码数量,内层循环根据 FPasswordLength 拼接生成单个密码。
    • 每个生成的密码都添加到 FGeneratedPasswordsList 列表中。

点击“密码生成”事件

{密码生成}
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  allowedChars: string;
begin
    // 根据CheckBox初始化允许的字符集
  allowedChars := '';
  if chkUpperCase.Checked then
    allowedChars := allowedChars + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  if chkLowerCase.Checked then
    allowedChars := allowedChars + 'abcdefghijklmnopqrstuvwxyz';
  if chkNumbers.Checked then
    allowedChars := allowedChars + '0123456789';
  if chkSpecialChars.Checked then
    allowedChars := allowedChars + '!@#$%&*+?,';

  // 如果用户没有选择任何字符集,则显示错误消息
  if allowedChars = '' then
  begin
    ShowMessage('请选择至少一种字符类型!');
    Exit;
  end;
  passwordGenerator := TPasswordGenerator.Create(StrToInt(Edit2.text),allowedChars); // 创建一个生成8位密码的生成器
  passwordGenerator.GeneratePasswords(StrToInt(Edit3.text)); // 生成10个密码
  for i := 0 to passwordGenerator.GeneratedPasswords.Count - 1 do
  begin
    ListBox1.Items[i]:=passwordGenerator.GeneratedPasswords[i];
  end; 
  passwordGenerator.Free; // 不要忘记释放对象
end;

这段代码的逻辑主要集中在一个按钮点击事件处理程序中,用于根据用户的选择生成一系列随机密码,并将这些密码显示在列表框中。以下是详细的逻辑步骤:

  1. 初始化允许的字符集 (allowedChars):

    • 初始化一个空字符串 allowedChars,用于存储用户通过复选框(chkUpperCase, chkLowerCase, chkNumbers, chkSpecialChars)选择的字符类型。
    • 遍历这些复选框,如果用户勾选了某个复选框,就将对应的字符集追加到 allowedChars 字符串中。
  2. 检查字符集是否为空:

    • 如果用户没有勾选任何复选框(即 allowedChars 字符串为空),则显示一个错误消息提示用户至少选择一种字符类型,并通过 Exit 语句退出当前过程,不再继续执行后续代码。
  3. 创建密码生成器对象:

    • 使用 TPasswordGenerator.Create 方法创建一个新的 TPasswordGenerator 对象实例。这个方法的参数是密码的长度(从 Edit2 文本框中获取并转换为整数)和允许的字符集(allowedChars)。
  4. 生成密码:

    • 调用 passwordGenerator 对象的 GeneratePasswords 方法,根据用户在 Edit3 文本框中输入的数量(转换为整数)生成指定数量的密码。
  5. 将生成的密码添加到列表框中:

    • 通过一个循环遍历 passwordGenerator.GeneratedPasswords 字符串列表(该列表包含了所有生成的密码),并将每个密码添加到 ListBox1 列表框的相应位置。
  6. 释放密码生成器对象:

    • 最后,通过调用 passwordGenerator.Free 方法释放 passwordGenerator 对象所占用的内存资源。这是一个重要的步骤,用于避免内存泄漏。

总结来说,这段代码通过用户的选择(字符类型和数量)来生成一系列随机密码,并将这些密码显示在界面上的列表框中。

名字生成器类

unit NameGenerator;
  
interface  
  
uses  
  SysUtils, Classes;  
  
type  
  TNameGenerator = class
  private
    //FNames是从文档中提取出来的名字列表
    FNames: TStringList;
    procedure InitializeNames(FileName:string);

  public
    constructor Create(FileName:string);  
    destructor Destroy; override;  
  
    // 公开方法,用于生成随机姓名  
    function GenerateName:string;
  end;  
  
implementation  
  
{ TNameGenerator 姓名生成器类}

constructor TNameGenerator.Create(FileName:string);
begin  
  inherited Create;
  FNames:= TStringList.Create;
  InitializeNames(FileName);
  Randomize; //在实际应用中,最好将Randomize放在应用程序启动时调用
end;
  
destructor TNameGenerator.Destroy;
begin
  FNames.Free;
  inherited Destroy;
end;

{1.txt存储了单字,2.TXT存储了双字,
将文档的名字一个个读取到字符串列表FNamesList中}
procedure TNameGenerator.InitializeNames(FileName:string);
var
  Lines: TStringList;
  i, j: Integer;
  LineText, TempText: string;
begin
  // 创建一TStringList 实例
  Lines := TStringList.Create;

  // 加载文件到 TStringList
  Lines.LoadFromFile(FileName);

  // 遍历 TStringList 中的每一行
  for i := 0 to Lines.Count - 1 do
  begin
    LineText := Lines[i]; // 获取当前行的文本

  // 使用空格分割当前行的文本
  TempText := ''; // 用于构建最终的字符串
  for j := 1 to Length(LineText) do
  begin
    if LineText[j] = ' ' then // 如果遇到空格,可以简单处理为每遇到空格就分割
    begin
      if TempText <> '' then  //获得了一个词
      begin
        FNames.Add(TempText);   //将名字放到字符串列表中。方便随机生成取用
        TempText := ''; // 重置 TempText
      end;
    end
    else
    begin
      TempText := TempText + LineText[j]; // 否则,将字符添加到 TempText
    end;
  end;

  // 添加最后一个单词(如果有的话)
  if TempText <> '' then
    FNames.Add(TempText);
  end;
end;

{从名字列表中随机选一定数量的名字出来}
function TNameGenerator.GenerateName:string;
var  
  NameIndex: Integer;
begin
  NameIndex := Random(FNames.Count);
  Result:=FNames[NameIndex];
end;
  
end.

结合下图,辅助理解上面的代码。

在这里插入图片描述
这段代码定义了一个名为 TNameGenerator 的类,该类用于从指定的文本文件中读取名字,并将这些名字存储在一个 TStringList 列表中,以便之后可以从中随机选择一个名字。以下是该类的详细概述:

类的成员

  • 私有成员

    • FNames: TStringList 类型的私有成员,用于存储从文件中读取的名字。
    • InitializeNames(FileName: string): 一个私有过程,用于从指定的文件(FileName)中读取名字,并将它们添加到 FNames 列表中。
  • 公共成员

    • Create(FileName: string): 构造函数,它接收一个文件名作为参数,初始化 FNames 列表,并调用 InitializeNames 过程来填充该列表。
    • Destroy: 析构函数,用于释放 FNames 列表所占用的内存资源。
    • GenerateName: 一个公共函数,用于从 FNames 列表中随机选择一个名字并返回。

功能概述

  1. 构造函数 (Create):当创建 TNameGenerator 类的实例时,构造函数会被调用。它首先创建 FNames 列表,然后调用 InitializeNames 过程来从指定的文件中读取名字,并将这些名字添加到 FNames 列表中。

  2. 读取名字 (InitializeNames):此私有过程负责从提供的文件(FileName)中读取名字。它首先创建一个临时的 TStringList 实例(Lines),然后使用 LoadFromFile 方法加载文件内容。之后,它遍历文件中的每一行,并将每个单词(假设单词由空格分隔)添加到 FNames 列表中。如果一行中没有空格,则整行被视为一个名字。

  3. 生成随机名字 (GenerateName):此公共函数使用 Random 函数从 FNames 列表中随机选择一个索引,并返回该索引对应的名字。

注意点

  • 在实际应用中,Randomize 最好在应用程序启动时只调用一次,而不是在每次创建 TNameGenerator 实例时都调用。因为 Randomize 使用系统时间作为随机数生成的种子,如果频繁调用,可能会因为时间变化不大而导致生成的随机数序列不够随机。

点击“姓名生成”事件

{姓名生成}
procedure TForm1.Button2Click(Sender: TObject);  
var  
  i: Integer;  
  FileName, newName: string;  
  NameGenerator: TNameGenerator;  
  Names: TStringList;  
  UniqueNameCount: Integer;  
  Index: Integer;  
begin  
  // 初始化文件名  
  FileName := Edit5.Text + '.txt';  
  
  // 创建 TNameGenerator 实例(如果它确实需要文件名作为参数)  
  NameGenerator := TNameGenerator.Create(FileName);
  ListBox2.Items.clear;  
  try  
    // 创建一个 TStringList 来存储唯一的名字  
    Names := TStringList.Create;  
    try  
      // 尝试生成指定数量的唯一名字(这里假设 Edit6.Text 包含想要的名字数量)  
      UniqueNameCount := 0;  
      while UniqueNameCount < StrToInt(Edit6.Text) do  
      begin  
        // 生成一个新名字  
        newName := NameGenerator.GenerateName;  
  
        // 使用 IndexOf 方法来检查一个字符串是否已经在 TStringList 中。
        Index := Names.IndexOf(newName);  
        if Index = -1 then  
        begin  
          // 如果不在列表中,则添加到列表和 ListBox2  
          Names.Add(newName);  
          ListBox2.Items.Add(Edit4.Text + newName); // 假设 Edit4.Text 是前缀
          Inc(UniqueNameCount);  
        end;  
        // 如果已经在列表中,则循环继续,直到找到一个唯一的名字  
      end;  
    finally  
      // 释放 TStringList 资源  
      Names.Free;  
    end;  
  finally  
    // 释放 TNameGenerator 资源  
    NameGenerator.Free;  
  end;  
end;

这段代码的逻辑是为了从一个文本文件中读取名字(这些名字是按行存储的,且文件名由用户通过 Edit5 输入框指定),并生成指定数量的唯一名字(这个数量由用户通过 Edit6 输入框指定)。生成的名字将显示在一个名为 ListBox2 的列表框中,且每个生成的名字前可以添加一个前缀(这个前缀由用户通过 Edit4 输入框指定)。以下是该逻辑的详细步骤:

  1. 初始化文件名:从 Edit5 输入框获取文件名,并附加 .txt 后缀,构成完整的文件名 FileName

  2. 创建 TNameGenerator 实例:使用前面获取的文件名 FileName 创建一个 TNameGenerator 类的实例 NameGenerator。这里假设 TNameGenerator 类的构造函数接受一个文件名作为参数,用于从该文件中读取名字。

  3. 清空 ListBox2:清除 ListBox2 列表框中的所有现有项,以便展示新生成的名字。

  4. 创建 TStringList 实例:创建一个 TStringList 实例 Names,用于存储已经生成并确认唯一的名字。

  5. 生成唯一名字

    • 进入一个循环,循环次数由 Edit6 输入框中的数值(转换为整数)决定,即生成指定数量的唯一名字。
    • 在每次循环中,调用 NameGenerator.GenerateName 方法生成一个新名字 newName
    • 使用 Names.IndexOf(newName) 检查这个新名字是否已经在 Names 列表中。如果 IndexOf 返回 -1,表示该名字不在列表中,是唯一的。
    • 如果名字是唯一的,则将其添加到 Names 列表和 ListBox2 列表框中,并在名字前添加由 Edit4 输入框指定的前缀。同时,增加 UniqueNameCount 计数器的值。
    • 如果名字已经在列表中,则不执行任何操作,循环继续,直到生成一个新的唯一名字。
  6. 资源释放

    • try...finally 块中,确保在退出之前释放 Names 字符串列表所占用的资源。
    • 在最外层的 finally 块中,确保释放 NameGenerator 实例所占用的资源。

通过这种方式,该代码片段能够确保生成指定数量的唯一名字,并将这些名字(带前缀)展示在 ListBox2 列表框中。

点击“清空”事件

{密码清空}
procedure TForm1.Button4Click(Sender: TObject);
begin
  ListBox1.Items.Clear; // 清空ListBox1中的所有项
end;

“导出txt”事件

{导出为txt}
procedure TForm1.Button3Click(Sender: TObject);
var
  i: Integer;
  sl: TStringList;
  FileName: string;
begin
  //创建一个保存对话框,以便用户选择文件保存位置
  SaveDialog := TSaveDialog.Create(nil);
  try
    SaveDialog.Title := '保存选中的项到TXT文件';
    SaveDialog.Filter := 'Text Files (*.txt)|*.txt|All Files (*.*)|*.*';
    if SaveDialog.Execute then
    begin
      FileName := SaveDialog.FileName; // 获取用户选择的文件名
      // 创建一个TStringList来存储要写入文件的项
      sl := TStringList.Create;
      try
        if FileExists(FileName) then
        begin
          sl.LoadFromFile(FileName); // 加载旧内容
        end;

        // 遍历ListBox中选中的项
        for i := 0 to ListBox1.Items.Count - 1 do
        begin
          if ListBox1.Selected[i] then // 检查该项是否被选中
          begin
            sl.Add(ListBox1.Items[i]); // 将选中的项添加到TStringList中
          end;
        end;

        for i := 0 to ListBox2.Items.Count - 1 do
        begin
          if ListBox2.Selected[i] then // 检查该项是否被选中
          begin
            sl.Add(ListBox2.Items[i]); // 将选中的项添加到TStringList中
          end;
        end;

        //写入备注
        sl.Add(edit1.Text);

        //写入分隔符
        sl.Add('-------------------------');

        // 将TStringList的内容写入到文件中
        sl.SaveToFile(FileName);
        edit7.Text:=FileName;
        ShowMessage('选中的项已成功导出到文件: ' + FileName);
      finally
        sl.Free; // 释放TStringList实例
      end;
    end;
  finally
    SaveDialog.Free; // 释放保存对话框实例
  end;
end;

这段代码的逻辑是允许用户将两个列表框(ListBox1ListBox2)中选中的项以及一个文本编辑框(Edit1)中的内容导出到一个文本文件(.txt)中。以下是该逻辑的详细步骤:

  1. 创建保存对话框:首先,代码通过创建一个 TSaveDialog 实例来允许用户选择一个文件保存位置。这个对话框的标题被设置为“保存选中的项到TXT文件”,并且文件过滤器被设置为只显示文本文件(.txt)和所有文件(.)。

  2. 执行保存对话框:接着,代码调用 SaveDialog.Execute 方法来显示保存对话框。如果用户点击了“保存”按钮,那么对话框的 FileName 属性将被设置为用户选择的文件名。

  3. 创建TStringList实例:如果用户选择了文件名,代码将创建一个 TStringList 实例 sl,用于存储将要写入文件的项。

  4. 加载旧内容(可选):如果目标文件已经存在,代码会尝试使用 sl.LoadFromFile(FileName) 方法加载该文件的内容到 TStringList 中。这意味着如果用户想要将新内容追加到现有文件,这个步骤是必要的。

  5. 遍历列表框并添加选中项:代码接着遍历 ListBox1ListBox2 中的每一项,检查该项是否被选中(通过 ListBoxX.Selected[i])。如果项被选中,则将其添加到 TStringList 实例 sl 中。

  6. 添加备注:之后,代码将 Edit1 文本编辑框中的内容作为备注添加到 TStringList 中。

  7. 添加分隔符:为了区分文件内容的不同部分,代码向 TStringList 中添加了一个分隔符字符串('-------------------------')。

  8. 保存文件:最后,使用 sl.SaveToFile(FileName) 方法将 TStringList 中的所有内容写入到用户选择的文件中。同时,文件名也被更新到 Edit7 文本编辑框中,并向用户显示一个消息框,告知用户选中的项已成功导出到文件中。

  9. 资源释放:在 try...finally 块中,代码确保在退出之前释放了 TStringListTSaveDialog 实例所占用的资源。

总的来说,这段代码提供了一种灵活的方式来将用户从两个列表框中选中的项以及一个文本编辑框中的内容导出到一个文本文件中,同时允许用户选择文件的保存位置和文件名。

“备注”输入框

这里有点“小心机”。编辑框初始化时,文字是浅色的,点击编辑框,内容消失,并且文字变为深色了。

{备注}
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  // 当Edit1获得焦点时,清空其内容
  Edit1.Text := '';
  Edit1.Font.Color:=clWindowText;
end;

画图软件

今天新发现的在线作图,能导入图片,但是刷新时不保存。

在这里插入图片描述

完整代码

代码在这。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

keepalived详细讲解

keepalived&#xff1a; Keepalived是一个基于VRRP&#xff08;‌Virtual Router Redundancy Protocol&#xff0c;‌虚拟路由冗余协议&#xff09;‌协议实现的LVS&#xff08;‌Linux Virtual Server&#xff09;‌服务高可用方案。‌它的主要作用是进行虚拟路由的故障切换&…

算法打卡 Day24(二叉树)-二叉搜索树的最近公共祖先 + 二叉搜索树中的插入操作 + 删除二叉搜索树中的节点

文章目录 Leetcode 235-二叉搜索树的最近公共祖先题目描述解题思路 Leetcode 701-二叉搜索树中的插入操作题目描述解题思路 Leetcode 450-删除二叉搜索树中的节点题目描述解题思路 Leetcode 235-二叉搜索树的最近公共祖先 题目描述 https://leetcode.cn/problems/lowest-comm…

江协科技STM32学习笔记(第10章 SPI通信)

第10章 SPI通信 10.1 SPI通信协议 10.1.1 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线&#xff1b; 串行外设接口&#xff1b; I2C无论是软件还是软件电路&#xff0c;设计的都还是比较复杂的&#xff0c;硬件…

xss靶场详解

目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 8.第八题 1.第一题 在源码script标签里边&#xff0c;innerhtml是用于访问或修改 HTML 元素内的 HTML 内容的&#xff0c;这里是访问spaghet这个元素的&#xff0c;并通过括号里面的东西搜索当前…

【问题解决3】【已解决】Cannot determine path to‘tools.jar‘libraryfor17

前几天在IDEA运行JAVA项目时&#xff0c;出现这个报错。 这是因为是这个笔记本上安装的IDEA版本是“IntelliJ IDEA 2020.3.1”&#xff0c;与JDK17版本不兼容&#xff0c;这种情况下要想使得IDEA版本与JDK版本兼容&#xff0c;就需要升级IDEA版本或者使用JDK较低版本&#xff…

专题---自底向上的计算机网络(计算机网络相关概述)

目录 计算机网络相关概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 1.计算机网络相关概述&#xff08;具体细节http://t.csdnimg.cn/NITAW&#xff09; 什么是计算机网络&#xff1f; 计算机网络是将一个分散的&#xff0c;具有独立功能的计算机系统&#x…

FusionSphere虚拟机网络不通

虚拟机侧 1、通过控制台Console或者VNC登录虚拟机。 获取VNC的token链接&#xff0c;因为token有超时失效&#xff0c;该链接获取后长时间不用要重新获取。 # nova get-vnc-console vmid novnc 2、登录VNC控制台之后&#xff0c;检查网卡和IP地址是否up, ARP学习是否正常…

Postman 问题汇总

1 postman Error: SSL Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE 根因 SSL校验失败&#xff0c;可以在postman设置中关闭ssl校验&#xff0c;自测对ssl无要求。 解决方法 在postman设置中关闭ssl校验&#xff1a;

树莓派智能语音助手之聊天机器人-RASA

我的树莓派目前已经会“说”&#xff08;《树莓派智能语音助手之TTS - pyttsx3 espeak》&#xff09;&#xff0c;也能“听”&#xff08;《树莓派智能语音助手之ASR2 – sherpa-ncnn》&#xff09;了。接下来&#xff0c;就要让它能够和我们对话起来&#xff0c;即会“聊天”…

python 获取pdf文件中的超链接

pip install pymupdf pip install fitzimport fitz # PyMuPDFdef get_pdf_links(pdf_path):# 打开PDF文件document fitz.open(pdf_path)links []for page_num in range(len(document)):page document[page_num]# 获取当前页面的链接for link in page.get_links():links.app…

Mac升级系统文件都丢了怎么办?Mac更新后资料找不到了怎么恢复

Mac电脑由于其卓越的性能&#xff0c;受到了众多电脑用户的青睐。为了让用户获得更好的使用体验&#xff0c;Mac系统会定期推出新版本&#xff0c;来弥补前一个版本的不足。然而有用户反馈&#xff0c;Mac升级后&#xff0c;电脑里的部分资料消失了。mac升级会丢失文件吗?mac升…

iOS ColleCtionView 如何让cell 不重复创建并且只在展示的时候才创建

前言 使用 collectionView 一屏只展示一个 cell &#xff0c;一次只加载当前 cell&#xff0c;还要能够缓存已加载过的 cell &#xff0c;使 cell 不重复加载&#xff0c;听着好像就是将 collectionView 的复用机制禁用掉。用collectionView 实现这个需求&#xff0c;就出现了…

【GD32】从零开始学GD32单片机 | PMU电源管理单元+深度睡眠和待机例程(GD32F470ZGT6)

1. 简介 PMU电源管理单元通俗讲就是用来管理MCU的电源域的&#xff0c;它主要有两个功能——电压监测和低功耗管理。在GD32中一共有3个电源域——VDD/VDDA域、1.2V域和备份域。 VDD/VDDA域主要供PMU控制器、ADC、DAC等外设使用&#xff1b;1.2V域就是大部分外设都会使用的电源域…

ai大模型之争-生成音乐-豆包

豆包网页版&#xff1a;豆包 可以生成自定义音乐了 1&#xff0c;打开网页&#xff0c;登录 2&#xff0c;选择音乐生成 3&#xff0c;进行音乐配置 3.1&#xff0c;可以选择&#xff1a; 1&#xff0c;自己写歌词或者ai创造歌词&#xff1b; 2&#xff0c;可以选输入歌词…

xss漏洞复现

目录 第一关 第二关 第三关 第四关 第五关 第一关 要求&#xff1a; Pop an alert(1337) on sandbox.pwnfunction.com. No user interaction. 代码&#xff1a; <!-- Challenge --> <h2 id"spaghet"></h2> <script> spaghet.inn…

【数据结构与算法 | 图篇】Floyd-Warshall算法(多源最短路径算法)

1. 前言 Floyd-Warshall算法是一种在有向图或无向图中寻找所有顶点对之间的最短路径的动态规划算法。该算法可以处理带权重的边&#xff0c;并且能够正确处理负权重的边&#xff08;但不包括负权重循环&#xff09;&#xff0c;不过它不能处理包含负权重循环的情况&#xff0c…

IDEA 设置SVN项目管理忽略文件

忽略已经控制的文件 打开本地已经克隆下来的项目&#xff0c;并找到需要忽略控制的文件或文件夹 操作完成之后需要将当前的操作更新到SVN服务器。 直接在IDEA中提交修改&#xff08;快捷键CTRL K&#xff09;就可以 unverison: 取消版本控制 add to ignore list&#xff1…

C语言之文件操作上卷(二十一)(逆行人生-2024)

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; ✏️作者主页&#xff1a;枫霜剑客 &#x1f4cb; 系列专栏&#xff1a;C语言知识学习归纳总结&#xff08;逐梦篇专栏合集&#xff09; &#x1f332;上一篇: C语…

17 Menubutton 组件

17 Menubutton 组件 Tkinter 的 Menubutton 组件是一个特殊的按钮&#xff0c;当点击时会弹出一个菜单。这个菜单可以包含多个菜单项&#xff0c;允许用户从菜单中选择一个选项。Menubutton 通常用于创建带有下拉菜单的界面。以下是对 Menubutton 组件的详细说明和一个使用案例…