Delphi5实现鱼C记事本程序(TRichEdit版)

news2024/9/20 16:52:29

效果图

鱼C记事本程序

程序图标

Delphi5的程序图标需要ICO后缀名的文件,已经上传到CSDN,可以用一下。

在这里插入图片描述

有什么快捷生成ICO文件的方法,可以在评论区分享一下噢,谢谢!!

MainMenu菜单组件

在这里插入图片描述

TRichEdit 组件

在 Delphi 5 中,TRichEdit 组件是一个用于显示和编辑格式化文本的组件。它提供了比标准的多行文本编辑控件(如 TMemo)更丰富的文本处理能力,包括字体样式(如粗体、斜体、下划线)、颜色、段落格式等。TRichEdit 组件基于 Windows 的 Rich Edit 控件,因此它支持 Windows Rich Text Format (RTF) 格式的文本。

TOpenDialog组件

显示一个标准的“打开文件”对话框,让用户选择一个或多个文件。

TSaveDialog组件

在Delphi 5中,TSaveDialog组件是一个标准的文件保存对话框,它允许用户选择一个文件位置并输入文件名以保存文件。这个组件是基于Windows的通用文件对话框API构建的,提供了丰富的配置选项,如文件过滤器、默认扩展名、初始目录等。

Filter属性:定义对话框中显示的文件类型过滤器。你可以指定多个过滤器,每个过滤器由描述和对应的文件扩展名组成,例如文本文件(*.txt)|*.txt

在这里插入图片描述

功能-文件

注意一下TOpenDialog、TSaveDialog组件的Filter即可。

鱼C记事本——文件

{实现 文件 功能}
{文件-新建}
procedure TForm1.N2Click(Sender: TObject);
//清除当前文本框的内容即可,后续就是打开和保存操作了
begin
  mmo1.clear;
end;

{文件-打开}
procedure TForm1.O3Click(Sender: TObject);
//打开文件对话框
//选择文件
//加载文件,显示文件
begin
  dlgOpen1.Filter:='文本文档(*.txt)|*.TXT';
  if dlgOpen1.Execute then  设置文件过滤器
  begin
    filename:= dlgOpen1.FileName;
    mmo1.Lines.LoadFromFile(filename);
  end
  else
    Exit;
end;

{文件-保存}
procedure TForm1.O2Click(Sender: TObject);
//打开文本保存对话框
//自定义文件名
//将文本输入框的文本保存到文件名
begin
  dlgSave1.Filter:='文本文档(*.txt)|*.TXT';
  if dlgSave1.Execute then
  begin
    filename:=dlgSave1.FileName+'.txt';
    mmo1.Lines.SaveToFile(filename);
  end
  else
    Exit;
end;

{文件-退出}
procedure TForm1.E2Click(Sender: TObject);
begin
  close;
end;

功能-编辑

功能都是用Delphi5的内部函数实现,一句话代码。

鱼C记事本——编辑

var
  Form1: TForm1;
  filename:string;
  
  {编辑-查找}
  Alltext: string;    //文本框内容
  startPos: Integer; // 上次查找的结束位置
  selecttext:string;   //查找内容

{实现 编辑 功能}
{编辑-撤销}
procedure TForm1.U1Click(Sender: TObject);
begin
  mmo1.Undo;
end;

{编辑-剪切}
procedure TForm1.T1Click(Sender: TObject);
begin
  mmo1.CutToClipboard;
end;

{编辑-复制}
procedure TForm1.C1Click(Sender: TObject);
begin
  mmo1.CopyToClipboard;
end;

{编辑-粘贴}
procedure TForm1.P1Click(Sender: TObject);
begin
  mmo1.PasteFromClipboard;
end;

{编辑-删除}
procedure TForm1.D1Click(Sender: TObject);
//删除选中的文本
begin
  mmo1.ClearSelection;
end;

{编辑-全选}
procedure TForm1.A1Click(Sender: TObject);
begin
  mmo1.SelectAll;
end;

{编辑-插入日期}
procedure TForm1.N7Click(Sender: TObject);
begin
  mmo1.SelText:=DateTimeToStr(Now());
