【PB案例学习笔记】-32制作一个简单记事本程序

大家好,我是晓凡

写在前面

这是PB案例学习笔记系列文章的第32篇,该系列文章适合具有一定PB基础的读者。

通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。

文章中设计到的源码,晓凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git

gitee代码仓库

需要源代码的小伙伴们可以自行下载查看,后续文章涉及到的案例代码也都会提交到这个仓库【pb-project-example

如果对小伙伴有所帮助,希望能给一个小星星⭐支持一下小凡。

一、小目标

本案例我们将制作一个类似于windows 自带的记事本程序。

程序包含了记事本的打开、保存、编辑、复制、剪切、删除、设置字体等功能。

为了能实现上述功能,我们需要借助对文件进行操作的GetFileOpenName()FileLength()FileOpen()FileRead()GetFileSaveName()FileWrite()等文件操作函数。

同时为了实现文本的编辑功能,我们还需要使用到Clare()CopyCutPaste()Undo()等多行编辑框函数。

为了实现文本格式的设置,我们需要用到CreateFile()全局扩展函数

希望小伙伴能和我一样,通过本案例熟练掌握文件相关操作

最终实现效果如下

记事本

二、函数简介

2.1 GetFileOpenName函数

用于显示一个标准的文件打开对话框,让用户选择要打开的文件,并返回用户选择的文件路径

使用示例:

