【Delphi奥法 - 第一章】Hello Firemonkey
delphi吧
全部回复
仅看楼主
level 11
天道玄虚 楼主
【Delphi奥法】
天道玄虚出品
第一章:Hello Firemonkey——Pascal及FMX入门
1.0、Pascal基本规则和基本数据类型
Firemonkey(又称为FMX)中,语法规则与VCL下的Pascal一致。
1.0、Pascal基本规则
Pascal的语法规则与C系相比,相对严谨以至于被称为繁琐。
作为结构编程语法,Pascal的基本构成为函数,在面对对象编程中,基本构成可以看做是函数(非类方法)和类(以及类方法)。现在暂时不涉及面的对象的部分。
1.0.1、语句规则
每两个语句之间有且只能有一个分号作为分隔符,不带参数的函数末尾可以省略括号。通常习惯每一个语句末尾都加上一个分号。
例如:
赋值语句:a := a +1;
函数语句:MyFunction(x);
不带参数的函数:MyFunction;
如果是判断语句(if语句),那么在else前不插入分号,可以使用begin……end;插入代码段,例如:
if a = b then
a := a + 1
else
b := b + 1;
相关内容还会在具体例子中说明和讲解。
1.0.3、命名规则
Pascal语法不区分大小写,命名需要使用英文字母、数字和下划线的组合(数字不包括小数点),不能够使用数字作为变量开头,比如:5a就不可以。
1.0.2、习惯规则
赋值号前后、运算符前后(算术、逻辑)使用空格隔开,冒号(类型声明符号)之后、逗号之后使用空格隔开。命名遵守如下规则:
习惯上使用英文单词组合作为变量名,并且每一个单词首字母大写(当然,也可以使用拼音),有时候可以在尾端加上数字。根据个人习惯,可以自行确定个人喜好的命名规则,但是以简明易读为前提,例如:
MyVar、AChar、AlongAndLongStupidVar(有没有觉得变量名不宜太长?)、MyLALSVar(上一个长变量名的缩写)。
有时候允许使用一个或两个小写字母作为前缀来区分变量类型,如使用g表明全局变量等(全局变量将会在变量作用域中讲解)。
习惯上保留字(默认着色为蓝色且加粗的单词)全部小写,其余构成单词的变量名或者函数名首字母(每一个单词首字母)大写。
代码排版上,通常从属关系的语句或语句段缩进增加两个空格(一个Tab)。
1.1、Pascal基本数据类型
在入门级别中,常用的有四个基本类型以及一些系统常用组件类。
基本类型:整数、实数、字符、字符串。注意Delphi的字符串结构与C完全不同,Delphi的字符串索引从1开始,在内存中0位置储存长度信息。
常用组件类会再后续的小程序中一一介绍。
1.1.0、整数
常用的整数类型有:Integer、Byte、Word、Cardinal。
其中,Integer为32位有符号整数、Byte为8位无符号整数,Word为16位无符号整数、Cardinal为32位无符号整数。
另附:计算机中常用的位(bit)指二进制位,与字节换算关系为“1Byte = 8bit”,有符号数指数据中使用一位来储存符号,其取值分别为非负值和负值两类,两类数量相等(正值比负值少一个,由于0的缘故)。
Delphi中的颜色类型等同于32位无符号整数(Cardinal),在VCL中,预定义了一些cl开头的常量用来定义常用的颜色,FMX中则使用TAlphaColors集合定义常用颜色(cla是早期表示,已经弃之不用)。
常用函数
Inc(a);(Inc(a, N); )——作用:使a增加1(使a增加N)。
Dec(a);(Dec(a, N);)——作用:使a减少1(使a减少N)。
IntToStr(a);——作用:将a转换为字符串。
1.1.1、实数
常用的实数有:Single、Double、Extended三种,分别为单精度实数、双精度实数、扩展精度实数。区别在于精度不同,取值范围可以认为一样。
一般根据需要选用Single或者Double。
常用函数:部分需要引用System.Math单元。
Trunc(a);——效果:获取截断整数。
Round(a);——效果:获取近似整数(四舍六入五去偶,银行家算法)。
Ceil(a);——效果:天花板函数,获取不小于实数的最小整数。
Floor(a);——效果:地板函数,获取不大于实数的最大整数。
FloatToStr(a);——效果,将实数转换为字符串。
1.1.2、字符
新版本使用类型统一使用Char,ANSIChar等仅为兼容而存在,不推荐使用。
常用函数:
Chr(a);——效果:根据字符编号获取字符。
Ord(c):——效果:根据字符获取字符编号。
1.1.3、字符串
新版本请不要使用ANSIString,另外注意,string为保留字,习惯上小写。
如果需要兼容C系,可以使用PChar即字符指针(字符数组)。
字符串涉及到StringHelper,应用于string的一个类,可以对字符串进行一些查找、替换、统一下标索引等操作,后续将详细讲解。
常用函数:
Length(s);——效果:获取字符串长度(不要质疑这个函数的效率,难以估量地高,几乎等同于读取变量)。
1.2、Pascal中函数的简单使用
在Pascal中,一个函数可以看做分为两部分,一部分为声明部分,另一部分为实现部分(定义部分)。
声明部分:
函数类型 函数名(参数列表):返回值类型;
注意没有返回值的为过程(一般说的函数包括过程),省略返回值类型部分。
例如:
function AFunction(x:Single): Single;
procedureAProcedure(c: Char):
定义部分:
函数类型 函数名(参数列表):返回值类型;
局部变量定义标识(var)
局部变量定义
语句段
例如:
function MyFunction(x:Single): Single;
var
a: Single;
begin
a := x * x;
x := x + a;
Exit(x);
end;
注意:新版Pascal下有两种确定返回值的方式,第一种是使用Result变量,如果函数执行结束,Result有值,那么就作为返回值。另一种是使用Exit(返回值),这种时候将会忽略Result返回值。建议一个函数内不要混用。
2017年01月17日 01点01分 1
level 11
天道玄虚 楼主
1.3、Hello Firemonkey
让我们来做一个小程序,顺便学一下几个基本控件的使用。
首先新建一个Multi-Device程序,选择空白应用。
1.3.0、TLabel
在空白窗口上放置一个TLabel,这个控件主要功能就是显示一段字符串。
常用的属性:
AutoSize:是否自适应大小。这个可以分别测试效果,然后决定是否勾选。
Enable:如果要用到,那么勾选。可以通过在代码中设置为False来禁用。
Height:高度,不能够改变文字大小,一般没有调整的必要。
Hint:鼠标在上面停留的时候显示提示。配合ShowHint使用。
HitTest:是否有单击动画效果。
Name:TLabel名称。
Opacity:透明度。
Position:位置信息,通常调整其子属性。
Position.X:横坐标,注意这里的尺寸和坐标都是实数,窗体左上角为0。
Position.Y:纵坐标,窗体左上角为0。
RotationAngle:旋转角度字面意思,自己尝试就好。
RotationCenter:旋转中心。配合旋转角度使用。
ShowHint:是否显示提示。配合Hint使用。
Text:重点属性,显示的文本内容。修改这个或者在代码中修改这个,可以改变显示的内容。
TextSettings:重点属性,显示文本的格式(样式),通常调整其子属性。
TextSettings.Font.Family:显示字体。
TextSettings.Font.Size:显示尺寸,单位是像素。
TextSettings.Font.Style:显示风格,下划线、加粗、倾斜等效果。
TextSettings.FontColor:字体颜色。
TextSettings.HorzAlign:水平对齐方式。
TextSettings.VertAlign:竖直对齐方式。
Visible:是否可见。
Width:宽度,单精度实数。
1.3.1、TEdit
在刚才的TLabel右侧放置一个TEdit,TEdit的属性大致一致,是一个单行输入框,只提几个区别。
CanFocus:是否可以被聚焦。如果这个不能够被聚焦,那就无法在其中输入了。
Cursor:鼠标样式,更改鼠标在其中范围内的时候显示样式。
FilterChar:过滤,一般留空,只允许输入其中包含的字符。
KeyboardType:移动端上默认显示的键盘样式。
KillForcusByReturn:返回后消除聚焦。
PassWord:是否按照密码形式显示。
ReadOnly:只读,即不可被修改。
1.3.2、TButton
在下方放置一个TButton,Button是一个文字提示的按钮。
完成以上之后,大致长这样(很难看,不要喷)。
2017年01月17日 02点01分 2
level 11
天道玄虚 楼主
1.3.3、搞事情
让我们来设计一个小程序,功能是单击按钮,将输入框中的文字显示在按钮上,并且在输入框中显示Firemonkey。
首先我们需要设定按钮单击这个事件的触发。
找到按钮的事件页,其中有一个叫做OnClick,在右方空白的值区域中双击,自动弹到代码页,这个时候应该看到这个样子。
函数名中的TForm1.部分是面对对象的内容,表示这个函数是属于TForm1的一个方法。
好,我们先分析一下我们需要的功能。
首先是获取输入框中的文字。
然后将其赋予按钮的显示文字。
最后在输入框中显示HelloFiremonkey。
那么,加入我们一步步来,就需要一个局部变量来暂时储存输入框中的文字。所谓局部变量就是只能够在声明的函数内部读取和生效的变量,区别于全局变量,声明在接口部分的全局变量作用于整个单元及引用了该单元的单元,接口之后部分的作用于整个单元。
比如这个局部变量叫做s,那么第一个语句应该是:
s := Edit1.Text;
点号表示所属,其中Edit1是输入框的名称,如果改变了名称,那么需要改变这一项。
第二行语句:
Button1.Text :=s;
含义很易读,不需要过度解释。
第三行语句,同样的道理,只需要让输入框中的显示文本赋值为Hello Firemonkey就好,注意Pascal中字符串常量使用单引号标识。
Edit1.Text := ‘HelloFiremonkey’;
总的代码如下。
procedureTForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := Edit1.Text;
Button1.Text := s;
Edit1.Text := 'Hello Firemonkey';
end;
2017年01月17日 02点01分 3
level 11
天道玄虚 楼主
练习:分别放置三个输入框,三个显示文本,以及一个按钮。按下按钮后,第三个输入框的显示文本显示为两个输入框中输入的数之和。
为了增加容错,可以使用:
StrToFloatDef(s:string; def: Single): Single;
这个函数当其中字符串不是一个有效的实数的时候,返回默认值。
为了防止结果被修改,可以设定第三个输入框为只读。
这里是文档的位置。[无效] http://pan.baidu.com/s/1nv148rB
2017年01月17日 02点01分 4
level 1
强烈支持 自学已经有一段时间 新教程确实少且大多都是vcl
2017年01月18日 05点01分 5
毕竟firemonkey是新东西,而且相对难一些
2017年01月18日 06点01分
level 12
本题在安卓手机上如何进行,标点符号不认,最好改为空格.
procedure TTestForm.Button1Click(Sender: TObject);
var
s, str: string;
i, sum, c: Integer;
begin
s := Edit1.Text;
sum := 0; // 赋初值为0
str := '';
for i := 1 to Length(s) do
begin
if s[i] <> ',' then
begin
str := str + s[i];
end
else // 此时应该为数值结束
begin
c := StrToInt(str);
Inc(sum, c); // 相当于sum := sum + c
str := '';
end;
end;
// 此时str中应该存在最后一个数
c := StrToInt(str);
Inc(sum, c);
// 最后不要忘记了输出
Edit2.Text := IntToStr(sum);
end;
2017年02月27日 03点02分 6
感谢补充。不过我觉得应该是全半角或者中英文符号的差异吧?如果是同一个符号肯定会认的。
2017年02月27日 04点02分
level 12
安卓手机不认逗号。
2017年02月27日 11点02分 7
level 11
天道玄虚 楼主
这我就不清楚了,感谢指正,那改成空格更好。
2017年02月27日 15点02分 8
level 7
问个问题,7和10之间代码区有什么不同吗,可以用7的代码来学习吗
2017年03月09日 09点03分 9
绝对不可以,七和十差比太大了。而且这个教程是面向fire monkey的,直到Delphi10.1才算很成熟
2017年03月09日 10点03分
我记得挖坑那个帖子里面有一键安装的分流
2017年03月09日 10点03分
1