end;
查找

定义一个查找函数,从某个位置开始,在一个长文本中查找一个字符串,最后返回位置。实现“查找下一个”功能的逻辑:每次调用查找函数,将返回的位置作为下一次查找的开始位置。

{查找下一个的函数,自定义}
function FindNextSubstring(const str: string; const sub: string; startPos: Integer): Integer;
var
  foundPos: Integer;
begin
  // 确保startPos在字符串范围内
  if startPos < 1 then
    startPos := 1;
  if startPos > Length(str) then
    Exit; // 如果startPos超出字符串长度,则返回-1表示未找到

  // 使用Pos函数从startPos开始查找
  foundPos := Pos(sub, Copy(str, startPos, MaxInt));
  if foundPos > 0 then
  begin
    // 由于Pos函数是从其输入字符串的开头开始计数的,
    // 我们需要将找到的位置偏移回原始字符串的坐标系中
    Result := startPos + foundPos - 1;
  end
  else
  begin
    // 如果没有找到子字符串,则返回-1
    Result := -1;
  end;
end;

{编辑-查找}
procedure TForm1.F1Click(Sender: TObject);
//选中需要查找的文本
//打开查询对话框
begin
  dlgFind1.FindText:=mmo1.SelText;  //将文本框选中的文本放在对话框-查找内容
  Alltext := mmo1.Text; // 编辑框的文本
  selecttext:= mmo1.SelText;    //选中的文本,要查找的大小
  startPos := 0; // 开始新的查找
  dlgFind1.Execute;
end;

{查找下一个}
procedure TForm1.dlgFind1Find(Sender: TObject);
var
  foundPos:integer;
begin
  foundPos := FindNextSubstring(Alltext, selecttext, startPos);
  if foundPos <> -1 then
  begin
    showmessage('找到了'+selecttext+'在第'+inttostr(foundPos)+'个字符');
    mmo1.SelStart := FoundPos;
    mmo1.SelLength := Length(selecttext);
    // 查找下一个实例(从上一个找到的位置之后开始)
    startPos := foundPos + Length(selecttext); // 假设我们不想查找重叠的实例
  end
  else
  begin
    showmessage('找不到,重新再找一次。');
    startPos := 0;
  end;
end;
替换

主要是调用ReplaceDialog组件完成的。

{编辑-替换}
procedure TForm1.R1Click(Sender: TObject);
//选中需要替换的文本
// 打开替换对话框
begin
  dlgReplace1.FindText:=mmo1.SelText;
  dlgReplace1.Execute;
end;

//当点击对话框中“替换”时,算法逻辑(替换1次)
procedure TForm1.dlgReplace1Replace(Sender: TObject);
var
  selpos:Integer;
begin
  with TReplaceDialog(Sender) do
  begin
    {用于查找子字符串在另一个字符串中首次出现的位置。如果找到了子字符串,
    Pos 函数将返回子字符串首次出现的位置(索引从1开始),
    如果没有找到,则返回0。}
    selpos:=Pos(FindText,mmo1.Lines.Text);
    if selpos>0 then
    begin
      {SelLength、SelStart 和 SelText 是与 文本选择 相关的三个重要属性。}
      mmo1.SelStart:=selpos-1;
      mmo1.SelLength:=Length(FindText);
      mmo1.SelText:=ReplaceText;
      {当你读取 SelText 时,它会返回当前选择区域的文本内容。
      当你向 SelText 写入新文本时,它会替换当前选中的文本(如果 SelLength 大于0)。}
    end
    else
      MessageBox(0,'抱歉,找不到需要替换的文本','提醒!',MB_OK or MB_ICONWARNING);
  end;
end;

功能-格式

鱼C记事本——格式

{格式-字体}
procedure TForm1.F2Click(Sender: TObject);
//打开字体选择对话框
//选择字体
begin
  if dlgFont1.execute then
    mmo1.Font:=dlgFont1.Font
  else
    exit;
end;

{格式-背景}
procedure TForm1.N8Click(Sender: TObject);
begin
  if dlgColor1.execute then
    mmo1.color:=dlgColor1.color
  else
    exit;