string ls_fileNamels_fileName = GetFileOpenName("请选择要打开的文件", "C:\", "Text Files (*.txt),*.txt")IF Len(ls_fileName) > 0 THENMessageBox("选择文件", "你选择的文件是: " + ls_fileName)
ELSEMessageBox("未选择文件", "你没有选择文件")
END IF

调用GetFileOpenName函数会弹出一个文件打开对话框,标题为"请选择要打开的文件",初始文件夹路径为"C:",并且只显示文本文件(.txt)类型的文件。

用户选择文件后,将返回选中文件的路径,并显示在消息框中。

如果用户取消选择文件,则会显示"你没有选择文件"的消息框。

2.2 FileLength函数

用于获取指定文件的长度(以字节为单位)。通过这个函数,您可以快速了解文件的大小

使用示例:

string ls_filePath
long ll_fileLengthls_filePath = 'C:\test\file.txt'll_fileLength = FileLength(ls_filePath)MessageBox("文件长度", "文件的长度是: " + string(ll_fileLength) + " bytes")

在上面的示例中,首先设置要获取长度的文件路径为 ls_filePath 。然后使用 FileLength 函数来获取该文件的长度,并将结果存储在 ll_fileLength 中。最后使用 MessageBox 函数显示文件的长度,以字节为单位。

2.3 FileOpen 函数

用于打开一个文件并返回文件句柄,以便进行读取或写入操作

使用示例:

long ll_fileHandle
string ls_filePath, ls_fileContent, ls_line
integer li_fileNumls_filePath = 'C:\test\file.txt'
ll_fileHandle = FileOpen(ls_filePath, LineMode!)IF ll_fileHandle > 0 THENli_fileNum = 1ls_fileContent = ""DO WHILE FileRead(ll_fileHandle, li_fileNum, ls_line) > 0ls_fileContent += ls_line + "~r~n"li_fileNum++LOOPFileClose(ll_fileHandle)MessageBox("文件内容", ls_fileContent)
ELSEMessageBox("文件打开错误", "文件打开错误")
END IF

首先设置要打开的文件路径为 ls_filePath ,然后使用 FileOpen 函数打开该文件,并将返回的文件句柄存储在 ll_fileHandle 中。如果文件成功打开(文件句柄大于0),则使用 FileRead 函数逐行读取文件内容,并将内容存储在 ls_fileContent 中。最后关闭文件并显示文件内容。如果文件打开失败,则显示相应的错误消息。

2.4 FileRead 函数

用于从已打开的文件中读取指定行的内容。通过这个函数,您可以逐行读取文件的内容并进行处理。

这个函数,我们在上面已经使用过

2.5 FileClose 函数

用于关闭先前通过FileOpen函数打开的文件。通过这个函数,您可以确保在完成文件操作后正确关闭文件句柄,释放资源。

这个函数,我们在上面已经使用过,一般FileOpen FileRead FileClose 这三个函数我们都是配套使用的

2.6 GetFileSaveName 函数

用于显示一个标准的文件保存对话框,让用户选择要保存的文件路径和名称,并返回用户选择的文件路径。

使用示例:

string ls_fileNamels_fileName = GetFileSaveName("请选择文件保存路径", "C:\", "Text Files (*.txt),*.txt", "txt")IF Len(ls_fileName) > 0 THENMessageBox("选择文件", "你选择保存文件路径是: " + ls_fileName)
ELSEMessageBox("未选择", "你没有选择文件保存路径.")
END IF

调用GetFileSaveName函数会弹出一个文件保存对话框,标题为"请选择文件保存路径",初始文件夹路径为"C:",并且只显示文本文件(.txt)类型的文件。

用户选择保存文件的路径和名称后,将返回选中的文件路径,并显示在消息框中。

如果用户取消选择文件保存位置,则会显示"你没有选择文件保存路径"的消息框。

2.7 Filewrite 函数

用于向已打开的文件中写入内容。通过这个函数,您可以将数据写入文件中,可以是文本、二进制等格式的数据。

使用示例:

long ll_fileHandle
string ls_filePath, ls_contentls_filePath = 'C:\test\output.txt'
ll_fileHandle = FileOpen(ls_filePath, LineMode!)IF ll_fileHandle > 0 THENls_content = "hello ! 我是程序员晓凡"FileWrite(ll_fileHandle, ls_content)FileClose(ll_fileHandle)MessageBox("文件写入", "内容写入成功")
ELSEMessageBox("文件打开错误", "文件打开失败")
END IF

首先使用FileOpen函数打开文件并获取文件句柄。如果文件成功打开(文件句柄大于0),

则使用FileWrite函数向文件中写入“hello ! 我是程序员晓凡”内容。

在示例中,我们写入了一个简单的文本内容。

最后关闭文件并显示消息框表示内容已成功写入文件。

如果文件打开失败,则显示相应的错误消息。

2.8 Clare函数

用于清除一个字符串中的空格和控制字符。

string ls_text, ls_cleanTextls_text = " Hello,我是程序员晓凡,   	我的博客是:	www.xiezhrspace.cn  "
ls_cleanText = Clare(ls_text)MessageBox("清除文本", "原始字符串: " + ls_text + "~n~n清除后的字符串是: " + ls_cleanText)

我们定义了一个包含空格和控制字符的字符串 ls_text

然后使用Clare函数清除该字符串中的空格和控制字符,并将结果存储在 ls_cleanText 中。

最后使用MessageBox显示原始文本和清理后的文本。

2.9 Copy 函数

用于复制一个字符串的一部分到另一个字符串中

使用示例:

string ls_source, ls_targetls_source = "Hello, World!"
ls_target = ""Copy(ls_source, 8, 5, ls_target)MessageBox("复制文本", "原始文本: " + ls_source + "~n~n复制后文本: " + ls_target)

我们定义了一个原始字符串 ls_source ,然后使用Copy函数从第8个字符开始复制长度为5的子字符串到目标字符串 ls_target 中。

最后使用MessageBox显示原始字符串和复制后的字符串。

2.10 Paste 函数

用于将一个字符串粘贴(插入)到另一个字符串的指定位置。通过这个函数,您可以方便地在一个字符串中插入另一个字符串

使用实例:

string ls_source, ls_targetls_source = "World!"
ls_target = "Hello, "Paste(ls_target, 7, ls_source)MessageBox("粘贴后", "原始文本: " + ls_target)

我们定义了一个源字符串 ls_source ,一个目标字符串 ls_target

然后使用Paste函数将源字符串插入到目标字符串的第7个位置之后。

最后使用MessageBox显示插入后的目标字符串。

2.11 Undo 函数

用于撤消最近的文本编辑操作。通过这个函数,您可以在文本框或富文本控件中撤消用户最后一次的编辑操作,恢复到之前的状态。

使用示例:

// 假设有一个文本框控件名为te_text
te_text.Undo()

假设存在一个名为 te_text 的文本框控件。通过调用 Undo 函数,可以撤消用户最近的文本编辑操作。

2.12 CreateFile 函数

Windows API中的一个函数,用于创建或打开一个文件,并返回一个文件句柄。

使用示例:

CONSTANT LONG GENERIC_WRITE = 1073741824
CONSTANT LONG CREATE_ALWAYS = 2FUNCTION long CreateFile( &string lpFileName, &long dwDesiredAccess, &long dwShareMode, &long lpSecurityAttributes, &long dwCreationDisposition, &long dwFlagsAndAttributes, &long hTemplateFile) Library "kernel32.dll"long ll_fileHandle
string ls_filePathls_filePath = 'C:\test\newfile.txt'
ll_fileHandle = CreateFile(ls_filePath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0)IF ll_fileHandle > 0 THENMessageBox("提示信息", "一个文件创建成功")CloseHandle(ll_fileHandle)
ELSEMessageBox("提示信息", "文件创建失败.")
END IF

我们使用CreateFile函数创建了一个名为 newfile.txt 的新文件,并获取了文件句柄。

如果文件成功创建(文件句柄大于0),则显示消息框表示文件已成功创建。

最后使用CloseHandle函数关闭文件句柄。

如果文件创建失败,则显示相应的错误消息。

三、创建程序基本框架

上一小节中我们介绍了接下来程序中需要使用到的函数,接下来就该实操了

① 创建examplework工作空间

② 创建exampleapp创建应用

③ 新建w_file窗口,并将Title设置成“记事本”

④ 新建w_font窗口,并将Title设置为“字体”

⑤ 新建Menu菜单,并将其保存为m_main

由于文字篇幅原因,以上步骤不再赘述,如果忘记了的小伙伴可以翻一翻之前的文字复习一下

四、设置w_file窗口

① 建立控件

在窗口中添加两个MultiLineEdit控件,分别命名为mle_editmle_time

勾选mle_edit控件的VScrollBar属性,并将两个控件Position属性中的XY都设置成0

控件布局

② 创建全局变量

string current_file_name

③ 创建全局扩展函数

Function string CreateFile(char FileName) LIBRARY "user32.dll"

④ 在窗口w_fileResize事件 中输入如下脚本

mle_edit.width  = this.workspacewidth()
mle_edit.height = this.workspaceheight()

五、设置w_font窗口

这个窗口用了选择字体

① 新建控件

在窗口中添加3个StaticEdit控件、3个SingleLineEdit控件、2个ListBox控件和2个CommandButton控件

各个控件名称分别为st_1st_2st_sizesle_fontsle_stylesle_sizelb_fontlb_stylecb_okcb_cancel

② 设置各控件属性

设置lb_fontItems属性

设置的属性

设置lb_styleItems属性

设置的属性

其余控件如下所示

控件布局

③ 在cb_cancel按钮的clicked事件中输入如下脚本

close(w_font)

④ 在cb_ok按钮的clicked事件中输入如下代码

if sle_font.text <> "" then w_file.mle_edit.facename = sle_font.text          //字形
if sle_size.text <> "" then w_file.mle_edit.textsize = integer(sle_size.text) //大小if sle_style.text <> "" then //风格if sle_style.text = "常规"   then w_file.mle_edit.weight = 400w_file.mle_edit.italic = falsereturnend ifif sle_style.text = "斜体"   then w_file.mle_edit.italic = true		end ifif sle_style.text = "粗体"   then w_file.mle_edit.weight = 700		end ifif sle_style.text = "粗斜体" then w_file.mle_edit.weight = 700w_file.mle_edit.italic = true		end if
end ifclose(w_font)

⑤ 在lb_font控件的selectionchanged事件中输入如下代码

int i , j
i = lb_font.selectedindex()
sle_font.text = lb_font.selecteditem()
//sle_font.text = lb_font.text(i)
j = lb_font.setstate(i,false)

⑥ 在lb_style控件的selectionchanged事件中输入如下代码

int i , j
i = lb_style.selectedindex()
sle_style.text = lb_style.selecteditem()
//sle_font.text = lb_font.text(i)
j = lb_style.setstate(i,false)

六、设置m_main菜单

6.1 新建m_main菜单基本框架

新建m_main菜单

6.2 文件相关菜单

① 在新建菜单中添加如下代码

//清空编辑区内容
w_file.mle_edit.text = ""
//新建文件的统一名称为Untitle
current_file_name = "无标题"
//修改窗口标题
w_file.title = current_file_name+" - 记事本"

② 在打开菜单中添加如下代码

string docname,named
integer value,rc,fd
long ll_Flength
//选择要打开的文件
value = GetFileOpenName("选择要打开的文件",docname,named,"TXT","文本文件(*.txt),*.txt,所有文件(*.*),*.*")if value = 1 then//获取文件长度ll_Flength = FileLength(docname)//打开文件fd = FileOpen(docname,StreamMode!)if ll_Flength < 32767 then//读取文件内容到多行编辑框中rc = FileRead(fd,w_file.mle_edit.text)FileClose(fd)//保存文件名,用于将来保存文件current_file_name = docname//修改窗口标题w_file.title = "记事本__文件" + current_file_nameend if
end if

③ 在保存中添加如下代码

string docname,named
integer value,rc,fd,ret
long ll_Flength
boolean file_existvalue = GetFileSaveName("保存为",docname,named,"TXT","文本文件(*.txt),*.txt,所有文件(*.*),*.*")
if value = 1 thenll_Flength = FileLength(docname)fd = FileOpen(docname,StreamMode!)if ll_Flength < 32767 thenfile_exist = FileExists(docname)IF file_exist THEN ret = MessageBox("保存", &"按OK按钮覆盖所选文件" + docname, &Question!, YesNo!)rc = Filewrite(fd,w_file.mle_edit.text)FileClose(fd)current_file_name = docnamew_file.title = current_file_name + " - 记事本__文件"  end if
end if
fd = FileOpen(current_file_name,StreamMode!,Write!,LockWrite!,Replace!)
//将多行编辑框mle_edit中的内容写入文件
FileWrite(fd,w_file.mle_edit.text)
FileClose(fd)

④ 在退出菜单中添加如下代码

close(w_file)
6.3 编辑相关菜单

①在撤销菜单中添加如下代码

w_file.mle_edit.undo()

② 在复制菜单中添加如下代码

w_file.mle_edit.copy()

③ 在剪切中菜单添加如下代码

w_file.mle_edit.cut()

④ 在拷贝菜单中添加如下代码

w_file.mle_edit.paste()

⑤ 在删除菜单中添加如下代码

w_file.mle_edit.clear()

⑥ 在全选菜单中添加如下代码

w_file.mle_edit.setfocus()
w_file.mle_edit.selecttext(1,888888)

⑦ 在时间菜单中添加如下代码

w_file.mle_time.text = string(now()) + " " + string(today())
w_file.mle_time.setfocus()
w_file.mle_time.selecttext(1,20)
w_file.mle_time.copy()
w_file.mle_edit.setfocus()
w_file.mle_edit.paste()
6.4 格式相关菜单

① 在自动换行菜单中添加如下代码

if m_main.m_option.m_retuen.checked = true thenm_main.m_option.m_retuen.checked = falsew_file.mle_edit.hScrollBar = true
elsem_main.m_option.m_retuen.checked = truew_file.mle_edit.hScrollBar = false
end if

② 在字体菜单中添加如下代码

open(w_font)
6.5 窗口设置

①将w_file窗口的MenuName设置为m_main

② 在开发界面左边的System Tree窗口中双击exampleapp应用,并在其Open事件中添加如下代码

open(w_file)

七、运行程序

经过上面的代码编码,接下来检验下我们的劳动成果

记事本

本期内容到这儿就结束了 ★,°:.☆( ̄▽ ̄)/$:.°★ 。 希望对您有所帮助

我们下期再见 ヾ(•ω•`)o (●’◡’●)

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

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

相关文章

【信息系统项目管理师】高项论文通用加分素材

文章目录 输入I工具与技术TT输出O 写一些增加项目真实性的问题&#xff0c;如变更、进度&#xff08;范围蔓延、进度延后怎么处理、好几个项目并行资源协调&#xff09;||成本、沟通&#xff08;跨部门沟通&#xff09; 在保障真实性的同时选的项目紧跟潮流 要能看出实际经验 …

GB35114国密算法-GMSSL

C有个三方库-GMSSL是可以进行GB35114所需要的SM2、SM3、SM4等加解密算法的&#xff0c;但是使用国密算法是需要申请报备的 GmSSL是由北京大学自主开发的国产商用密码开源库&#xff0c;实现了对国密算法、标准和安全通信协议的全面功能覆盖&#xff0c;支持包括移动端在内的主流…

国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 附源码 云草桑 专题二

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客 sqlsugar 官网-CSDN博客 4、进阶功能 5、集成整合 6、脚手架应用 4、进阶功能 4.1、生命周期 Queryable 什么时候操作库 Queryable是一个引用类型 Queryable拷贝机制 {ISugarQueryable<Student> quer…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量&#xff1a; QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

基于jeecgboot-vue3的Flowable流程支持bpmn流程设计器与仿钉钉流程设计器-编辑多版本处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、前端编辑带有仿钉钉流程的处理 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)const params {flowKey: row.key,ver…

PDF Reader 编辑阅读软件 for Mac v4.0.4(办公必备,小白简单易上手)

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件 安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软…

redis其他类型和配置文件

很多博客只讲了五大基本类型&#xff0c;确实&#xff0c;是最常用的&#xff0c;而且百分之九十的程序员对于Redis只限于了解String这种最常用的。但是我个人认为&#xff0c;既然Redis官方提供了其他的数据类型&#xff0c;肯定是有相应的考量的&#xff0c;在某些特殊的业务…

51单片机嵌入式开发:11、 STC89C52RC 实现一个滑动的led点阵程序

STC89C52RC 实现一个滑动的led点阵程序 1 概述2 LED点阵介绍2.1 LED概述2.2 LED点阵注意事项 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 扩展74HC595&#xff08;后续专题开展&#xff09;6 总结 第十一节 1…

MySQL—— if/cast/case.... end/md5 函数

目录 1. if 使用 2. if 嵌套 ​3. case ... end 4. 类型转换 cast&#xff08;&#xff09; 5. 加密函数 md5&#xff08;&#xff09; 1. if 使用 将姓名为smith的员工工资上调10%&#xff1b; 2. if 嵌套 如果岗位是manager&#xff0c;工资上调10%&#xff0c;如果岗位是s…

camtasia怎么剪掉不用的部分 屏幕录制的视频怎么裁剪上下不要的部分 camtasia studio怎么裁剪视频时长 camtasia怎么剪辑视频教程

有时我们录制的屏幕内容&#xff0c;并不一定全部需要。那么&#xff0c;屏幕录制的视频怎么裁剪上下不要的部分&#xff1f;可以使用视频剪辑软件&#xff0c;或者微课制作工具来进行裁剪。屏幕录制的视频怎么旋转&#xff1f;录制视频的旋转也是一样的&#xff0c;均在编辑步…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…

Redis系列命令更新--Redis列表命令

Redis列表 1、Redis Blpop命令&#xff1a; &#xff08;1&#xff09;说明&#xff1a;Redis Blpop命令移出并获取列表的第一个元素&#xff1b;如果列表没有元素会阻塞列表直到等到超时或发现可弹出元素为止 &#xff08;2&#xff09;语法&#xff1a;redis 127.0.0.1:63…

IDEA快速生成项目树形结构图

下图用的IDEA工具&#xff0c;但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下&#xff0c;进入cmd输入如下指令&#xff1a; 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释

程控电阻器

程控电阻器 由于要测试电阻型温度传感器&#xff0c;一个电阻箱又很贵&#xff0c;就想做一款 程控电阻器 来满足。 设计满足300Ω到400kΩ可调电阻。 设计思路 选择数字电位器去控制电阻输出&#xff0c;最好是精度高&#xff0c;范围大的数字电位器。经过寻找后&#xff0c;发…

CentOS 7 Web面板的文件管理器说明

在使用CentOS 7 Web Panel&#xff08;CWP7&#xff09;时&#xff0c;偶尔要求在服务器曲面上修改&#xff0c;创建&#xff0c;编辑或删除文件。 最简单&#xff0c;最直接的方式是通过利用CWP7的内置文件管理器。 本文将详细介绍如何启动它&#xff0c;使用它&#xff0c;以…

【D3.js in Action 3 精译】2.3 用 D3 选中页面元素

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本章小结 第二章…

C语言基础and数据结构

C语言程序和程序设计概述 程序:可以连续执行的一条条指令的集合 开发过程:C源程序(.c文件) --> 目标程序(.obj二进制文件,目标文件) --> 可执行文件(.exe文件) -->结果 在任何机器上可以运行C源程序生成的 .exe 文件 没有安装C语言集成开发环境,不能编译C语言程…

【数据结构】二叉树全攻略,从实现到应用详解

​ &#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ ​ &#x1f341;1. 树形结构的介绍 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做…

Java18的主要新特性总结

目录 概述 变动说明 重要变更和信息 下载地址 Java18新特性总结 1、JEP 420: Switch 的模式匹配&#xff08;第二次预览&#xff09; 功能进化 Switch 模式匹配 类型标签 null标签 守卫标签 2、JEP 400&#xff1a;默认UTF-8编码 3、JEP 408&#xff1a;简易Web服务…

Java 虚拟线程:案例研究

一. 关键要点 虚拟线程是 Java 并发编程的一个重要进步&#xff0c;但在运行典型的云原生 Java 工作负载方面&#xff0c;它们并不比 Open Liberty 现有的自主线程池具有明显的优势。对于 CPU 密集型工作负载&#xff0c;由于目前尚不清楚的原因&#xff0c;虚拟线程的吞吐量低…