begin
ifi=1then
Result:
=copy(s,i,2)
else
Result:
=Result+sCut+Copy(s,i,2);
i:
=i+2;
end;
end;
测试:
var
sourceStr,destinateStr:
string;
begin
sourceStr:
='abcdefgh';
destinateStr:
=DelimiterInsert(sourceStr,'-');//每两个字符之间加上“-”
ShowMessage(destinateStr);
end;
运行结果:
h)单引号
aa:
='aaa''';那么aa的结果就是aaa'
实际上就是两个单引号表示一个单引号 bb:
='bb''bb';bb的结果为bb'bb
i)ascii码转换成字符
var
ss:
string;
begin
ss:
=char(65)+char(66);
ShowMessage(ss);
end;
运行结果:
j)字符替换
var
ss:
string;
begin
ss:
='aaabbbccc';
ss:
=StringReplace(ss,'b','m',[rfReplaceAll]);
ShowMessage(ss);
end;
运行结果:
注:
更全面的字符串处理函数,可参考:
a)
b)Delphi帮助文档,Help—>DelphiHelp下strUtils
二、string,pchar,字符数组三者之间的相互转换
a)String类型在内存中的分配
说明:
1)结束符#0其实只是为了兼容pchar类型,实际输出字符串时,是根据“字符串长度”中存储的数值,而不是结束符#0,代码如下:
var
SrcString:
string;
begin
SrcString:
='12345';//此时长度为5
ShowMessage('原始字符串为:
'+SrcString);
SrcString:
=SrcString+'AddStr';//此时字符串为“12345AddStr”,长度也会自动修改为11
showmessage('追加之后的字符串:
'+SrcString);//显示为:
“12345AddStr”
SetLength(SrcString,3);//字符串长度人为设置为3,实际长度应该是11
ShowMessage('人为设置长度后字符串为:
'+SrcString);//根据存储的长度值显示,而非结束符#0,最终输出‘123’
end;
2)引用计数的作用是:
当指向该堆空间的指针个数为零时,编译器自动释放堆内存,而不需
要手动释放
3)采用copyonwrite机制,以提高内存空间的利用率
附:
什么是copyonwrite机制?
多个引用指向同一块内存地址。
当其中的某个引用发生写操作时,重新拷贝一份到其他内存中,同时
原引用计数减1。
这样做是为了提高内存的利用率。
缺陷:
string类型作为参数时,尽管一开始“临时引用”和“原始引用”都指向堆中的同一块内存,
当在调用到的函数体内,对“临时引用”指向的内存块进行写操作时,实际上会把该内存块
的内容拷贝出来并结合具体的操作,生成调用者需要的字符串,存入新开辟的一块堆内存中,
此时“原始引用”指向的那块内存块的内容并没有发生改变,这也是为什么无法用string类型
作为输出参数传递函数返回值(但可以用作输入参数),而是使用PChar类型作为输出参数
传递函数返回值
被调用的以string类型作为“输出参数”的函数:
procedureTForm1.StringTypeAsOutputParam(SourceStr:
string);
begin
SourceStr:
=SourceStr+'bbbbb';
showmessage('修改之后的字符串为:
'+SourceStr);//显示为:
aaaaabbbbbb
end;
调用该函数:
var
mySourceStr:
string;
begin
mySourceStr:
='aaaaa';
showmessage('原始字符串为:
'+mySourceStr);//显示为:
'aaaaa'
StringTypeAsOutputParam(mySourceStr);//将string类型作为输出参数传入
showmessage('调用函数之后的字符串为:
'+mySourceStr);//依然显示为:
'aaaaa'
end;
b)String与Pchar
两者兼容,可直接进行“类型强转”
1 var
2 myString:
string;
3 myPchar:
PChar;
4 begin
5 myString:
='ABCDEFG';
6 ShowMessage('转换之前的字符串为:
'+myString); //此时字符串为‘ABCDEF’
7 myPchar:
=PChar(myString);
8 mystring:
=string(myPchar);
9 ShowMessage('连续转换后的字符串为:
'+myString); //此时字符串仍为‘ABCDEF’
10 end;
c)字符数组与Pchar
1)字符数组下标从0开始
2)字符数组下标从1开始
var
myArrayChar:
array[1..10] of Char;
myPchar:
PChar;
begin
myPchar:
=PChar('ABCDEF');
StrCopy(@myArrayChar,myPchar); // 也可使用StrPCopy(@myArrayChar,'ABCDEF');
ShowMessage(myArrayChar[1]); //输出值为‘A’注:
此时若以myArrayChar[0]来访问会无法通过编译
myArrayChar[1]:
='1';
myPchar:
=PChar(@myArrayChar);
ShowMessage(string(myPchar)); //整个字符串为‘1BCDEF’
end;
d)string与字符数组:
需要借助pchar类型过渡
1var
2 myString:
string;
3 myArrayChar:
array[1..10] of Char;
4begin
5 myString:
='ABCDEF';
6 StrCopy(@myArraychar,PChar(myString));//也可以使用StrPCopy(@myArraychar,myString);
7 myArrayChar[1]:
='1';
8 myString:
=string(PChar(@myArrayChar));
9 ShowMessage(myString); //转换后的值为‘1BCDEF’
10end;
注:
StrCopy与StrPCopy的区别
参数类型:
StrCopy(pchar类型,pchar类型);
StrPCopy(pchar类型,string类型);
e)推荐用法:
1)字符串拷贝时
StrPCopy(pchar类型,string类型);
2)需要将字符串作为“输出参数”时
使用PChar类型
3)定义字符数组时
charArray:
array[0..n]ofchar;//下标尽可能从0开始,而不是从1开始
f)string与widestring
string:
Ansi字符集
widestring:
Unicode字符集
Delphi 控制Excel
(一)使用动态创建的方法
首先创建Excel对象,使用ComObj:
varExcelApp:
Variant;
ExcelApp:
=CreateOleObject('Excel.Application');
1)显示当前窗口:
ExcelApp.Visible:
=True;
2)更改Excel标题栏:
ExcelApp.Caption:
='应用程序调用MicrosoftExcel';
3)添加新工作簿:
ExcelApp.WorkBooks.Add;
4)打开已存在的工作簿:
ExcelApp.WorkBooks.Open('C:
\Excel\Demo.xls');
5)设置第2个工作表为活动工作表:
ExcelApp.WorkSheets[2].Activate; 或ExcelApp.WorksSheets['Sheet2'].Activate;
6)给单元格赋值:
ExcelApp.Cells[1,4].Value:
='第一行第四列';
7)设置指定列的宽度(单位:
字符个数),以第一列为例:
ExcelApp.ActiveSheet.Columns[1].ColumnsWidth:
=5;
8)设置指定行的高度(单位:
磅)(1磅=0.035厘米),以第二行为例:
ExcelApp.ActiveSheet.Rows[2].RowHeight:
=1/0.035;//1厘米
9)在第8行之前插入分页符:
ExcelApp.WorkSheets[1].Rows.PageBreak:
=1;
10)在第8列之前删除分页符:
ExcelApp.ActiveSheet.Columns[4].PageBreak:
=0;
11)指定边框线宽度:
ExcelApp.ActiveSheet.Range['B3:
D4'].Borders[2].Weight:
=3;
1-左 2-右 3-顶 4-底 5-斜(\) 6-斜(/)
12)清除第一行第四列单元格公式:
ExcelApp.ActiveSheet.Cells[1,4].ClearContents;
13)设置第一行字体属性:
ExcelApp.ActiveSheet.Rows[1].Font.Name:
='隶书';
ExcelApp.ActiveSheet.Rows[1].Font.Color :
=clBlue;
ExcelApp.ActiveSheet.Rows[1].Font.Bold :
=True;
ExcelApp.ActiveSheet.Rows[1].Font.UnderLine:
=True;
14)进行页面设置:
a.页眉:
ExcelApp.ActiveSheet.PageSetup.CenterHeader:
='报表演示';
b.页脚:
ExcelApp.ActiveSheet.PageSetup.CenterFooter:
='第&P页';
c.页眉到顶端边距2cm:
ExcelApp.ActiveSheet.PageSetup.HeaderMargin:
=2/0.035;
d.页脚到底端边距3cm:
ExcelApp.ActiveSheet.PageSetup.HeaderMargin:
=3/0.035;
e.顶边距2cm:
ExcelApp.ActiveSheet.PageSetup.TopMargin:
=2/0.035;
f.底边距2cm:
ExcelApp.ActiveSheet.PageSetup.BottomMargin:
=2/0.035;
g.左边距2cm:
ExcelApp.ActiveSheet.PageSetup.LeftMargin:
=2/0.035;
h.右边距2cm:
ExcelApp.ActiveSheet.PageSetup.RightMargin:
=2/0.035;
i.页面水平居中:
ExcelApp.ActiveSheet.PageSetup.CenterHorizontally:
=2/0.035;
j.页面垂直居中:
ExcelApp.ActiveSheet.PageSetup.CenterVertically:
=2/0.035;
k.打印单元格网线:
ExcelApp.ActiveSheet.PageSetup.PrintGridLines:
=True;
15)拷贝操作:
a.拷贝整个工作表:
ExcelApp.ActiveSheet.Used.Range.Copy;
b.拷贝指定区域:
ExcelApp.ActiveSheet.Range['A1:
E2'].Copy;
c.从A1位置开始粘贴:
ExcelApp.ActiveSheet.Range.['A1'].PasteSpecial;
d.从文件尾部开始粘贴:
ExcelApp.ActiveSheet.Range.PasteSpecial;
16)插入一行或一列:
a.ExcelApp.ActiveSheet.Rows[2].Insert;
b.ExcelApp.ActiveSheet.Columns[1].Insert;
17)删除一行或一列:
a.ExcelApp.ActiveSheet.Rows[2].Delete;
b.ExcelApp.ActiveSheet.Columns[1].Delete;
18)打印预览工作表:
ExcelApp.ActiveSheet.PrintPreview;
19)打印输出工作表:
ExcelApp.ActiveSheet.PrintOut;
20)工作表保存:
ifnotExcelApp.ActiveWorkBook.Savedthen
ExcelApp.ActiveSheet.PrintPreview;
21)工作表另存为:
ExcelApp.SaveAs('C:
\Excel\Demo1.xls');
22)放弃存盘:
ExcelApp.ActiveWorkBook.Saved:
=True;
23)关闭工作簿:
ExcelApp.WorkBooks.Close;
24)退出Excel:
ExcelApp.Quit;
(二)使用Delphi控件方法
在Form中分别放入ExcelApplication,ExcelWorkbook和ExcelWorksheet。
1) 打开Excel
ExcelApplication1.Connect;
2)显示当前窗口:
ExcelApplication1.Visible[0]:
=True;
3)更改Excel标题栏:
ExcelApplication1.Caption:
='应用程序调用MicrosoftExcel';
4)添加新工作簿:
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0));
5)添加新工作表:
varTemp_Worksheet:
_WorkSheet;
begin
Temp_Worksheet:
=ExcelWorkbook1.
WorkSheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,0)as_WorkSheet;
ExcelWorkSheet1.ConnectTo(Temp_WorkSheet);End;
6)打开已存在的工作簿:
ExcelApplication1.Workbooks.Open(c:
\a.xls
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,0)
7)设置第2个工作表为活动工作表:
ExcelApplication1.WorkSheets[2].Activate; 或
ExcelApplication1.WorksSheets['Sheet2'].Activate;
8)给单元格赋值:
ExcelApplication1.Cells[1,4].Value:
='第一行第四列';
9)设置指定列的宽度(单位:
字符个数),以第一列为例:
ExcelApplication1.ActiveSheet.Columns[1].ColumnsWidth:
=5;
10)设置指定行的高度(单位:
磅)(1磅=0.035厘米),以第二行为例:
ExcelApplication1.ActiveSheet.Rows[2].RowHeight:
=1/0.035;//1厘米
11)在第8行之前插入分页符:
ExcelApplication1.WorkSheets[1].Rows.PageBreak:
=1;
12)在第8列之前删除分页符:
ExcelApplication1.ActiveSheet.Columns[4].PageBreak:
=0;
13)指定边框线宽度:
ExcelApplication1.ActiveSheet.Range['B3:
D4'].Borders[2].Weight:
=3;
1-左 2-右 3-顶 4-底 5-斜(\) 6-斜(/)
14)清除第一行第四列单元格公式:
ExcelApplication1.ActiveSheet.Cells[1,4].ClearContents;
15)设置第一行字体属性:
ExcelApplication1.ActiveSheet.Rows[1].Font.Name:
='隶书';
ExcelApplication1.ActiveSheet.Rows[1].Font.Color :
=clBlue;
ExcelApplication1.ActiveSheet.Rows[1].Font.Bold :
=Tru