end;

功能-帮助

{帮助-关于}
procedure TForm1.A2Click(Sender: TObject);
begin
  ShellAbout(self.handle,
    pchar('鱼C记事本'),
    pchar('CSDN-C4FX'),
    hicon(nil));
end;

鱼C记事本——帮助

总结

只是简单地实现了记事本的功能,运行效果还不错,该有的差不多都有了。在“文件-替换”处有小小bug,还有很多可以完善的地方,有机会再改吧。

在线视频拼接

为了不剪辑,录制的流畅性,把各个功能模块分块录制,然后拼接一起的,所以用了一个在线视频拼接工具。

在这里插入图片描述

完整代码

unit book;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Dialogs, Forms,Form, Formprpt, Menus, StdCtrls, shellapi, ComCtrls;

type
  TForm1 = class(MForm)
    mainmenu1: TMainMenu;
    N1: TMenuItem;
    E1: TMenuItem;
    O1: TMenuItem;
    H1: TMenuItem;
    N2: TMenuItem;
    O2: TMenuItem;
    O3: TMenuItem;
    N3: TMenuItem;
    E2: TMenuItem;
    U1: TMenuItem;
    T1: TMenuItem;
    C1: TMenuItem;
    P1: TMenuItem;
    D1: TMenuItem;
    N4: TMenuItem;
    A1: TMenuItem;
    N5: TMenuItem;
    F1: TMenuItem;
    R1: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    F2: TMenuItem;
    N8: TMenuItem;
    A2: TMenuItem;
    dlgOpen1: TOpenDialog;
    dlgSave1: TSaveDialog;
    dlgFind1: TFindDialog;
    dlgReplace1: TReplaceDialog;
    dlgColor1: TColorDialog;
    dlgFont1: TFontDialog;
    mmo1: TRichEdit;
    procedure O3Click(Sender: TObject);
    procedure O2Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure E2Click(Sender: TObject);
    procedure U1Click(Sender: TObject);
    procedure T1Click(Sender: TObject);
    procedure C1Click(Sender: TObject);
    procedure P1Click(Sender: TObject);
    procedure D1Click(Sender: TObject);
    procedure A1Click(Sender: TObject);
    procedure F1Click(Sender: TObject);
    procedure R1Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure F2Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure A2Click(Sender: TObject);
    procedure dlgReplace1Replace(Sender: TObject);
    procedure dlgFind1Find(Sender: TObject);
//    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  filename:string;

  {编辑-查找}
  Alltext: string;    //文本框内容
  startPos: Integer; // 上次查找的结束位置
  selecttext:string;   //查找内容


implementation

{$R *.DFM}

{实现 文件 功能}

{文件-新建}
procedure TForm1.N2Click(Sender: TObject);
//清除当前文本框的内容即可,后续就是打开和保存操作了
begin
  mmo1.clear;
end;

{文件-打开}
procedure TForm1.O3Click(Sender: TObject);
//打开文件对话框
//选择文件
//加载文件,显示文件
begin
  dlgOpen1.Filter:='文本文档(*.txt)|*.TXT';
  if dlgOpen1.Execute then  设置文件过滤器
  begin
    filename:= dlgOpen1.FileName;
    mmo1.Lines.LoadFromFile(filename);
  end
  else
    Exit;
end;

{文件-保存}
procedure TForm1.O2Click(Sender: TObject);
//打开文本保存对话框
//自定义文件名
//将文本输入框的文本保存到文件名
begin
  dlgSave1.Filter:='文本文档(*.txt)|*.TXT';
  if dlgSave1.Execute then
  begin
    filename:=dlgSave1.FileName+'.txt';
    mmo1.Lines.SaveToFile(filename);
  end
  else
    Exit;
end;

{文件-退出}
procedure TForm1.E2Click(Sender: TObject);
begin
  close;
end;

{实现 编辑 功能}
{编辑-撤销}
procedure TForm1.U1Click(Sender: TObject);
begin
  mmo1.Undo;
end;

{编辑-剪切}
procedure TForm1.T1Click(Sender: TObject);
begin
  mmo1.CutToClipboard;
end;

