http://www.cnblogs.com/baoguo/category/91091.html 编程Delphi
http://blog.163.com/liuguang_123/blog/ ヾ戀愛ゞ餜冻
http://hi.baidu.com/sheliey/blog/index/1 VB
http://www.cnblogs.com/28088191/ Delphi(程序人生)
①# 后面跟一个字符编码可以表示这个字符, 字符编码可以用十进制或十六进制表示;譬如字符 "A" 的编码是 65(十进制) 或 $41(十六进制).
---------------------------------
var
c: AnsiChar;
begin
c :=
#65;
ShowMessage(c);
{A}
c := #
$41;
ShowMessage(c);
{A}
end;
ANSII 编码表参见(
http://www.cnblogs.com/28088191/archive/2008/06/13/1220352.html)
--------------------------------
②用 # 也可以表示双字节字符, 所有汉字编码参见(
http://www.cnblogs.com/28088191/archive/2008/06/13/1220366.html)
var
wc: WideChar;
begin
wc :=#
$732B;
ShowMessage(wc);
{猫}
wc := 29483;
ShowMessage(wc);
{猫}
{双字节兼容单字节}
wc :=
#65;
ShowMessage(wc);
{A}
wc := #
$41;
ShowMessage(wc);
{A}
end;
------------------------------------------
③多个 # 表示的字符连接时, 可以省略 + 号.表示字符相连,这在SQL语句中常用
--------------------------------------------
var
str:
string;
begin
str :=
#65 +
#66 +
#67;
ShowMessage(str);
{ABC}
str :=
#65
#66
#67;
ShowMessage(str);
{ABC}
str :=
'猫猫的' +
#32 +
#68 +
#101 +
#108 +
#112 +
#104 +
#105 +
#32 +
'博客';
ShowMessage(str);
{猫猫的 Delphi 博客}
str :=
'猫猫的
#32
#68
#101
#108
#112
#104
#105#32
'博客';
ShowMessage(str);
{猫猫的Delphi 博客}
end;
---------------------------------------
SQL语句中是这样用的:
-------------------------
var SQL:String;
SQL:='Select * From 表 Where 日期字段 Between #' +DateTimeToStr(DateTimePicker1.Date)+'# And #'+DateTimeToStr(DateTimePicker2.Date) +'#';
uses ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
begin
//用IE打开
ShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL);
//用火狐打开
ShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL);
//用默认浏览器打开
ShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL);
end;
//另一种调用IE打开的方法
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
procedure OpenInIE(aURL: string);
var
IE: Variant;
begin
IE := CreateOleObject('InternetExplorer.Application');
IE.Visible := true;
IE.Navigate(aURL);
end;
begin
OpenInIE('www.132435.com');
end;
//第二种方法可以有更多控制
procedure TForm1.Button1Click(Sender: TObject);
procedure OpenInIE(aURL: string); //need uses ComObj;
var
IE: Variant;
begin
IE := CreateOleObject('InternetExplorer.Application');
IE.Visible := true; //可见
IE.left := 0;
IE.top := 0;
IE.height := 600; //高度
IE.width := 800; //宽度
IE.menubar := 0; //取消菜单栏
IE.addressbar := 0; //取消地址栏
IE.toolbar := 0; //取消工具栏
IE.statusbar := 0; //取消状态栏
//IE.resizable := 0; //不允许用户改变窗口大小
IE.Navigate(aURL);
end;
begin
OpenInIE('www.132435.com/blog');
end;
//一般写法
var
MyForm1: TForm1;
begin
MyForm1 := TForm1
.Create(
nil);
MyForm1
.ShowModal;
MyForm1
.Free;
end;
//用 with 语句重写
with TForm1
.Create(
nil)
do
begin
ShowModal;
Free;
end;
var
w: WideString;
i: Integer;
s:
string;
List: TStringList;
begin
List := TStringList
.Create;
for i :=
$4e00
to
$9fa5
do
begin
s :=
#36 + IntToHex(i,
4);
{#36 是 $ 字符}
w := WideChar(i);
List
.Add(s +
'=' + w);
end;
List
.SaveToFile(
'c:/temp/Unicode-Hz.txt');
List
.Free;
end;
uses ShellAPI;
procedure TForm1.AbortClick(Sender: TObject);
begin
ShellAbout(0, 'MySoft', 'Copyright (c) 2007-2008', Application.Icon.Handle);
end;
{$REGION '我的函数'}
...
{ENDREGION}
①{...}
②(*...*)
③//...
④{$IFDEFF DONTCOMPILEME}...{$ENDIF}
分类 | 快捷键 | 解释 | 备注 |
组 件 设 计 类 | Escape | 选择当前组件容器 | |
Shift + Click | 选择多个组件;选择窗体 | |
Tab | 选择下一个组件 | |
Shift + Tab | 选择上一个组件 | |
方向键 | 选择此方向的下一个组件 | |
Ctrl + 方向键 | 将所选组件的位置移动 1 个像素 | |
Shift + 方向键 | 将所选组件的大小改变 1 个像素 | |
Ctrl + Shift + 方向键 | 将所选组件的位置移动 1 个栅格 | |
Del | 删除所选组件 | |
Ctrl + 鼠标拖动 | 选择一个容器内的多个组件 | 可以一起修改共同属性 |
Tab(在 Object Inspector 中使用) | 搜索属性或事件 | |
代 码 编 辑 类 | F1; Ctrl + F1 | 光标所在单词的帮助 | |
Ctrl + Shift + Enter | 光标所在单词的参考 | |
Ctrl + Click(标识符) | 寻找标识符的声明处 | 可配合工具条的:后退/前进 |
Ctrl + A | 全选 | |
Ctrl + C | 复制 | |
Ctrl + X | 剪切 | |
Ctrl + V | 粘贴 | |
Ctrl + S | 保存 | |
Ctrl + F | 查找 | |
F3; Ctrl + L | 继续查找 | |
Ctrl + R | 替换 | |
Ctrl + E | 高级查找 | |
Ctrl + Shift + F | 查找文件 | |
Ctrl + Z | Undo | |
Del | 删除选中的代码 | |
Ctrl + Home | 到开始 | |
Ctrl + End | 到结束 | |
Ctrl + ← | 按词左移 | |
Ctrl + → | 按词右移 | |
Ctrl + ↑ | 窗口上滚 | |
Ctrl + ↓ | 窗口下滚 | |
Ctrl + PgUp | 本屏首行 | |
Ctrl + PgDn | 本屏尾行 | |
Alt + G; Ctrl + O + G | 到指定行 | |
Ctrl + Shift + 0..9; Ctrl + K + 0..9 | 设置(或取消)书签 | |
Ctrl + 0..9; Ctrl + Q + 0..9 | 跳到书签 | |
Ctrl + 空格 | 输入提示 | |
Ctrl + J | 代码模版 | |
Ctrl + Shift + J | (选定后)进入同步编辑模式 | |
Ctrl + Shift + 空格 | 重新提示参数列表 | |
Ctrl + K + T | 选定光标前的单词 | |
Ctrl + N | 插入新行 | 和 Enter 的区别是光标位置不变 |
Shift + 方向键/Home/End/PgUp/PgDn | 扩选 | |
Shift + Alt + 方向键/Home/End/PgUp/PgDn | 区域选择 | |
Shift + Alt + PgUp/PgDn | 区域选择 | |
Ctrl + Shift + Alt + PgUp/PgDn | 区域选择 | |
Ctrl + Shift + PgUp/PgDn | 区域选择 | |
Ctrl + Shift + 水平方向键 | 按单词扩选 | |
Ctrl + O + C | 变换选区 | |
Ctrl + O + I | 变换选区 | |
Ctrl + O + L | 变换选区 | |
Ctrl + O + K | 恢复选区的变换选区 | |
Alt + 左键拖动 | 区域选择 | 区域选择的东西,粘贴也是区域 |
Ctrl + O + L | 选择当前行 | |
Ctrl + Y | 删除当前行 | |
Ctrl + Shift + Y | 删除行右边部分 | |
Ctrl + T | 向右删除词 | |
Ctrl + BackSpace | 向左删除词 | |
Ctrl + K + W | 将文本块写入文件 | |
Ctrl + K + R | 读入文本块 | |
Ctrl + K + C | 文本再制 | |
Ctrl + K + N | 代码转大写 | |
Ctrl + K + O | 代码转小写 | |
Ctrl + K + F | 代码转大写, 并取消选择 | |
Ctrl + K + E | 代码转小写, 并取消选择 | |
Ctrl + O + U | 改变光标后面的字母大小写 | |
Ctrl + Shift + I; Ctrl + K + I | 右移代码块 | |
Ctrl + Shift + U; Ctrl + K + U | 左移代码块 | |
Ctrl + I | 似Tab | |
Ctrl + M | 似Enter | |
Ctrl + N | 似Enter,但光标位置不变 | |
Ctrl + Enter | 打开光标所在单词的文件 | 光标在对象观察器时进入代码编辑 |
Alt + ]/[ | 查找本组定界符 | |
Ctrl + Shift + V | 把选定的字符声明为变量 | |
Ctrl + Alt + ↓ | 光标从声明区跳到代码区 | |
Ctrl + / | 注释与取消注释 | |
Ctrl + Shift + R | 录制(开始/停止)宏 | |
Ctrl + Shift + P | 播放宏 | |
Ctrl + Shift + T | 加入TO DO注释 | |
Alt + V + i | 打开 TO DO List | |
Ctrl + Shift + C | 类自动生成 | 可以反向 |
Ctrl + Shift + ↑/↓ | 从接口到实现; 到程序第一行 | |
Ctrl + Shift + G | 为接口加入新的GUID | |
Ctrl + Alt + PgUp | 第一个函数 | |
Ctrl + Alt + PgDn | 最后一个函数 | |
窗 口 控 制 类 | Shift + F12 | 查找窗体 | |
Alt + F12 | 窗体与窗体代码切换 | |
Ctrl + F12 | 查找模块 | |
Alt + F11 | 查找自定义uses模块 | |
Ctrl + F11 | 打开工程 | |
Ctrl + Alt + F11 | 打开或激活 Project manager | |
F12 | 代码窗口/窗体之间切换 | |
Ctrl + Alt + F12 | 已打开单元的列表 | |
F11 | 对象观察器/代码窗口/窗体切换 | |
Alt + 0 | 窗口列表 | |
Alt + PgUp/PgDn | Code/Design/History 切换 | |
Ctrl + Alt + F11 | 工程管理器 | |
Shift + Alt + F11 | 打开或激活 Structure | |
Ctrl + Alt + P | Tool Palette | |
Ctrl + Alt + L | Local Variables 窗口 | |
Ctrl + F5; Ctrl + Alt + W | Watch List 窗口 | |
Ctrl + Alt + T | Threads 窗口 | |
Ctrl + F7 | Evaluate/Modify 窗口 | |
Alt + F8 | Message 窗口 | |
Alt + 0 | Window List 窗口 | |
Ctrl + B | Buffer List 窗口 | |
Ctrl + Alt + B | Breakpoint 窗口 | |
Ctrl + F3; Ctrl + Alt + S | Call Stack 窗口 | |
Ctrl + Alt + V | Event Log 窗口 | |
Ctrl + Alt + F | FPU 窗口 | 调试时有效 |
Ctrl + Alt + C | CPU 窗口 | 调试时有效 |
Ctrl + Alt + M | Modules 窗口 | |
Ctrl + Shift + A | Find Unit 窗口 | |
Ctrl + Shift + F11 | Project Options 窗口 | |
Ctrl + Q + W | 到下一个信息窗口 | |
F10; Ctrl + F10 | 使菜单获得焦点 | |
Shift + F10; Alt + F10 | 同鼠标右键 | |
Ctrl + Down | 在对象观察器中, 下拉该窗体的组件列表 | |
Alt + Down | 在对象观察器中,下拉属性列表 | |
Tab + 输入 | 搜索对象观察器的属性或事件列表 | |
Ctrl + Enter | 在对象观察器中, 切换属性值 | |
Ctrl + Tab | 属性/事件切换; 在代码窗口中是已打开的窗口切换 | |
Shift + F11 | 添加工程窗口 | |
Ctrl + F4 | 关闭打开的窗口,但不关闭项目 | |
Alt + F4 | 关闭程序 | |
编 译 类 | F4 | 运行到光标位置 | |
F5 | 设置/取消断点 | |
F7 | 调试,进入子过程 | |
Shift + F7 | Trace into next source line | |
F8 | 调试,不进子过程(除非有断点) | |
Shift + F8 | Run until return | |
F9 | 运行 | |
Ctrl + F9 | 编译工程 | |
Shift + F9; Alt + P + B | 编译 DLL | |
Ctrl + Shift + F9 | Run without debugging | |
Ctrl + O + O | 插入编译选项 | |
ASCII值 | 控制字符 | 注释 |
---|
0 | NUT | |
1 | SOH | 标题开始 |
2 | STX | 正文开始 |
3 | ETX | 正文结束 |
4 | EOT | 传输结束 |
5 | ENQ | 询问字符 |
6 | ACK | 承认 |
7 | BEL | 报警 |
8 | BS(Backspace) | 退格 |
9 | HT | 横向制表 |
10 | LF | 换行 |
11 | VT | 垂直制表 |
12 | FF | 走纸控制 |
13 | CR(Enter) | 回车 |
14 | SO | 移位输出 |
15 | SI | 移位输入 |
16 | DLE | 空格 |
17 | DCI | 设备控制1 |
18 | DC2 | 设备控制2 |
19 | DC3 | 设备控制3 |
20 | DC4(Caps Lock) | 设备控制4(大写锁定) |
21 | NAK | 否定 |
22 | SYN | 空转同步 |
23 | ETB | 信息组传送结束 |
24 | CAN | 作废 |
25 | EM | 纸尽 |
26 | SUB | 换置 |
27 | ESC | 换码 |
28 | FS | 文字分隔符 |
29 | GS | 组分隔符 |
30 | RS | 记录分隔符 |
31 | US | 单元分隔符 |
32 | space | 空格 |
33 | ! | |
34 | " | |
35 | # | |
36 | $ | |
37 | % | |
38 | & | |
39 | ' | |
40 | ( | |
41 | ) | |
42 | * | |
43 | + | |
44 | , | |
45 | - | |
46 | . | |
47 | / | |
48 | 0 | |
49 | 1 | |
50 | 2 | |
51 | 3 | |
52 | 4 | |
53 | 5 | |
54 | 6 | |
55 | 7 | |
56 | 8 | |
57 | 9 | |
58 | : | |
59 | ; | |
60 | < | |
61 | = | |
62 | > | |
63 | ? | |
64 | @ | |
65 | A | |
66 | B | |
67 | C | |
68 | D | |
69 | E | |
70 | F | |
71 | G | |
72 | H | |
73 | I | |
74 | J | |
75 | K | |
76 | L | |
77 | M | |
78 | N | |
79 | O | |
80 | P | |
81 | Q | |
82 | R | |
83 | X | |
84 | T | |
85 | U | |
86 | V | |
87 | W | |
88 | X | |
89 | Y | |
90 | Z | |
91 | [ | |
92 | / | |
93 | ] | |
94 | ^ | |
95 | _ | |
96 | ` | |
97 | a | |
98 | b | |
99 | c | |
100 | d | |
101 | e | |
102 | f | |
103 | g | |
104 | h | |
105 | i | |
106 | j | |
107 | k | |
108 | l | |
109 | m | |
110 | n | |
111 | o | |
112 | p | |
113 | q | |
114 | r | |
115 | s | |
116 | t | |
117 | u | |
118 | v | |
119 | w | |
120 | x | |
121 | y | |
122 | z | |
123 | { | |
124 | | | |
125 | } | |
126 | ~ | |
127 | DEL | 删除 |
GroupBy的用法
Group By 是分组,当字段中有一样的记录时,用Group By 后,只会出现一条记录,这在做同类统计的时候特有效,
如:统计所有的大类销售,这时就必须用Group By
Select 酒水大类, Sum(价格) as [销售] From 点单表 Group By 酒水大类 Order By 销售
Decision控件
1,Delphi中提供了大量的决策图表控件
Decision->决策,决断
Cube->立方体
Chart->图表
Series->系列
TeeChart->T型图表
Gallery->图库
Axis->轴线
Gradient->渐变
Legend->图例 传奇
Delphi7中
TChart组件---------->Additional
TDBChart组件----------->Data Controls
Decision Cube组件组里有一整套
TVTChart->ActiveX
ChartFx->ActiveX
图表(Chart)组件的属性绝大多数一样,用法也一样
1,去掉Chart的3D效果 View3D->False
2,标题文字 Title->Text 有字体属性
3,底部文字 Foot->Text 有字体属性
4,去掉轴线->AxisVisible->false
5,BottomAxis RightAxis LeftAxis TopAxis->上下左右的坐标线
6,Frame->Mode->区域色与底色的模式
7,Frame->Style->边框样式
8,Gradient->渐变设置
9,很多属都可在双击Chart进行设置
10,MaxPointsPerPage->每页中容纳的最大数据量->如果为0则表示全部数据都装在一页中,当显示的数据较多时,要设这个属性,只有设了这个属性,才能把数据分页显示!
---------------------------------------------
设置这些就可以得到一个带渐变的Panel
------------------------------------------------------
如何动态增加一个图表?
注意:TChart, TDBChart只是一个图表的容器控件,继承自Panel,而真正的图表是一个不可视的类
-----------------------------------------------------------------------------------------
定义条型(反映不同数据的变化情况,如,每月,每天销售的各大类情况,哪类销售最多,那类销售最少)
var a:TBarSeries;
定义饼型(主要用于不同数据所占的比例,如销售中,各大类的销售情况)
var a:TPieSeries;
定义折线型(反映同一数据的变化,如每天,每月的销售变化, 这样可以看出,哪天,哪月的销售情况最好,最不好)
var a:TLineSeries
注意必须引用Series
如何给一个图表赋值并显示在Chart中???
procedure TForm1.Button2Click(Sender: TObject);
var
a:TLineSeries;
begin
a:=TLineSeries.Create(a);
Chart1.AddSeries(a);
a.AddArray([1,3,5,9,4,2])
end;
如何在已显示出来的图表中增加数据?
方法1
procedure TForm1.Button1Click(Sender: TObject);
begin
Chart1.Series[0].AddXY(12,20,'新加的',clLime);
//12->X轴的坐标 20->Y轴的坐标 Clime是颜色
end;
方法2
procedure TForm1.Button3Click(Sender: TObject);
begin
Chart1.Series[0].Add(14,'打印机',clTeeColor);
Chart1.Series[0].Add(18,'主板',clTeeColor);
Chart1.Series[0].Add(23,'显示器',clTeeColor);
end;
如何动态改变图表背景的渐变
procedure TForm1.Button4Click(Sender: TObject);
begin
Chart1.Gradient.Visible:=True;
Chart1.Gradient.EndColor:=clTeal;
Chart1.Gradient.StartColor:=clWhite;
end;
如何让数据块以不同颜色显示(除了TPieSeries是以不同颜色显示数据块外,其它的默认都是红色),并动态改变标题与页角及Y坐标的标题
procedure TForm1.Button5Click(Sender: TObject);
begin
Chart1.Series[0].ColorEachPoint:=True; //数据块不同色
Chart1.LeftAxis.Title.Caption:='产品销售表';//Y坐标标题
Chart1.Title.Text.Clear;
Chart1.Title.Text.Add('哪个月份的销售记录');//图表标题
Chart1.Foot.Text.Add('图表的说明文字'); //页脚内容
end;
效果如下:
数据太多了,想翻页显示怎么做?
1,设置Chart->MaxPointsPerPage(每页的最大数据量)->只有设置了这个置才可能分页,如果是0表示,全部数据都在一页上
2,可以使用点击左右坐标进行上下翻页也可以点击鼠标的左右键进行翻页
-----------------
procedure TForm1.Chart1ClickBackground(Sender: TCustomChart;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then Chart1.NextPage;
if Button=mbRight then Chart1.PreviousPage;
end;
如何标显特殊数据(当点特殊数据时以不同颜色进行显示)
procedure TForm1.Chart1ClickSeries(Sender: TCustomChart;
Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Series.ValueColor[ValueIndex]:=clRed;
end;
动态图表分析技术
DBChart
-------------------------------
动态图表的连接方式分2种
①手工方式连接数据库
②运用DBChart属性,在动行时动态连接数据库
---------------------------------------
1,DBChart对于数据是只图的,所以他连接数据库表,关不是直接挂连ACCESS组件,而是直接连接DataSet,Table,Query,ClientDataSet这样的数据集组件
2,首先要设好数据据组件的连接,再设置DBChart与数据组件连接
方法如下:
①双击DBChart->Series->设置标题,X的数据,Y(Bar)的数据
②,如果是在动行时设置是设置是设置DBChart的如下属性
DBChart->DataSet
DBChart->XLabelSource
DBChart->XValues
DBChart->YValues
----------------------------
procedure TForm1.Button3Click(Sender: TObject);
begin
DBChart1.Series[0].DataSource:=ADODataSet1;
DBChart1.Series[0].XLabelsSource:='酒水名称';
DBChart1.Series[0].XValues.ValueSource:='单价';//写的都是字段名称
DBChart1.Series[0].YValues.ValueSource:='单价';
end;
----------------------------------------
如何让DBChart自动更新数据显示
1,手动更新需设置DBChart->AutoRefresh->Rrue或False
2,自动更新设置DBChart->RefreshInterval的值,以秒为单位,每隔多少秒更新一次数据
如何刷新当前图表?
如果要刷新当前图表而不是所有图表,可以用DBChart->RefreshDataSet过程
如:
DBChart1.RefreshDataSet(ADOQuery1,DBChart.Series[0]);
DBGRID列描红(用于特殊数据行的显示,不因RowSelect->True而改变)
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure Drawnumber;
var
TextWidth:Integer;
TextHeigh:Integer;
begin
DBGrid1.Canvas.Brush.Color := clRed;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.Font.Color := clWhite;
//设置数据重画位置
TextWidth := DBGrid1.Canvas.TextWidth(Column.Field.AsString);
TextWidth := Rect.Left+(Rect.Right-Rect.Left)-TextWidth-3;
TextHeigh := DBGrid1.Canvas.TextHeight(Column.Field.AsString);
TextHeigh := Rect.Top+(Rect.Bottom-Rect.Top-TextHeigh) div 2;
DBGrid1.Canvas.TextOut(TextWidth,TextHeigh,Column.Field.AsString);
end;
procedure DrawText(Field:TField;Rect:TRect);
var
TextWidth:Integer;
TextHeigh:Integer;
Leng:Integer;
begin
Leng := DBGrid1.Columns[2].Width+1;
Rect.Right := Rect.Left;
Rect.Left := Rect.Left-leng;
DBGrid1.Canvas.Brush.Color := clRed;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.Font.Color := clWhite;
//设置数据重画位置
TextWidth := Rect.Left+1;
TextHeigh := DBGrid1.Canvas.TextHeight(Field.AsString);
TextHeigh := Rect.Top+(Rect.Bottom-Rect.Top-TextHeigh) div 2;
DBGrid1.Canvas.TextOut(TextWidth,TextHeigh,Field.AsString);
end;
begin
if (Drawing) and (DataCol = 3) and
(Column.Field.DataSet.FieldByName('Subject').AsString = ComboBox1.Text) then
begin
case ComboBox2.ItemIndex of
0:begin
if Column.Field.AsInteger > StrToInt(Edit1.Text) then
begin
Drawnumber;
DrawText(Column.Field.DataSet.FieldByName('Subject'),Rect);
end;
end;
1:begin
if Column.Field.AsInteger < StrToInt(Edit1.Text) then
begin
Drawnumber;
DrawText(Column.Field.DataSet.FieldByName('Subject'),Rect);
end;
end;
2:begin
if Column.Field.AsInteger = StrToInt(Edit1.Text) then
begin
Drawnumber;
DrawText(Column.Field.DataSet.FieldByName('Subject'),Rect);
end;
end;
end;
end
else
begin
DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;
procedure TForm1.GetSubject;
var
i:Integer;
begin
with DMFrm.ADOCommand do
begin
Active := False;
CommandText := 'Select Subject From StudentGrade_Tab Group By Subject';
Active := True;
ComboBox1.Clear;
for i:=0 to RecordCount-1 do
begin
ComboBox1.Items.Add(FieldByName('Subject').AsString);
Next;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
GetSubject;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if (ComboBox1.Text <> '') and
(ComboBox2.Text <> '') and
(Edit1.Text <> '') then
begin
Drawing := True;
DBGrid1.Refresh;
end;
end;
单条件多字段查询
procedure TForm1.ADODataSet1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var
i:Integer;
begin
if Edit1.Text = '' then
Exit;
Accept := False;
for i := 0 to DataSet.Fields.Count-1 do
begin
if Pos(UpperCase(Edit1.Text),UpperCase(DataSet.Fields[i].AsString)) > 0 then
begin
Accept := True;
Break;
end;
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
ADODataSet1.Filtered := False;
ADODataSet1.Filtered := True;
end;
建议在要频凡使用查询且数据集中的数据不是很大的情况下,用DataSet组件,或Tabe给组,把所有数据读到内存中,用过滤,或定位的方法查询数据
这样做的好处是快,不会像SQL那样,产生很多临时Buff文件,如果用SQL语句的方式,会很快的数据库增大.特别是ACCESS库,最后不得已,再去压缩库.
DBGRID标题排序上放↑
procedure TF_StockReport.FlatDBGrid1TitleClick(Column: TColumn);
var
TheTitleName:string;
begin
if DM.GoodsInfo.IsEmpty then Exit;
TheTitleName:=Column.Title.Caption;
if Pos('↑',TheTitleName)>0 then begin
DM.GoodsInfo.SQL.Clear;
DM.GoodsInfo.SQL.Add('Select * From 商品信息 Order By '+StringReplace(TheTitleName,'↑','',[rfReplaceAll]));
DM.GoodsInfo.Open;
Column.Title.Caption:=StringReplace(Column.Title.Caption,'↑','↓',[rfReplaceAll]);
end;
if Pos('↓',TheTitleName)>0 then begin
DM.GoodsInfo.SQL.Clear;
DM.GoodsInfo.SQL.Add('Select * From 商品信息 Order By '+StringReplace(TheTitleName,'↓','',[rfReplaceAll])+' DESC');
DM.GoodsInfo.Open;
Column.Title.Caption:=StringReplace(Column.Title.Caption,'↓','↑',[rfReplaceAll]);
end;
end;
------------------------------------------------------------------------------------
关联表查询
关联表查询有如下二种方法,
①内关联,
②外关联
关联表查询,首先有个条件,就是,二个表中必须要有一个字段的属性,与值是相同的,其核心思想,就是把二个表中有关系的数据合并成一个表
1,内关联
Select A.人员姓名,B.人员工资 From 表A(人员信息表),表B(工资表) Where A.人员编号=B.人员编号
B表中可以没有人员姓名,只有人员编号,这样得出的合并表为:人员表B中,人员编号改显为人员姓名
2,外关联
分为,左关联,右关联,全关联
①左关联 Lefe Join
左关联是以左侧数据表为基表(A它的数据全列出),以后每一行中的数据为条件,列出右表(B)中的数据 ,如果B中没有A表中的数据,将以Null代表B表中的数据
如:
Select A.人员姓名,B.人员工资 From 表A(人员信息表) Left Join B表(工资表) On A.工号=B.工号
说明,这里的 Left Join, Right Join 是以 Join这个关键字来区分那个表为基表
②全关联 Full Join这个最没意思 与 Select *,* From A,B Where A.ID=B.ID一样,做一个笛卡尔查询
共性,
这种的共性,
1,Select 后面必须要有二个表的字段 From 后面也必须 跟上二个表名,
2,内关联中,以Select 表字段的顺序 最好和 From 中的表顺序一样,这样,就以先写的表为基本进行查询
内关联表中有个优点,就是,B,中没有A中的条件时,A中的记录也不显出来
DoubleCat
SQL如何向应用程序发送消息?
RaisError('出错拉!来自SQL-Server',16,1)
这是的16表示级别,可以更改,1表示状态,可以更改,后面二个数,必须写!
这个函数,在结合触发器使用时,当库存少于多少,就向应用程序提出一个报警,很好用
当某些字段或值不许更改时,也可以向应用程序报告消息
SQL处理方案数据处理方案
数据处理方案分2种:
①应用程序数理处理方案,这种是数常用的,处理数据主要使用数据库控件及代码实现
②SQL数据处理方案,数据处理的大部分工作放在SQL服务器,使用触发器,存储过程等,应用程序主要向SQL服务器发送调用叁数
1,Delphi中能执行存储过程的控有二种
①StoredProc 这类组件BDE里有,DBG里有,DBExpress也有
②Query类型组件,同样,BDE里有,DBG里有,DBExpress里也有
Query,StroProc是调用有返回值和无返回值的都可以,StroProc用起来要比Query方便些,必竟他是专门用于执行存储过程的,它会自动读入存储过程所需要传入的叁数,
如果要执行有返回数据集的视图,只能用Query类的组件,其实视图与表的用法是一样的,Select * From 视图文件
如何用Query,StoredProc组件去执行一个存储过程呢?
下面是一个用存储过程增加记录的例子
存储过程代码如下:
--------------------------------------
CREATE PROCEDURE ADDMENU(@ID VARCHAR(10),@WINENAME VARCHAR(20)) AS
BEGIN
Set NoCount On
Insert Into 菜单 (酒水编号,酒水名称) Values (@ID,@WINENAME)
Set NoCount Off
END
GO
---------------用Query来执行是这样子的(必须动态传入叁数)------------------------------------------------
应用程序中用ADOQuery来执行这个存储过程(不要去给ADOQuery->Parameters设叁数名称)
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('ADDMENU;1:@ID,:@WineName');//存储过程名称后面加上(;1),后面跟的就是要传入的叁数
ADOQuery1.Parameters.ParamByName('@ID').Value := Edit1.Text;//为叁数赋值
ADOQuery1.Parameters.ParamByName('@WINENAME').Value := Edit2.Text;
ADOQuery1.ExecSQL;
end;
------------------用StroedProc是这样子的(可以动态也可以静态)--------------------------------------------------
ADOStoredProc1.Parameters.ParamByName('@ID').Value:=Edit1.Text;
ADOStoredProc1.Parameters.ParamByName('@WINENAME').Value:=Edit2.Text;
ADOStoredProc1.ExecProc;
----------------------------------------------------------------------------
再出一个例子
SQLServer如何建立内存表
Select * Into 内存表名 From 表
如
select * into #HaHa From 菜单 //建立内存表,如果后面加个Where 1=2的话,只在内存中建立一个表结构
select * from #HaHa //读取内存表
Drop Table #HaHa //删除内存表,否则只有等应用程序退出才会自动删除
SQL的触发器
触发器是什么?做什么用的?怎么用?
---------------------------------------------------------------------
1,触发器是附在表上,或视图上的一种特殊的存储过程,当表或视图发生,数据更新,增加数据,删除数据时自动执行的一个过程
2,触发器不用调用,它自动执行,它仅执行在SQL服务器上,不执行在DELPHI的应用程序中
-----------------------------------------------------------------------
如何创建触发器?
-------------------------------------------------------------------------
Create Trigger 触发器名 On 表名 For [Insert,Update,Delete] //使用中不要[]号,里面的内容可以选1个,也可以选3个中间用(,)隔开
语句
-----------特定的列不许更改-----------------------
如果更新酒水名称列,将回滚事务
-------------------------------------
CREATE Trigger TheDelete On 菜单 For Delete,Update,Insert As
if Update(酒水名称) RollBack Transaction
-------------------------------------
----------------------特定行中的特中值不可更改-----------------------
Declare @TheID Char(10)
Select @TheID = 酒水编号 From Deleted
if @TheID = '1805' begin
RollBack Transaction
end
-----------------------------------------------------------------
其实这二个事务可以写在一起,代码如下
-------------------------------------------------
CREATE Trigger TheDelete On 菜单 For Delete,Update,Insert As
if Update(酒水名称) RollBack Transaction
Declare @TheID Char(10)
Select @TheID = 酒水编号 From Deleted
if @TheID = '1805' begin
RollBack Transaction
end
-----------------------------------------------------
触发器的另一种应用就是当更改某列的值时,触发另一个表的计算工作,或本表的计算工作.
如:当销售数量更变时,自动减少库,并计算库存金额可以用下面的变通方法
触发器代码如下
-------------------------
CREATE Trigger TheDelete On 菜单 For Delete,Update,Insert As
if Update(单价) begin
Update 菜单 Set 单价 = 单价*2 Where 单价=(Select 单价 From Inserted)
end
--------------------------
----------------------------------------------------------------------
对上表的代码做个说明
---------------------------------
事实上,SQL-Server2000会为每个触发器创建2个专用表①Deleted表②Inserted表,他们存放在内存中,它们保存着变更记录的原始数据信息(所有字须都保存),这二个表的结构总是与触发器作用的表结构相同,当触发器用完成时,与这个触发器相关的内存表Deleted表与Inserted就会自动删除,
①Deleted表:如果是Insert触发器,当Delete操作发生时,表中存放着要删除的数据行,如果是Update触发器,当进行Update操作时,表中存放着更新前的记录行
②Inserted表:如果是Insert触发器,当Insert操作发生时,表中放着待Insert的新数据行,如果是Update触发器,当进行Update操作时,表中存放着更新后的记录行
注意,没有Updated这个内存表!
------------------------------------------
DoubleCat
SQL的游标
什么是游标?游标是做什么用的?怎么用?
-----------------------------------------------------------------------------------------------
1,其实Select 返回的结果集是一个数据表视图,这个视图是没有记录指针的,如果要改变其中的值,只能对这个视图中的数据全体改变
游标,本质上就是数据视图的记录指针
如,A表中价格字段中,大于20的全部打9折,小于20的,打8折,怎么办呢?
二种办法
①用DDL语句
Update 菜单 Set 单价=单价*0.8 Where 单价<20
Update 菜单 Set 单价=单价*0.9 Where 单价>20
②用Select 语句采用游标
代码如下
declare @Price Money//定义变量
Declare TheCursor Cursor For Select 单价 From 菜单 For Update Of 单价//这里定义这个游标是在哪个视图上是做什么用的?
Open TheCursor//打开游标
Fetch From TheCursor InTo @Price //取游标中的数据,(取记录指针所指的整条记录)
While @@Fetch_Status =0 //如果记录指针没到尾部
begin
if @Price<20 begin
Update 菜单 Set 单价=@Price*0.8 Where Current Of TheCursor //更新当前记录指针所指的数据
end
if (@Price>20) and (@Price<100) begin
Update 菜单 Set 单价=@Price*0.9 Where Current Of TheCursor
end
Fetch Next From TheCursor InTo @Price//记录指针向下走一行
end
Close TheCursor//关掉记录指针(关闭游标)
DeAllocate TheCursor//释放游标
-------------------------------------------------------------------------------------------------
1,记住,游标是附在数据视图上的,就像记录指针附在数据表视图上一样
2,使用视图是件很麻烦的事情,虽然他一次可以全搞定,而用DDL语句要二次才搞定,其实用DDL语言也可以一次搞定
Update 菜单 Set 单价=单价*0.8 Where 单价 Between 1 and 20 or 单价 between 21 and 100
-------------------------------------
DoubleCat
Select语句
1,选择部份列
Select 列,列 From 表
注意,最后一列不要加','号
----------------------------------------
2,产生新的空列
Select '空列',列 From 表
注意:空列要用引号引起来,默认的情况下,列值与列名同
如:select '空列'='Hello' From 菜单
---------------------------------------------
3,相同数据类型的列可以加起来
如
Select 列+列 From 表
这样会产生一个新列,列值为二个列加来,可以字串,也可以数字
--------------------------------------------------
4,更改列名
select 新列名=旧列名, 新列名=旧列名 From 表
或
Select 旧列名 As 新列名, 旧列名 As 新列名 From 表
---------------------------------------------------------------
5,不显示重复行
Select Distinct * From 表
6,列出前多少行
Select TOP 100 * From 表 TOP后面最大为4294967295=DWORD=Cardinal
也可以这样,前5行,且不重复
select Distinct Top 5 * From 菜单
注意:多开关中间用空格隔开
------------------------------------------------------------------
7,查询介于某一范围内的数据
Select * From 表 Where 字段 Between 50 And 100
注意:可以查询数字,也可以查询字串,一般Between后写较小的, And 后面写较大的
----------------------------------------------------------------------
在这里也可以于>= <= <>等罗辑表达式
-----------------------------------------------------------------------------
8,IN 条件,用于查询属于某集合的数据
Select * From 表 Where 字段 In (11,22,33,100)
当然也可以用字串字段,In条件用于多条件选择查询是有特效,比字段=值好用
-------------------------------------------------------------------------------
9,Like条件
Select * From 表 Where 字段 Like '%-----%';
Select * From 表 Where 字段 Not Like '%-----%';
注意: Like后面是一个单引号引起的字串
----------------------------------------------------------------------------
10.多表关联查询
Select Distinct 帐单表.帐单号,点单表.酒水名称,点单表.数量,点单表.价格 From 帐单表,点单表 Where 帐单表.帐单号 = 点单表.帐单号 and 点单表.价格>30 Order by 帐单表.帐单号
这里是有条件的,
1,表 A 与 表 B 必须要有一个字段类型是一样的,且有相同的数据,
查询中,最少有一个是A表的字段,有一个是B表的字段
这样的结果是,产生一个,动态传入SQL语句的主从表合集,
Where 条件中,把相等的字段关联起来
------------------------------------------------------------------------------
11,Order By 子句
Order By 可以对多列进行排序,列之间用(,)隔开,默认是ASC(升序排列),如果要用DESC(降序)要用工指定
----------------------------------------------------------------------------------
12.Group By 分组子句
很少使用Group By,
Group By的作用是:把From 子句(前面的列名)中的关系按分组属性划分为若干组,同一组内所有记录在分组属性上具有相同的值.用Gropu By + Having 可以不使用 Where 条件语句
如:
Select A,B,C,D From 表 Goup By A,B,C,D Having D='Hello';
如果这个语句中不用Group 那么Having 相当于Where
-------------------------------------------------------------------------------------------
13,Select InTo
如:
Select * InTo A From B Where 1=2;
这样A表的数据结构与B是一样的,A表无记录
-------------------------------------------------------------------------------
14,删除表
Drop Table A
------------------------------------------------------------------------------
15,嵌套Select
原理,Select 本身就是从数据集或数据视图上产生一个数据视图,
Select (Select 字段 From A表 Where 唯一条件) 列名,(Select 字段 From B表 Where 唯一条件) 列名 (这后面不要加 Where条件)
这样就从A表,B表中的2个列产生一个新表且只有一条记录,(注意,子查询中的记录必须是唯一)
如:
select (Select col002 from temp2 where col001='350000') 省 ,(Select Col002 From Temp2 where col001='350400') 市 ,(Select Col002 From Temp2 where col001='350429') 区
SQL-Server2000的存储过程
SQL-Server2000是有函数的,不过仅限于自定义函数和系统函数,要让Delphi使用SQL-Server2000中的方法必须写成存储过程,存储过程,其实指的就是用自定义的方法,当然可以有返回值,也可以没有返回值.
函数的写法
CREATE Function aa (@a int , @b int) Returns int As//这里是Returns 不是Return
begin
Return @a + @b //这里才是Return
end//不要在这里加分号
---------------------------------------------------
存储过程的写法(带输入叁数与返回值)
CREATE PROCEDURE HaHa (@a int , @b int, @c int OutPut) //叁数表用()号引起来,叁数表中默认是进叁
AS //如果要做输出叁数 必须在叁数后面加上
begin //OutPut
Select @c = @a + @b //存储过程的赋值是用Select方法赋值
end
GO
------------------------------------------
调用这个过程的方法
1,DBG->ADOStoredProc1设置好它的连接
2,ADOStoredProc1->ProcedureName设置他要执行的存储过程名,设好后,ADOStoredProc1->Parameters属
性中自动会把存储过程的使用到的参数读过来
Delphi中的为存储过程的入叁赋值及取出叁的值代码如下
---------------------------------------------------------------
ADOStoredProc1.Parameters.ParamByName('@a').Value:=12;
ADOStoredProc1.Parameters.ParamByName('@b').Value:=13;
ADOStoredProc1.ExecProc;
ShowMessage(IntToStr(ADOStoredProc1.Parameters.ParamByName('@c').Value));
---------------------------------------------------------------
下面是一个用SQL-Server2000的存储过程取得SQL-Server2000服务器的时间,这个方法,在做时间同步时很有用,如所有工作站都要同步成一个时间,无论在局哉网软件中还是C/S软件中,都有很广的用途
存储过程的写法如下
---------------------------
CREATE PROCEDURE GetServerDateTime ( @DateTime DateTime OutPut) AS
begin
Select @DateTime=GetDate()
end;
GO
------------------------------
调用的方法如下
-------------------------------
//---这是一个同步SqlServer服务器的时间,使用有工作站都和服务器同一日期时间
procedure TDM.SynchronizationDateTime;
var
TheServerDateTime:TDateTime;//定义服务器时间
TheLocalDateTime:_SystemTime;//定义本地系统时间
Year,Month,Day:Word;//定义年月日
Hour,Min,Sec,MSec:Word;//定义时分秒毫秒
begin
Synchronization.ExecProc;
TheServerDateTime:=Synchronization.Parameters.ParamByName('@DateTime').Value;
DecodeDate(TheServerDateTime,Year,Month,Day);//分解服务器年月日
DecodeTime(TheServerDateTime,Hour,Min,Sec,MSec);//分解服务器时间
//-------设定本地系统时间
TheLocalDateTime.wYear:=Year;
TheLocalDateTime.wMonth:=Month;
TheLocalDateTime.wDay:=Day;
TheLocalDateTime.wHour:=Hour;
TheLocalDateTime.wMinute:=Min;
TheLocalDateTime.wMilliseconds:=MSec;
SetlocalTime(TheLocalDateTime);//更改本地系统时间
end;
-------------------------------
注意:存储过程只能执行DDL语句,如果要返回数据集结果就不能用存储过程,存储过程的最大用处是对整个数据表中的数据进行调整.
SQL中的数据类型
字符
①Char->固定长度非UNICODE字符最大8000字符
②NChar->固定长度UNICODE最大4000字符
③VarChar->可变长度非UNICODE字符最大8000字符
④NVarChar->可变长度UNICODE最大4000字符
-------------------------------------------------------
文本
①Text,NText->文本,Memo用
-----------------------------------------------------
图像
Image
-----------------------------
Int->整型
SmallInt->-32767-32768
TinyInt->0..255
BigInt=Int
Real实数
Float浮点>Real
Decimal(number)->整型<Int
Money->货币
-----------------------------------------
日期
DateTime->日期/时间(精确到3.33毫秒)
SmallDateTime->日期/时间(精确到分钟)
SQL函数
STR->把日期,数字等字段,转为字串字段
如
select Str(单价,8,2) from 点单表
1,8->长度
2,2->2位小数
当然也可以
select Str(单价) from 点单表
这样无小数位数,长度默认为10
Convert()->转换函数,当然它不只是转成字串也可以转成其它的
如:
Select Convert(varchar(10),GetDate(),20);
--------------------------------------------
select Convert(varchar(10),单价,3) from 菜单
LEFT->返回字串字段左边的个数,
如:
select LEFT(拼音,2) from 菜单
这里的2表示返回字符的个数为2个,如果是中文返回二个汉字
RIGHT->返回字段字串右边字符个数,在做身份证后6位为密码时特有效用法与LEFT一样
LEN->返回字串字段的长度,不算右边空格,汉字为汉字个数,字个在做统计字数,或接字数查找有特效
如:
select *, 拼音长度=LEN(拼音) from 菜单
注意:*号与新字段(拼音长度)中间用','隔开
REVERSE->把字串字段中的字串,按字符反转->ABC变为CBA,我一般把它用于简单的加密,如把用户名,反转后,再计算注册码符不符
如:
select *, REVERSE(拼音) from 菜单
LOWER
UPPER
把字串字段中的字符转成大字或转成小写
如:把整个字段中的字符全部转成小写
Update 菜单 Set 拼音=LOWER(拼音)
LTrim->去掉字串字段左边的空格
RTrim->去掉字串字段的右边空格,这个在应用程序中常用,否则,出现右边出现大量空格
注意:没有Trim函数,
SQL中如何定义变量?
Declare @变量名 数据类型
给变量赋值方法如下
Set @变量名 = 值
如:
declare @i int;这里的';'号(行结束符可有可无)
set @i = 12;
select @i;//用Select 显示出来
-----------------------------------------------------
declare @s Varchar(20)
set @s = 'Hello Word'
select @s
-------------------------------------------------
Power->次方
如
select power(4,5)
--------------------------
ABS->绝对值
如:
select ABS(-12.4)
--------------------------
PI->圆周率
---------------------------
FLOOR->不大于某数的最小整数
---------------------------------------
SQUARE->开平方
---------------------------------------
GetDate()->返回当前日期,除Delphi外,函数名后面必须带()号
---------------------------------------------------------------------
SQL-Server的数据文件
一个SQL-Server数据库至少需要二个文件
1,MDF文件->存放数据库表,索引,存储过程,游标,触发器等数据库对像信息,我叫他主数据文件
MDF=MastDataFile
2,LDF文件->存放数据库事务日志
LDF=LogDataFile
DoubleCat
SQL聚合函数
AVG->求平均值
Select 新列名=AVG(数值字段) From 表
注意:Select 后面不要加 * 号
如:
select AVG=AVG(单价) from 点单表
重复的值只计算一次的方法
如:
select AVG=AVG(DISTINCT 单价) from 点单表
注意:DISTINCT与字段名之间要用空格隔开
同样在Select 语句中也可以使用 DISTINCT 条件
注意:使用聚合函数Select 后面一律不加*号
SUM->它的用法与AVG一样,只是用于统计数字字段的和
COUNT->也可以用DISTINCT 用于统计有多少条记录
MIN MAX->用于求数字字段中的最小值与最大值
DoubleCat
更改记录(更新已存在的记录数据)
Update 表名 Set字段名=值,字段名=值 Where 条件表达式 and 条件表达式
注意:
1,Update 后面不要加*号
2,必须指定条件表达式,否则,整个字段中的值将会全部被改掉
3,要更改的字段用 字段名=字段值 的方式,更改多字段中间用','号隔开
如:
update 点单表 Set房台名称='天津',酒水名称='Haha' Where 房台名称='重庆' and 酒水名称='水果圣代'
DoubleCat
删除指定记录
Delete From 表名 Where 条件表达式
注意:
1,必须加条件表达式,否则,删除所有记录
2,Delete 后面不要加*,也不要加字段名称
只有Select语句才要指定字段名称,其它的都不要
DoubleCat
清空表
1,Truncate Table 表名 (注意这里要写上Table)
2,Delete From 表名
(注意表名后面不要加条件语句Where)
(Delete 后面不要加* Select 后面必须加*)
对表的清空,Truncate Table 表名 要比 Delete From 表名 更有效
DoubleCat
Insert增加数据
Insert Into 表名 (字段名,字段名) Values (值,值)
在这里Into可以写也可以不写,列名与列值都得用()号包含起来,中间用Values隔开,
最少要一个列与一个列值,字串值要用引号引起来
如:
insert 帐单表 (帐单号,房台名称) values (1001,'重庆')
DoubleCat QQ:28088191
书签ToDo与代码定位
每次开发前应该有个计划先建立程序框架,先做什么、后做什么;最后检查完成情况。
定义ToDo ->Ctrl+Shift+T
打开ToDo列表->Alt+V+I
书签的作用是当代码很长,在书写时,又跑去定义全局变量或申明数据类型时,让你快速回到原来的编写处
定义书签->Ctrl+Shift+数字
定位书签->Ctrl+数字
方法的定义部份与方法实现部份切换
Ctrl+Shift+↑或↓
Ctrl+空格->显示类变量的成员信息
Ctrl+J->叫出代码模板
Ctrl+Shift+U->代码块前移Tab位
Ctrl+Shift+I->代码块后移Tab位
Pchar与String的区别
PChar 串是以 Null 结束的, 或者说是以 "空字节" 结束的;
PChar 串见到 "空字节" 就认作结束了;
"空字节" 在 Delphi 中可以用 #0 或 Chr(0) 来表示.
//举例:
var
pc: PChar;
begin
pc := 'ABCD' + #0 + 'EFGHIJKLMNOPQRSTUVWXYZ';
ShowMessage(pc); {ABCD}
end;
raise抛出异常
//例1:
begin
raise Exception
.Create(
'抛出异常');
end;
//例2:
begin
raise Exception
.CreateFmt(
'%s %d', [
'错误代码:',
999]);
end;
//例3:
var
exc: Exception;
begin
exc := Exception
.Create(
'发现异常');
raise exc;
end;
GoTo语法
procedure TForm1.Button1Click(Sender: TObject);
var
x: Integer;
label n1,n2,n3,4; //goto的标签可以是标识符, 也可以是0..9999的数字
begin
x := 0;
goto n3;
n1: x := x+1;
n2: x := x+2;
n3: x := x+3;
4: x := x+4;
ShowMessage(IntToStr(x)); //返回7而不是10
end;
其实Case语句本质上就是GoTo语句
DupeString重复字串 与StringOfChar的区别
StringOfChar 是反复 "字符" 成 "字符串" 的函数;
DupeString 是反复 "字符串" 成 "新字符串" 的函数;
StringOfChar 来自 System 单元, 可以直接使用;
DupeString 来自 StrUtils 单元, 使用时需要 uses StrUtils;
如果仅仅是反复 "字符", 当然应该用 StringOfChar , 它是用汇编代码实现的, 速度会稍好一些.
下面是测试代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses StrUtils; {DupeString 来自这个单元}
procedure TForm1.FormCreate(Sender: TObject);
var
str: string;
begin
str := System.StringOfChar('A', 5);
ShowMessage(str); {AAAAA}
str := StrUtils.DupeString('A', 5);
ShowMessage(str); {AAAAA}
str := StrUtils.DupeString('ABC', 5);
ShowMessage(str); {ABCABCABCABCABC}
end;
{如果只是反复字符, StringOfChar 肯定会更快一些; 速度测试:}
procedure TForm1.Button1Click(Sender: TObject);
var
t1,t2: Cardinal;
i: Integer;
begin
t1 := GetTickCount;
for i := 0 to 1000000 do DupeString('A', 5);
t1 := GetTickCount - t1;
t2 := GetTickCount;
for i := 0 to 1000000 do StringOfChar('A', 5);
t2 := GetTickCount - t2;
ShowMessageFmt('DupeString: %d; StringOfChar: %d', [t1,t2]);
end;
end.
For循环
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
List: TStringList;
procedure TForm1.FormCreate(Sender: TObject);
begin
List := TStringList.Create;
List.Add('aaa');
List.Add('bbb');
List.Add('ccc');
List.Add('ddd');
end;
// for 循环的一般用法
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
s: string;
begin
for i := 0 to List.Count - 1 do
begin
s := List[i];
ShowMessage(s);
end;
end;
//还有这样用的
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
s: string;
begin
for i := 0 to Pred(List.Count) do
begin
s := List[i];
ShowMessage(s);
end;
end;
//还是 for in 最方便
procedure TForm1.Button3Click(Sender: TObject);
var
s: string;
begin
for s in List do
begin
ShowMessage(s);
end;
end;
//反向
procedure TForm1.Button4Click(Sender: TObject);
var
i: Integer;
s: string;
begin
for i := List.Count - 1 downto 0 do
begin
s := List[i];
ShowMessage(s);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
List.Free;
end;
end.
DoubleCat QQ:28088191