Borland C++ 语法摘要
包括TList(链表)类、AnsiString类、Set(集合)类、DynamicArray(动态数组)类和 TStream(流)类。
实现了线性链表,可以存储任意类的对象。
虽然它是链表,但是它实际上是一个存放指针的数组,可以通过其 Items 属性象访问一个数组那样实现对 List对象的每一个元素的访问。
Capacity 容量
Count 长度
需要注意的是 Count 属性并不一定是 TList 对象中元素的个数,它也包含 Items 数组中的空指针的数目。如果要删除数组中的空指针,可以使用 List的Pack方法。
List 获取直接进入列表中元素数组的指针。
需要注意的是,不管Items数组中有没有NULL元素,Add方法都只是在数组的末尾添加元素。
清除链表中的所有元素。释放内存,并将Capacity清0.
提示:不会释放内存,也不会修改Capacity。
交换两个元素的位置。
需要时(Count=Capacity)扩容到2的X次方倍。
查找元素。
插入元素 到指定位置。
移动元素 到指定位置。
删除Items列表中所有指针值为NULL的元素。
此操作并不释放内存, 即只会改变Count。
删除指定值的元素。
返回元素先前的位置。
TList *pList = new TList();
AnsiString TheObject = "This is an object."
pList->Add(TheObject);
MessageDlg("列表中有 " + IntToStr(pList->Count) + "个元素",
mtInformation, TMsgDlgButtons() << mbOK, 0);
pList->Remove(TheObject);
delete pList;
pList=NULL;
void __fastcall Sort(TListSortCompare Compare);
通过自定义的比较函数Compare来对列表中的元素进行排序。
示例:
int __fastcall CompareNames(void *Item1, void *Item2)
{
return CompareText(((TComponent*)Item1)->Name, ((TComponent *)Item2)->Name);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
List1->Sort(CompareText);
}
2.1.2 AnsiString 类
AnsiString是C++Builder中仿照Object Pascal语言中的长字符串类型设计的一个字符串类 siString类型。
本质上,AnsiString 仍然以’’作为字符串的结尾标志,只是在字符串的前面添加了几个字节的信息头。
比较C++中提供的串类型,AnsiString 提供了更多实用、方便的方法。
连接:+、+=
比较:<、<=、==、>、>=、!=
字符索引:[] (注:串中字符索引从1开始)
返回一个C/C++标准字符串指针。
删除index开始的count个字符。
提示:count可以超过剩余长度,则删除所有剩余。
将value用format指定的格式转换为字符串形式。
Format string 1234 -1234 0.5 0
#,##0.00 1,234.00 -1,234.00 0.50 0.00
0.000E+00 1.234E+03 -1.234E+03 5.000E-01 0.000E+00
# 表示此位置可空缺。
0 表示此位置以0填充。
插入。
Hex格式的串。
判断空串。
长度。
static AnsiString __fastcall LoadStr(int ident);
从指定句柄中读取标志为ident的字符资源。
如果没有指定句柄,则从当前模块(如可执行程序)中读取。
AnsiString __fastcall UpperCase() const;
大小写转换。
定位子串。
注意:无子串时返回0(因为 bc++串中字符索引从1开始).
修改串的Length属性。
字符重复成串。
截取子串。
int __fastcall ToInt() const;
int __fastcall ToIntDef(int defaultValue) const;
ToInt 和 ToIntDef 方法都是将字符串转换为一个整型数,不同之处在于如果字符串没有可用的字符,前者会抛出一个异常,后者则会返回默认值defaultValue。
AnsiString __fastcall TrimRight() const;
AnsiString __fastcall Trim() const;
截去首尾空格。
2.1.3 Set(集合)
此模板使用时有三个参数,其中type用来指定集合元素的类型(如int、char、枚举变量等) ;
minval为集合元素的最小值,minval不能小于0;maxval为集合元素的最大值,它不能大于255。
Set <char, 'A', 'C'> s1; // 直接定义集体对象
s1 << 'A' << 'B' << 'C'; //初始化
typedef Set <char, 'A','Z'> UPPERCASESet; // 使用typedef
UPPERCASESet s2;
s2 << 'A' << 'B' << 'C';
清空集合。
查询集合对象中是否含有指定的元素el。
判断空集。
判断集合是否相等。
注意:只有类型和包含元素都相等的两个集体才相等。前面的例子中 s1!=s2, 虽然它们含有相同的元素。
分别为集合之间的并集、交集、并集中交集的补集运算的运算符。 // 并、交、差集?
添加或删除元素。
如判断键盘事件和鼠标事件时,需要处理的Shift参数就是一个集合类型
typedef Set<Classes__1,ssShift,ssDouble>TShiftState。
DynamicArray<type> ArrayName;
这是一个模板类,它的元素可以为任意类型。
索引 []。
赋值要使用 Copy/CopyRange 方法。
注意:不要在动态数据上使用 ==、=,那操作的对象是指针!
typedef DynamicArray< DynamicArray < AnsiString > > T2DStringArray;
T2DStringArray d2a;
d2a.Length = 3;
for(int i=0; i<d2a.Length; i++)
{
d2a[i].Length = 4;
}
2.1.5 TStream(流)
流类用于进行各种存储媒介之间的数据操作。
TStream 类的几种派生类分别实现与某种特殊的存储媒介之间的数据交换,如磁盘数据、内存数据等。除了数据的读取、写入和复制之外, 在TStream类实例中还可以用Seek到流中的任意位置。
Position 流文件当前指针的位置。以字节为单位。
Size 流文件大小。以字节为单位。
__int64 __fastcall CopyFrom(TStream* Source, __int64 Count);
从Source流文件中读取Count字节的内容到当前流文件中,函数返回值为实际拷贝的字节数。
将指定文件复制到工程所在目录。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString NewFileName = ExtractFilePath(Application->ExeName)
+ ExtractFileName(Edit1->Text);
AnsiString msg = Format("Copy %s to %s", ARRAYOFCONST((Edit1->Text, NewFileName)));
if(MessageDlg(msg, mtInformation, mbOKCancel, 0) == mrOk)
{
TFileStream *OldFile = new TFileStream(Edit1->Text, fmOpenRead);
try
{
TFileStream *NewFile = new TFileStream(NewFileName, fmCreate);
try
{
NewFile->CopyFrom(OldFile, OldFile->Size);
}
__finally
{
FreeAndNil(NewFile);
}
}
__finally
{
FreeAndNil(OldFile);
}
}
}
此方法用于从当前流文件的当前指针所在位置开始,读取Count字节的内容到Buffer内
存位置,返回值为实际读取的字节数。如果返回值小于 Count,则意味着还没有读够 Count
个字节的内容,指针位置已经到了流文件的末尾。其它的数据读取的方法,如ReadBuffer和
ReadComponent,都是通过对Read方法的调用来实现的。
virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin);
读取流。
返回值为流文件中新的当前位置(Position 属性)。
Origin 参数的取值可以为 soFromBeginning(流文件的开始位置) 、soFromCurrent (流文件的当前位置)或soFromEnd(流文件的结尾位置) 。
virtual int fastcall Write(const void *Buffer, int Count) = 0;
写入流。
返回值为写入的字节数。
所有其它的数据写入方法,如 WriteBuffer 和WriteComponent都是靠调用Write来实现的。
LoadFromStream,下面是它们的一个示例:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMemoryStream* pms = new TMemoryStream();
//将列表框的内容写入流文件
ListBox1->Items->SaveToStream(pms);
//重置流文件的当前位置到文件的开头
pms->Position = 0;
//将流文件的内容写入RichEdit组件
RichEdit1->Lines->LoadFromStream(pms);.
delete pms;
}
2.2 函数
产生服从高斯分布的随机数
extern PACKAGE int __fastcall RandomFrom(const int *AValues, int AValues_Size);
extern PACKAGE __int64 __fastcall RandomFrom(const __int64 *AValues, int AValues_Size);
RandomFrom 函数用于从一个数组中随即取得其元素.
随机数种子.
初始化随机数产生器.
此函数返回一个从 AFrom 到 ATo(包含此值)的整数,如果 AFrom 大于 ATo,可以返回负数。
void settime(struct time *timep);
获取/设置系统时间。
其中time结构
struct time {
unsigned char ti_min; /* minutes */
unsigned char ti_hour; /* hours */
unsigned char ti_hund; /* hundredths of seconds */
unsigned char ti_sec; /* seconds */
};
#include <time.h>
#include <stdio.h>
#include <dos.h>
int main(void)
{
clock_t start, end;
start = clock();
delay(2000);
end = clock();
printf("The time was: %fn", (end - start) / CLK_TCK);
return 0;
}
对于频繁调用的简短函数,为了省去函数调用和返回的时间,在函数之前添加Inline声明它为内联。
此函数是定义类X中的成员函数func为Inline函数。
可以使用va_arg、va_end、 和va_start三个宏来处理不定长的函数参数列表,它们定义在 stdarg.h 中。
type va_arg(va_list ap, type);
void va_end(va_list ap);
#include <stdio.h>
#include <stdarg.h>
/* calculate sum of a 0 terminated list */
void sum(char *msg, ...)
{
int total = 0;
a_list ap;
int arg;
va_start(ap, msg);
while((arg=va_arg(ap, int))!= 0)
total += arg;
// MessageDlg(AnsiString("sum is ")+total, mtInformation, TMsgDlgButtons()<<mbOK, 0);
}
void main()
{
sum("The total of 1+2+3 is %dn", 1,2,3,0);
}