{编辑-复制}
procedure TForm1.C1Click(Sender: TObject);
begin
  mmo1.CopyToClipboard;
end;

{编辑-粘贴}
procedure TForm1.P1Click(Sender: TObject);
begin
  mmo1.PasteFromClipboard;
end;

{编辑-删除}
procedure TForm1.D1Click(Sender: TObject);
//删除选中的文本
begin
  mmo1.ClearSelection;
end;

{编辑-全选}
procedure TForm1.A1Click(Sender: TObject);
begin
  mmo1.SelectAll;
end;

{查找下一个的函数,自定义}
function FindNextSubstring(const str: string; const sub: string; startPos: Integer): Integer;
var
  foundPos: Integer;
begin
  // 确保startPos在字符串范围内
  if startPos < 1 then
    startPos := 1;
  if startPos > Length(str) then
    Exit; // 如果startPos超出字符串长度,则返回-1表示未找到

  // 使用Pos函数从startPos开始查找
  foundPos := Pos(sub, Copy(str, startPos, MaxInt));
  if foundPos > 0 then
  begin
    // 由于Pos函数是从其输入字符串的开头开始计数的,
    // 我们需要将找到的位置偏移回原始字符串的坐标系中
    Result := startPos + foundPos - 1;
  end
  else
  begin
    // 如果没有找到子字符串,则返回-1
    Result := -1;
  end;
end;

{编辑-查找}
procedure TForm1.F1Click(Sender: TObject);
//选中需要查找的文本
//打开查询对话框
begin
  dlgFind1.FindText:=mmo1.SelText;  //将文本框选中的文本放在对话框-查找内容
  Alltext := mmo1.Text; // 编辑框的文本
  selecttext:= mmo1.SelText;    //选中的文本,要查找的大小
  startPos := 0; // 开始新的查找
  dlgFind1.Execute;
end;

{查找下一个}
procedure TForm1.dlgFind1Find(Sender: TObject);
var
  foundPos:integer;
begin
  foundPos := FindNextSubstring(Alltext, selecttext, startPos);
  if foundPos <> -1 then
  begin
    showmessage('找到了'+selecttext+'在第'+inttostr(foundPos)+'个字符');
    mmo1.SelStart := FoundPos;
    mmo1.SelLength := Length(selecttext);
    // 查找下一个实例(从上一个找到的位置之后开始)
    startPos := foundPos + Length(selecttext); // 假设我们不想查找重叠的实例
  end
  else
  begin
    showmessage('找不到,重新再找一次。');
    startPos := 0;
  end;
end;

{编辑-替换}
procedure TForm1.R1Click(Sender: TObject);
//选中需要替换的文本
// 打开替换对话框
begin
  dlgReplace1.FindText:=mmo1.SelText;
  dlgReplace1.Execute;
end;

//当点击对话框中“替换”时,算法逻辑(替换1次)
procedure TForm1.dlgReplace1Replace(Sender: TObject);
var
  selpos:Integer;
begin
  with TReplaceDialog(Sender) do
  begin
    {用于查找子字符串在另一个字符串中首次出现的位置。如果找到了子字符串,
    Pos 函数将返回子字符串首次出现的位置(索引从1开始),
    如果没有找到,则返回0。}
    selpos:=Pos(FindText,mmo1.Lines.Text);
    if selpos>0 then
    begin
      {SelLength、SelStart 和 SelText 是与 文本选择 相关的三个重要属性。}
      mmo1.SelStart:=selpos-1;
      mmo1.SelLength:=Length(FindText);
      mmo1.SelText:=ReplaceText;
      {当你读取 SelText 时,它会返回当前选择区域的文本内容。
      当你向 SelText 写入新文本时,它会替换当前选中的文本(如果 SelLength 大于0)。}
    end
    else
      MessageBox(0,'抱歉,找不到需要替换的文本','提醒!',MB_OK or MB_ICONWARNING);
  end;
end;

{编辑-插入日期}
procedure TForm1.N7Click(Sender: TObject);
begin
  mmo1.SelText:=DateTimeToStr(Now());
end;

