整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Delphi基础教程图文版之数据类型(子界)

Delphi基础教程图文版之数据类型(子界)

个人的理解子界类型更适合用于范围的定义, 例如,人的年龄一般为1到120岁,一年中的月数为1到12月,一月中的天数为1到31天等等。

如果能在程序中对所用的变量的值域作具体规定,就便于检查出那些不合法的数据,这就能更好地保证程序运行的正确性且在一定程度上节省内存空间。

子界类型能很好解决上面的问题。其实在数组的定义中,常用到子界类型,以规定数组下标的范围。

这是Delphi特有的一种数据类型,至少在我的认知中其它语言是没有的

定义

type

子界类型标识符=常量1..常量2

常量1称为子界的下界,常量2称为子界的上界;所谓的上界也就是开始的边界,而下界就是结束的边界

注意事项:

下界和上界必须是同一顺序类型(该类型称为子界类型的基类型),且上界的序号必须大于下界的序号。 例如

type
    age=1..100;
    letter='a' ..'z';

当然了,类似于前面提到的枚举类型,它也可以把类型声明和变量声明并为一步。可以直接在变量说明中定义子界类型。

type
    letter='a'..' z ';
var
    ch1,ch2:letter;

可以合并成:

var
    ch1,ch2:'a'..'d';

运算规则

凡可使用基类型的运算规则同样适用该类型的子界类型。例如,可以使用整型变量的地方,也可以使用以整型为基类型的子界类型数据。对基类型的运算规则同样适用于该类型的子界类型。例如,div,mod要求参加运算的数据为整, 因而也可以为整型的任何子界类型数据。基类型相同的不同子界类型数据可以进行混合运算。例如:设有如下说明:

var  x:1..100;
   y:1..500;
   z:1..1000;
    a:integer;

合法语句:a:=Sqr(x)+y+z; z:=x+y

y:=x+z+a; 当x+y+a的值在1~500范围内时是合法的,否则会出错。

应用举例

例1、判断当前是周几(case语句尽量少用)

文为 AI 研习社编译的技术博客,原标题 :

Regex tutorial — A quick cheatsheet by examples

翻译 | kerr、狒狒 校对 | 就2 整理 | 就2

原文链接:

https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285

正则表达式(regex 或 regexp)在文本信息提取方面是非常有用的工具,通过查询一个或多个特定搜索模式的匹配实现(例如,特定的ASCII或unicode字符序列)。

正则表达式的应用领域包括字符串语义分析/替换,到数据格式转换,以及网页抓取等。

