【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函数打开的文件。通过这个函数,您可以确保在完成文件操作后正确关闭文件句柄,释放资源。

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

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://www.mzph.cn/bicheng/48626.shtml

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

相关文章

JVM基本知识——运行空间

JVM&#xff08;Java Virtual Machine&#xff09;即Java虚拟机&#xff0c;是负责读取java字节码&#xff0c;并在实际的硬件环境中运行。 JVM可以分为三部分&#xff1a;类装载器&#xff08;ClassLoader&#xff09;子系统、内存空间、执行引擎 内存空间&#xff08;运行时…

“狂飙”过后,大模型未来在何方?

2024年6月14日&#xff0c;第六届“北京智源大会”在中关村展示中心开幕。 开幕现场&#xff0c;智源研究院、OpenAI、百度、零一万物、百川智能、智谱AI、面壁智能等国内主流大模型公司CEO与CTO&#xff0c;人工智能顶尖学者和产业专家&#xff0c;在围绕人工智能关键技术路径…

【计算机网络】计算机网络的性能指标(上篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️计算机网络】 文章目录 前言计算机网络的性能指标速率数据量速率的定义计算方法与测量影响因素优化方法 带宽带宽的定义影响因素计算方法优化方法 吞吐量定义测量与测试影响因素与带宽的区别提升方法…

数据结构(栈)

文章目录 一、概念与结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压…

docker compose 容器 编排分组

遇到问题&#xff1a;执行docker compose up -d 后docker compose 创建的容器们 在desktop-docker 中都在docker下一堆 搜索想着能不能把这个docker名字改一下&#xff0c;但是都没有找到这样的一个方案&#xff1b; 最后发现&#xff0c;我执行docker compose up -d 命令所在…

7. LangChain4j如何使用统一api调用?

前言 当我们对接LangChain4j的时候&#xff0c;面对复杂的各种各样的大模型的api的对接&#xff0c;让很多开发者感到力不从心。在每个大模型的api都不一样的时候&#xff1f;该如何快捷的切换模型的使用呢&#xff1f; 这时&#xff0c;One-API应运而生&#xff0c;它以其简洁…

面向初学者和专家的 40 大机器学习问答(2024 年更新)

面向初学者和专家的 40 大机器学习问答(2024 年更新) 一、介绍 机器学习是人工智能的重要组成部分,目前是数据科学中最受欢迎的技能之一。如果你是一名数据科学家,你需要擅长 python、SQL 和机器学习——没有两种方法。作为 DataFest 2017 的一部分,我们组织了各种技能测…

windows ssh的登录,私钥权限太开放 WARNING: UNPROTECTED PRIVATE KEY FILE!

问题描述 ssh -i wang -D localhost:1080 wangsg.ks99.topBad permissions. Try removing permissions for user Permissions for xxx are too open. F:\pms\pms-gpg-key\ssh-key\wang>ssh -i wang -D localhost:1080 wangsg.ks99.top Bad permissions. Try removing perm…

flutter 充电气泡

前言&#xff1a; 之前一直看到 有手机充电的时候 有气泡从Type-C 的位置冒泡上来 慢慢上移&#xff0c; 然后和上面的圆圈 会和&#xff0c;感觉还是挺好看的。今天试了下用 Flutter 实现了一版本。大致效果如下&#xff0c;而且气泡 和 气泡直接还可以粘黏 实现原理&#xff…

【开发实战】QT5 + OpenCV4 开发环境配置应用演示

前言 作为深度学习算法工程师&#xff0c;必须要掌握应用开发技能吗&#xff1f;搞工程肯定是必须要会界面开发&#xff0c;QT就是一个很不错的选择。本文以QT5.15 OpenCV4.8 OpenVINO2023为例&#xff0c;搭建应用开发环境&#xff0c;演示深度学习模型的QT应用案例。 开发…

windows USB 设备驱动开发-开发Type C接口的驱动程序(三)

编写 USB Type C 端口控制器驱动程序 如果 USB Type-C 硬件实现 USB Type-C 或电源传送 (PD) 物理层&#xff0c;但未实现供电所需的状态机&#xff0c;则需要编写 USB Type-C 端口控制器驱动程序。 在 Windows 10 版本 1703 中&#xff0c;USB Type-C 体系结构已得到改进&am…

pytorch学习(十)优化函数

优化函数主要有&#xff0c;SGD, Adam&#xff0c;RMSProp这三种&#xff0c;并且有lr学习率&#xff0c;momentum动量&#xff0c;betas等参数需要设置。 通过这篇文章&#xff0c;可以学到pytorch中的优化函数的使用。 1.代码 代码参考《python深度学习-基于pytorch》&…

Java里的引用详解

1.体验方法引用 方法引用的出现原因 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数做操作 那么考虑一种情况&#xff1a;如果我们在Lambda中所指定的操作方案&#xff0c;已经有地方存在相同方案&#xff0c;那是否还有必要…

2024最新教程,在docker中安装kali,并配置ssh连接

docker的基本使用&#xff1a;搭建高效攻防靶场vulfocus与Docker仓库管理实战&#xff1a;从听说到入门 拉取kali官方镜像 docker pull kalilinux/kali-rolling 启动一个kali镜像&#xff0c;将容器中的22端口映射到主机100端口&#xff0c;方便ssh直接连接 docker run -it…

Java 集合框架:Java 中的优先级队列 PriorityQueue 的实现

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 018 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

用不同的url头利用Python访问一个网站,把返回的东西保存为txt文件

这个需要调用requests模块&#xff08;相当于c的头文件&#xff09; import requests 还需要一个User-Agent头&#xff08;这个意思就是告诉python用的什么系统和浏览器&#xff09; Google Chrome&#xff08;Windows&#xff09;: Mozilla/5.0 (Windows NT 10.0; Win64; x64…

【Git命令】git rebase之合并提交记录

使用场景 在本地提交了两个commit&#xff0c;但是发现根本没有没必要分为两次&#xff0c;需要想办法把两次提交合并成一个提交&#xff1b;这个时候可以使用如下命令启动交互式变基会话&#xff1a; git rebase -i HEAD~N这里 N 是你想要重新调整的最近的提交数。 如下在本地…

vscode配置django环境并创建django项目(全图文操作)

文章目录 创建项目工作路径下载python插件&#xff1a;创建虚拟环境选择虚拟环境在虚拟环境中安装Django创建Django项目 创建项目工作路径 下载python插件&#xff1a; 创建虚拟环境 >python:create 于是会多出一个.venv的目录 选择虚拟环境 在虚拟环境中安装Django …

MySQL 数据库 day 7.16

ok了家人们今天继续记录一下数据库,看看今天学了什么。 一.事物概述 1.1 环境准备 -- 账户表 create table account( id int primary key auto_increment, name varchar(20), money double );insert into account values (null,张三,1000); insert into account values (n…

解决Linux桌面初始化问题

问题 启动vnc桌面&#xff0c;提示问题 定位 从[t]csh手册 可以看到&#xff0c;其初始化流程 经定位&#xff0c;是.cshrc的这段代码存在&#xff0c;导致桌面初始化异常。 [wanlin.wangicinfra-cn-172-16-0-115 ~]$ cat .cshrc ...部分省略... # Environment for anac…