{格式-字体}
procedure TForm1.F2Click(Sender: TObject);
//打开字体选择对话框
//选择字体
begin
  if dlgFont1.execute then
    mmo1.Font:=dlgFont1.Font
  else
    exit;
end;

{格式-背景}
procedure TForm1.N8Click(Sender: TObject);
begin
  if dlgColor1.execute then
    mmo1.color:=dlgColor1.color
  else
    exit;
end;

{帮助-关于}
procedure TForm1.A2Click(Sender: TObject);
begin
  ShellAbout(self.handle,
    pchar('鱼C记事本'),
    pchar('CSDN-C4FX'),
    hicon(nil));
end;

end.

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

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

相关文章

多线程(2)——线程的六种状态

1. 线程的所有状态 进程状态&#xff1a; 就绪&#xff1a;正在 cpu 上执行&#xff0c;或者随时可以去 cpu 上执行 阻塞&#xff1a;暂时不能参与 cpu 执行 Java 的线程&#xff0c;对于状态做了更详细的区分&#xff0c;不仅仅是就绪和阻塞了&#xff0c;六种&#xff1a…

2024懒人精灵七天从入门到精通实战课程(付源码)

写在开始&#xff1a;对于想学习自动化技术的同学&#xff0c;给你们一些建议&#xff1b;如果你已经选择开始&#xff0c;还在坚持&#xff0c;我奉劝你坚持下去&#xff0c;水到渠成&#xff1b;如果你还没开始就选择放弃&#xff0c;我建议你就此放弃&#xff0c;老师也不鼓…

合宙Air780EP_LuatOS_MQTT应用指南

简介 Air780EP 是合宙的低功耗4G模组之一&#xff0c;支持LuatOS的脚本二次开发&#xff0c;即使是不太懂技术的老板&#xff0c;也能轻松使用 Air780EP开发产品。 本文应各位大佬邀请&#xff0c;详细讲解了Air780EP 的MQTT的应用教程&#xff01; MQTT协议具有长连接、低带宽…

开源AI智能名片商城系统:重塑大零售生态的创新实践与深度分析

摘要&#xff1a;在数字经济浪潮的推动下&#xff0c;零售行业正经历着前所未有的变革。传统零售模式面临消费者需求多样化、市场竞争加剧等多重挑战&#xff0c;而开源AI智能名片商城系统的出现&#xff0c;为零售行业的转型升级提供了新的思路和技术支持。本文深入探讨了开源…

C语言----字符串的匹配

字符串的匹配 实例说明&#xff1a; 本实例实现对两个字符串进行匹配操作&#xff0c;即在第一个字符串中查找是否存在第二个字符串。如果字符串完全匹配&#xff0c;则提示匹配的信息&#xff0c;并显示第二个字符串在第一个字符串中的开始位置&#xff0c;否则提示不匹配。 …

STM32 - 笔记

1 STM32的串口通信 【keysking的STM32教程】 第8集 STM32的串口通信_哔哩哔哩_bilibili 波特律动 串口助手

观成科技:海莲花活跃木马KSRAT加密通信分析

概述 自2023年8月至今&#xff0c;海莲花组织多次利用KSRAT远控木马对我国发起攻击。KSRAT通过HTTP协议与C&C服务器进行通信&#xff0c;每个样本都使用了不同的URL。其心跳包采用XOR算法进行加密&#xff0c;而控制指令包和数据回传包则使用了XOR以及“XORAES-128-CBC”组…

【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)

文章目录 递归是什么递归的思想递归的限制条件 递归举例求n的阶乘分析和代码实现画图推演 顺序打印一个整数的每一位分析和代码实现画图推演 递归与迭代递归求第n个斐波那契数迭代求第n个斐波那契数 拓展练习青蛙跳台阶问题递归求解迭代求解 汉诺塔问题 递归是什么 递归是学习…

FPGA使用sv生成虚拟单音数据

FPGA使用sv生成虚拟单音数据 之前一直使用matlab生成虚拟的数据&#xff0c;导出到txt或是coe文件中&#xff0c;再导入到fpga中进行仿真测试。 复杂的数据这样操作自然是必要的&#xff0c;但是平日使用正弦数据进行测试的话&#xff0c;这样的操作不免复杂&#xff0c;今日…