最有趣的一点是,只要学过正则表达式的语法,在目前几乎所有编程语言中都可以应用正则表达式(JavaScript、Java、VB、C/C++、C#、Python、Perl、Ruby、Delphi、R、Tcl、以及其他很多语言),这些语言对一些高级功能和语法的支持只有细微的区别。

下面通过一些示例和解释来了解正则表达式。

Basic topics

Anchors — ^ and $

^The matches any string that starts with The -> Try it!end$ matches a string that ends with end

^The end$ exact string match (starts and ends with The end)

roar matches any string that has the text roar in it

数量词 —* + ? and{}

abc*

匹配ab后有零个或多个为c的字符串

abc+

匹配ab后有一个或多个为c的字符串

abc?

匹配ab后有零个或一个为c的字符串

abc{2}

匹配ab后有2个 c的字符串

abc{2,}

匹配ab后有2个 c或更多个c的字符串

abc{2,5}

匹配ab后跟2到5个c的字符串

a(bc)*

匹配a后面跟零个或多个重复的bc序列的字符串

a(bc){2,5}

匹配a后面跟2个到5个重复的bc序列的字符串

或运算符——|或

a(b|c)

匹配a后跟b或c的字符串 - >试试吧!

a[bc]

同上一情况

字符类——\d \w \s和.

\d

匹配一个数字字符 - >试试吧!

\w

匹配单词字符(字母、数字或下划线) - >试试吧!

\s

匹配空白字符(包括制表符和换行符)

.

匹配任意字符 - >试试吧!

谨慎使用“.” 运算符,因为通常类或反义字符类(我们将在下面介绍)会更快更精确。

\ d,\ w和\ s也分别用\ D,\ W和\ S表示它们的否定。

例如,\ D将执行与\ d获得的相反匹配。

\D

匹配一个非数字字符 - >试试吧!

为了按字面意思理解,你必须使用反斜杠“\”来转义字符^.[$|*+?{\,因为它们具有特殊含义。

$\d

匹配一个数字前面有一个$的字符串 - >试试吧!

请注意,您还可以匹配不可打印的字符,如制表符\ t,换行符\ n,回车符\ r。

标志位

基础部分中,如何构建一个正则表达式还有一个基本概念:标志。

正则表达式通常以这种形式/abc /出现,其中搜索模式由两个斜杠字符/分隔。

我们可以指定一个带有这些值的标志(我们也可以将它们相互组合):

  • g(全局)在第一次匹配后不返回,从上一次匹配结束时重新开始后续搜索

  • m(多行)启用时,^和$将匹配这行的开头和结尾,而不是整个字符串。

  • i(不敏感)使整个表达式不区分大小写(例如/ aBc / i将匹配AbC)。

中心主题

分组和捕获——

a(bc)

括号创建一个值为bc的捕获组 - >试试吧!

a(?:bc)*

我们使用?:禁用捕获组 - >试试吧!

a(?

我们使用?

当我们需要使用您首选的编程语言从字符串或数据中提取信息时,此运算符非常有用。由几个组捕获的任何多次出现都将以经典数组的形式公开:我们将使用匹配结果的索引来访问它们的值。

如果我们选择为组添加名称(使用(?

括号表达式——

[abc]

匹配一个具有a或b或c的字符串 - >与a | b | c相同 - >试试吧!

[a-c]

同上一情况

[a-fA-F0-9]

表示一个十六进制数字的字符串,不区分大小写 - >试试吧!

[0-9]%

在%符号之前具有0到9之间字符的字符串

[^a-zA-Z]

一个没有字母从A到Z或从A到Z.的字符串,在这种情况下,^被用作表达式的否定->尝试它!

请记住,在括号内的表达式中,所有特殊字符(包括反斜杠\)都会失去其特殊权力:因此我们不会应用“转义规则”。

贪婪与惰性匹配

量词(* + {} )是贪婪的运算符,因此它们通过提供的文本尽可能地扩展匹配。

例如,

simple div

test中的

simple div

为了只捕获div标签,我们可以使用? 让它变得懒惰:

匹配内包含的任何一个或多个字符,根据需要进行扩展 - >试试吧!

请注意,更好的解决方案应该避免使用.来支持更严格的正则表达式:

]+>

匹配中包含的一次或多次除以外的任何字符 - >试试吧!

高级主题

边界— \b and \B

\babc\b

执行“仅限整个单词”搜索 - >尝试一下!

\b表示像插入符号(它类似于$和^)的匹配位置,其中一侧是单词字符(如\w)而另一侧不是单词字符(例如,它可能是字符串的开头或者空格字符)。

它伴随着它的否定,\B。这匹配\b不匹配的所有位置,如果我们想要找到完全被单词字符包围的搜索模式,则可以匹配。

\Babc\B

仅当图案完全被单词字符包围时才匹配 - >试试吧!

回溯引用——

([abc])

使用,它与第一个捕获组匹配的相同文本匹配 - >试试吧!

([abc])([de])

我们可以使用\ 2(\ 3,\ 4等)来识别与第二个(第三个,第四个等)捕获组匹配的相同文本 - >试试吧!

(?

我们把这个组命名为foo,稍后我们引用它(\ k

先行和后行断言——(?=)和(?

d(?=r)

仅在r之后匹配d,但r将不是整体正则表达式匹配的一部分->试试吧!

(?

仅在r之前匹配d,但r将不是整体正则表达式匹配的一部分->试试吧!

你也可以使用否定运算符!

d(?!r)

仅在不跟随r的情况下匹配d,但r将不是整体正则表达式匹配的一部分->尝试它!

(?

仅在没有r之前匹配d,但r将不是整体正则表达式匹配的一部分->尝试它!

总结

正如您所看到的,正则表达式的应用程序字段可以是多个的,我确信您在开发人员职业生涯中看到的任务中至少识别出这些任务中的一个,这里是一个快速列表:

  • 数据验证(例如检查时间字符串是否格式正确)

  • 数据抓取(特别是网页抓取,最终按特定顺序查找包含特定单词集的所有页面)

  • 数据转换(将数据从“原始”转换为另一种格式)

  • 字符串解析(例如捕获所有URL的GET参数,捕获一组括号内的文本)

  • 字符串替换(即使在使用通用IDE的代码会话期间,例如在相应的JSON对象中转换Java或C#类 - 将“;”替换为“,”将其设为小写,避免类型声明等)

  • 语法高亮,文件重命名,数据包嗅探和许多其他涉及字符串的应用程序(其中数据不必是文本)

如果你喜欢的话,不要忘了推荐这篇文章。

不久我将出版一份包含常见正则表达式列表的新文章,敬请关注!雷锋网雷锋网雷锋网

ueJS调用本地Delphi应用程序本质上与 js 调用本地 exe 程序的原理是相同的。通用的做法是通过在 Windows 注册表中注册自定义URL Protocol 协议,然后通过浏览器执行打开对应的协议即可。

3.1创建 Delphi 窗体应用程序

Delphi 窗体应用程序接受 1 个来自网络调用的参数,并将参数值显示在界面上。

第一步,先创建窗体应用程序,在窗体应用程序中放置一个 Label,其 Caption 属性值为“Web传入的参数”,一个 Edit 控件,其 name 属性值为 Edit1;

第二步,编写窗体的 OnCreate 事件,代码如下:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 检查命令行参数是否为1,不为1则终止程序的执行
  if Application.ParamCount <> 1 then
  begin
    ShowMessage('参数错误, 格式:democalledbyvue <参数1>');
    Application.Terminate;
  end;
  // 将命令行参数值显示在窗体的 Edit1 控件中
  Edit1.Text:=TIdURI.URLDecode(Application.Params[1]);
end;

URL解码采用了 indy 包中的 TIdURI 类的 URLDecode 方法。

3.2编写自定义URL Protocol 协议

自定义URL Protocol 协议模板:

Windows Registry Editor Version 5.00 
[HKEY_CLASSES_ROOT\<协议名称>]
@="URL:<协议名称> Protocol Handler"
"URL Protocol"=""
 
[HKEY_CLASSES_ROOT\<协议名称>\DefaultIcon]
@="<可执行程序>"
 
[HKEY_CLASSES_ROOT\<协议名称>\shell]
@=""
 
[HKEY_CLASSES_ROOT\<协议名称>\shell\open]
@=""
 
[HKEY_CLASSES_ROOT\<协议名称>\shell\open\command]
@="\"<可执行程序>\" \"%1\""

将模板文件中的 <协议名称> 和 <可执行程序> 替换为实际名称即可。注:<可执行程序> 为可执行程序文件的全路径名称,其中的路径分隔符 “\” 必须转义,写作 “\”。

将模板文件保存为 .reg ,双击运行。

示例:

Windows Registry Editor Version 5.00 
[HKEY_CLASSES_ROOT\democalledbyvue]
@="URL:democalledbyvue Protocol Handler"
"URL Protocol"=""
 
[HKEY_CLASSES_ROOT\democalledbyvue\DefaultIcon]
@="E:\\workspace_of_codetyphon\\democalledbyvue\\democalledbyvue.exe"
 
[HKEY_CLASSES_ROOT\democalledbyvue\shell]
@=""
 
[HKEY_CLASSES_ROOT\democalledbyvue\shell\open]
@=""
 
[HKEY_CLASSES_ROOT\democalledbyvue\shell\open\command]
@="\"E:\\workspace_of_codetyphon\\democalledbyvue\\democalledbyvue.exe\" \"%1\""

3.3编写 VueJS 页面

在 Vue 创建的项目中的页面上添加一个链接、一个文本框、一个按钮控件,实现点击链接后调用 3.1 中创建的应用程序并传递固定的参数,在文本框中输入文本,单击按钮调用 3.1 中创建的应用程序并传递文本框中输入的内容,代码如下:

<template>
  <div style="padding: 24px;">
    <a href="democalledbyvue://这是从Web传递的参数/11570d2c987ef23a609e" >调用本地exe</a>
    <div style="padding: 12px;">
      <InputText type="text" v-model="param" />
    </div>
    <Button label="调用本地exe" @click="call_local_exe"/>
  </div>
</template>

<script>
import {ref} from "vue"
import Button from 'primevue/button'
import InputText from 'primevue/inputtext'

export default {
  name: "IndexPage",
  components: {
    Button,
    InputText,
  },
  setup () {
    const param=ref('')

    function call_local_exe () {
      window.open('democalledbyvue://' + param.value)
    }

    return {
      param, call_local_exe
    }
  }
}
</script>

<style scoped>

</style>

在 js 中关键就是通过自定义协议 democalledbyvue:// 来调用。

3.4 运行效果

Web 页面:

本地应用程序:

从执行结果我们可以看出,每次调用都会打开以一个本地应用程序的实例。