delphi 数组类型

摘要:
由于数组下标基于子绑定类型,因此Delphi可以对它们执行范围检查。然而,Windows一直使用基于零的数组,Delphi控件库也在朝着这个方向发展。Delphi主要以数组属性的形式使用数组。当下一章讨论Delphi循环时,我将向您展示数组属性的更多示例。注意:Delphi4的ObjectPascal添加了一个动态数组。所谓的动态数组是在运行时动态分配内存以改变数组的大小。您将在第8章中看到Delphi动态数组的描述。

数组类型


数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素。定义数组时,方括号也用来指定可能的下标值。例如,下面的代码中定义了一个有 24 个整数的数组:

type
    DayTemperatures = array [1..24] of Integer;

在数组定义时,你需要在方括号中填入一个子界类型的值,或者用两个有序类型的常量定义一个新的子界类型,子界类型指定了数组的有效索引。由于子界类型指定了数组下标值的上界和下界,那么下标就不必象 C、C++、JAVA 和其他语言那样必须从零开始。

由于数组下标基于子界类型,因此 Delphi 能够对它们进行范围检查。不合法的常量子界类型将导致一个编译时间错误;如果选上编译器范围检查选项,那么超出范围的下标值将导致一个运行时间错误。

使用上述数组定义方法,定义一个 DayTemperatures 类型的变量如下:

type
    DayTemperatures = array [1..24] of Integer;

var 
    DayTemp1: DayTemperatures;

procedure AssignTemp;
begin 
    DayTemp1 [1] := 54;
    DayTemp1 [2] := 52;
...
    DayTemp1 [24] := 66;
    DayTemp1 [25] := 67; // compile-time error

数组可以是多维的,如下例:

type
    MonthTemps = array [1..24, 1..31] of Integer;
    YearTemps = array [1..24, 1..31, Jan..Dec] of Integer;

这两个数组建立在相同的核心类型上,因此你可用前面定义的数据类型声明它们,如下面代码所示:

type
    MonthTemps = array [1..31] of DayTemperatures;
    YearTemps = array [Jan..Dec] of MonthTemps;

上例的声明把索引的次序前后调换了一下,但仍允许变量之间整块赋值。例如:把一月份的温度值赋给二月份:

var
    ThisYear: YearTemps;

begin
    ...
    ThisYear[Feb] := ThisYear[Jan];

你也能定义下标从零开始的数组,不过这似乎不太合逻辑,因为你需要用下标 2 来访问数组第三项。然而,Windows 一直沿用了从零开始的数组(因为它是基于 C 语言的),并且 Delphi 控件库也在往这方向靠拢。

使用数组时,你总要用标准函数 Low 和 High 来检测它的边界,Low 和 High 返回下标的下界和上界。强烈建议使用 Low 和 High 操作数组,特别是在循环中,因为这样能使代码与数组范围无关,如果你改变数组下标的范围声明,Low 和 High 代码不会受影响;否则,如果代码中有一个数组下标循环体,那么当数组大小改变时你就不得不更新循环体的代码。Low 和 High 将使你的代码更易于维护、更稳定。

注意:顺便提一下,使用 Low 和 High 不会增加系统运行额外开销。因为在编译时,他们已被转换成常数表达式,而不是实际函数调用。其他简单的系统函数也是这样。

Delphi 主要以数组属性的形式使用数组。我们已经在 TimeNow 例子中看到过数组属性,也就是 ListBox 控件的 Items 属性。下一章讨论 Delphi 循环时,我将向你介绍更多有关数组属性的例子。

注意:Delphi 4 的 Object Pascal 中增加了动态数组,所谓动态数组是在运行时动态分配内存改变数组大小。使用动态数组很容易,不过我认为在这里讨论这类数组不合适。你将在第八章看到对 Delphi 动态数组的描述。



来自为知笔记(Wiz)


免责声明:文章转载自《delphi 数组类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇启动docker容器时的Error response from daemon: devmapper: Error mounting: invalid argument.提高unigui开发效率的两个方法(02)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

delphi

procedureTForm1.btnFindClick(Sender: TObject); varhr, hr1, hr_id, hr_pwd: THandle; WindowText: array[0..MAX_PATH] ofChar; beginhr := FindWindow('#32770', 'TeamViewer'); hr :=...

delphi的构造函数和析构函数

delphi的构造函数的定义是:constructor create;delphi的析构函数的定义是:destructor destroy;析构函数是不能重载的,但是构造函数是可以重载的。构造函数在重载的时候要在后面加“overload”,例如:constructor create;overload;constructor create(i:integer...

Delphi 回调函数

不是原创,原文链接: https://blog.csdn.net/u014028956/article/details/46810537 1、首先要声明一个类型;         type  TProc = procedure(str:string) of object;     //这里的of object 一定要,不然会出错,也可能是有些方法自己不知道...

delphi 异形窗体可半透明

unit xDrawForm; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus, Graphics,GDIPOBJ,GDIPAPI,GDIPUTIL; type TwwGDIImage = class publ...

Delphi dbgrideh颜色设置

dbgrideh颜色设置 (2010-06-30 10:30:59)转载 标签:杂谈 (1)分行不同颜色设置;在DBGridEh1DrawColumnCell中写;     if ADOQuery1.RecNo mod 2=0 then    begin        DBGridEh1.Canvas.Font.Color := clRed...

Delphi的TService的輸入桌面切換(服务程序)(windows登录界面如何截图)(使用了OpenDesktop和GetThreadDesktop等API)

dfm: object CopyDeskService: TCopyDeskServiceOldCreateOrder = FalseOnCreate = ServiceCreateOnDestroy = ServiceDestroyAllowPause = FalseDisplayName = 'Copy Desk Service'Interactive...