CentOS 安装Redis

在 CentOS 安装 Redis 操作系统&#xff1a;centos-7.9.2009-Core 1. 更新系统 首先&#xff0c;确保你的系统是最新的&#xff1a; sudo yum update -y2. 安装 EPEL 仓库 Redis 可能不在默认的 CentOS 仓库中&#xff0c;因此你需要安装 EPEL&#xff08;Extra Packages f…

【源码+文档+调试讲解】活力健身馆管理系统

摘 要 活力健身馆管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&am…

springboot狱内罪犯危险性评估系统的设计与实现论文源码调试讲解

第一章系统成功运行案例 第2章 程序开发技术 2.1 Mysql数据库 开发的程序面向用户的只是程序的功能界面&#xff0c;让用户操作程序界面的各个功能&#xff0c;那么很多人就会问&#xff0c;用户使用程序功能生成的数据信息放在哪里的&#xff1f;这个就需要涉及到数据库的知识…

CTFHUB-web-RCE-eval执行

开启题目 查看源码发现直接用蚁剑连接就可以&#xff0c;连接之后发现成功了

冒烟测试:快速初步检测软件稳定性的关键步骤

目录 前言1. 冒烟测试的定义1.1 冒烟测试的起源1.2 冒烟测试的特点 2. 冒烟测试的重要性2.1 确保构建稳定性2.2 早期发现重大问题2.3 提高测试效率 3. 冒烟测试的实施方法3.1 制定测试计划3.2 选择测试用例3.3 执行测试3.4 分析测试结果 4. 冒烟测试的最佳实践4.1 自动化冒烟测…

Opera浏览器与IPXProxy代理IP集成步骤详解

​对于经常需要使用公共WiFi网络进行网络操作的人来说&#xff0c;安全性是至关重要的。作为Opera浏览器的用户&#xff0c;我非常关注隐私安全&#xff0c;也尝试过各种提高安全性的方法&#xff0c;其中使用IPXProxy代理IP是不错的方法之一。下面为大家带来Opera浏览器与IPXP…

【java】升级jetty-client解决Too many open files问题

文章目录 升级jetty-client解决Too many open files问题问题背景排查原因解决lsof命令拓展 升级jetty-client解决Too many open files问题 问题背景 生产环境的采集经过一段时间就会报错 Too many open files&#xff0c;导致接下来的采集都会失败&#xff0c;已经严重影响到…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]include

题目&#xff1a; 随便传入一个file 因为存在include_once函数&#xff0c;可以使用php伪协议获取flag.php源码&#xff0c;再通过base64解码得到flag。 php:// 访问各个输入/输出流&#xff0c;常用php://filter和php://input&#xff0c;php://filter用于读取源码&#xff…

gin框架 自定义404错误页面,自定义500等服务端异常,业务异常,根据不同异常类型显示不同的异常页面方法 整理

在gin框架中&#xff0c;要显示自定义的异常页面&#xff0c;首先需要通过gin路由对象中的LoadHTMLFiles或者LoadHTMLGlob方法加载自定义的错误页面模板文件&#xff0c; 然后定义符合 gin.HandlerFunc 类型的路由处理函数/方法 &#xff0c;即只有一个参数(c *ginx.XContext)的…

如何理解供应链控制塔?详解供应链控制塔类型与架构!

随着经济全球化的不断深入&#xff0c;企业供应链的复杂性也在不断增加。从供应商到制造商&#xff0c;再到分销商和消费者&#xff0c;全球供应链网络的每一个环节都充满了动态变化和不确定性。在这样的背景下&#xff0c;传统的供应链管理模式已难以满足现代企业的需求&#…

Ackites/Killwxapkg

自动化反编译微信小程序&#xff0c;小程序安全评估工具&#xff0c;发现小程序安全问题&#xff0c;自动解密&#xff0c;解包&#xff0c;可还..自动化反编译微信小程序&#xff0c;小程序安全评估工具&#xff0c;发现小程序安全问题&#xff0c;自动解密&#xff0c;解包&a…