Delphi编程

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) +'#';


posted @ 2008-06-13 22:21 DoubleCat 阅读(23) | 评论 (0) | 编辑

打开网页

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;

posted @ 2008-06-13 21:53 DoubleCat 阅读(73) | 评论 (0) | 编辑

With语句创建窗体

//一般写法
var
  MyForm1: TForm1;
begin
  MyForm1 := TForm1 .Create( nil);
  MyForm1 .ShowModal;
  MyForm1 .Free;
end;



//用 with 语句重写
with TForm1 .Create( nil) do begin
  ShowModal;
  Free;
end;

posted @ 2008-06-13 21:51 DoubleCat 阅读(30) | 评论 (0) | 编辑

获取所有汉字与 Unicode 的对照表

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;

posted @ 2008-06-13 21:50 DoubleCat 阅读(53) | 评论 (0) | 编辑

调用Windows的About框

uses ShellAPI;
procedure TForm1.AbortClick(Sender: TObject);
begin
ShellAbout(0, 'MySoft', 'Copyright (c) 2007-2008', Application.Icon.Handle);
end;

posted @ 2008-06-13 21:42 DoubleCat 阅读(18) | 评论 (0) | 编辑

代码折叠

{$REGION '我的函数'}
...
{ENDREGION}

posted @ 2008-06-13 21:38 DoubleCat 阅读(49) | 评论 (0) | 编辑

Delphi注释

①{...}
②(*...*)
③//...
④{$IFDEFF DONTCOMPILEME}...{$ENDIF}

posted @ 2008-06-13 21:35 DoubleCat 阅读(108) | 评论 (0) | 编辑

Delphi的快截键

分类 快捷键 解释 备注





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 插入编译选项  

posted @ 2008-06-13 21:28 DoubleCat 阅读(26) | 评论 (0) | 编辑

ASCII 码对照表

 
 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 删除

posted @ 2008-06-13 21:25 DoubleCat 阅读(43) | 评论 (0) | 编辑

GroupBy的用法

GroupBy的用法

 


 

Group By 是分组,当字段中有一样的记录时,用Group By 后,只会出现一条记录,这在做同类统计的时候特有效,

如:统计所有的大类销售,这时就必须用Group By

 


 

Select 酒水大类, Sum(价格) as [销售] From 点单表 Group By 酒水大类 Order By 销售

Delphi编程_第1张图片

posted @ 2008-06-13 16:54 DoubleCat 阅读(76) | 评论 (0) | 编辑

Decision控件

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;


 

效果如下:

Delphi编程_第2张图片

 

 


 

数据太多了,想翻页显示怎么做?

 


 

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)的数据

Delphi编程_第3张图片

②,如果是在动行时设置是设置是设置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;

----------------------------------------

Delphi编程_第4张图片

如何让DBChart自动更新数据显示


 

1,手动更新需设置DBChart->AutoRefresh->Rrue或False

2,自动更新设置DBChart->RefreshInterval的值,以秒为单位,每隔多少秒更新一次数据

 


 

如何刷新当前图表?


 

如果要刷新当前图表而不是所有图表,可以用DBChart->RefreshDataSet过程

如:

DBChart1.RefreshDataSet(ADOQuery1,DBChart.Series[0]);

 


posted @ 2008-06-13 16:47 DoubleCat 阅读(308) | 评论 (0) | 编辑

DBGRID列描红

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;


 

Delphi编程_第5张图片

posted @ 2008-06-13 16:38 DoubleCat 阅读(39) | 评论 (0) | 编辑

单条件多字段查询

单条件多字段查询

 


 

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库,最后不得已,再去压缩库.


posted @ 2008-06-13 16:33 DoubleCat 阅读(92) | 评论 (0) | 编辑

DBGRID标题排序上放↑

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;
------------------------------------------------------------------------------------

posted @ 2008-06-13 16:31 DoubleCat 阅读(162) | 评论 (0) | 编辑

关联表查询

关联表查询


 

关联表查询有如下二种方法,

①内关联,

②外关联

关联表查询,首先有个条件,就是,二个表中必须要有一个字段的属性,与值是相同的,其核心思想,就是把二个表中有关系的数据合并成一个表

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

posted @ 2008-06-13 16:30 DoubleCat 阅读(85) | 评论 (0) | 编辑

SQL如何向应用程序发送消息?

SQL如何向应用程序发送消息?


 

  RaisError('出错拉!来自SQL-Server',16,1)

这是的16表示级别,可以更改,1表示状态,可以更改,后面二个数,必须写!


 

这个函数,在结合触发器使用时,当库存少于多少,就向应用程序提出一个报警,很好用

当某些字段或值不许更改时,也可以向应用程序报告消息

posted @ 2008-06-13 16:29 DoubleCat 阅读(48) | 评论 (0) | 编辑

SQL处理方案数据处理方案

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;
----------------------------------------------------------------------------

 

 

再出一个例子

 

 

 

 

 

posted @ 2008-06-13 16:28 DoubleCat 阅读(55) | 评论 (0) | 编辑

SQLServer如何建立内存表

SQLServer如何建立内存表

 
   

Select * Into 内存表名 From 表

 


 

 


 

select * into #HaHa From 菜单  //建立内存表,如果后面加个Where 1=2的话,只在内存中建立一个表结构
select * from #HaHa  //读取内存表
Drop Table #HaHa  //删除内存表,否则只有等应用程序退出才会自动删除

 


 

 

 

posted @ 2008-06-13 16:28 DoubleCat 阅读(172) | 评论 (0) | 编辑

SQL的触发器

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

posted @ 2008-06-13 16:27 DoubleCat 阅读(53) | 评论 (0) | 编辑

SQL的游标

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

 

posted @ 2008-06-13 16:26 DoubleCat 阅读(42) | 评论 (0) | 编辑

Select语句

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')  区

posted @ 2008-06-13 16:25 DoubleCat 阅读(67) | 评论 (0) | 编辑

SQL-Server2000的存储过程

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语句,如果要返回数据集结果就不能用存储过程,存储过程的最大用处是对整个数据表中的数据进行调整.

posted @ 2008-06-13 16:24 DoubleCat 阅读(114) | 评论 (0) | 编辑

SQL中的数据类型

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)->整型

Money->货币

-----------------------------------------

日期

DateTime->日期/时间(精确到3.33毫秒)

SmallDateTime->日期/时间(精确到分钟)

posted @ 2008-06-13 16:24 DoubleCat 阅读(16) | 评论 (0) | 编辑

SQL函数

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外,函数名后面必须带()号

---------------------------------------------------------------------

posted @ 2008-06-13 16:23 DoubleCat 阅读(34) | 评论 (0) | 编辑

SQL-Server的数据文件

SQL-Server的数据文件

 


 

一个SQL-Server数据库至少需要二个文件

1,MDF文件->存放数据库表,索引,存储过程,游标,触发器等数据库对像信息,我叫他主数据文件

MDF=MastDataFile

2,LDF文件->存放数据库事务日志

LDF=LogDataFile

 


 

DoubleCat

posted @ 2008-06-13 16:21 DoubleCat 阅读(10) | 评论 (0) | 编辑

SQL聚合函数

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

posted @ 2008-06-13 16:21 DoubleCat 阅读(315) | 评论 (0) | 编辑

SQL更改记录

更改记录(更新已存在的记录数据)

 


 

Update 表名 Set字段名=值,字段名=值 Where 条件表达式 and 条件表达式

注意:

1,Update 后面不要加*号

2,必须指定条件表达式,否则,整个字段中的值将会全部被改掉

3,要更改的字段用 字段名=字段值 的方式,更改多字段中间用','号隔开

如:

update 点单表 Set房台名称='天津',酒水名称='Haha' Where 房台名称='重庆' and 酒水名称='水果圣代'

 


 

DoubleCat

posted @ 2008-06-13 16:20 DoubleCat 阅读(126) | 评论 (0) | 编辑

删除指定记录

删除指定记录

 


 

Delete From 表名 Where 条件表达式

注意:

1,必须加条件表达式,否则,删除所有记录

2,Delete 后面不要加*,也不要加字段名称

只有Select语句才要指定字段名称,其它的都不要

 


 

DoubleCat

posted @ 2008-06-13 16:18 DoubleCat 阅读(31) | 评论 (0) | 编辑

清空表

清空表

 


 

1,Truncate Table 表名  (注意这里要写上Table)

2,Delete From 表名    

 (注意表名后面不要加条件语句Where)

(Delete 后面不要加* Select 后面必须加*)

 


 

对表的清空,Truncate Table 表名 要比 Delete From 表名 更有效

 


DoubleCat

posted @ 2008-06-13 16:17 DoubleCat 阅读(58) | 评论 (0) | 编辑

Insert增加数据

Insert增加数据


 

Insert Into 表名 (字段名,字段名) Values (值,值) 

在这里Into可以写也可以不写,列名与列值都得用()号包含起来,中间用Values隔开,

最少要一个列与一个列值,字串值要用引号引起来

如:

insert 帐单表 (帐单号,房台名称) values (1001,'重庆')

 


 

DoubleCat QQ:28088191

posted @ 2008-06-13 16:16 DoubleCat 阅读(24) | 评论 (0) | 编辑

ToDo及代码定位的使用

书签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位

 



posted @ 2008-06-13 16:12 DoubleCat 阅读(37) | 评论 (0) | 编辑

Pchar与String的区别

Pchar与String的区别


 


PChar 串是以 Null 结束的, 或者说是以 "空字节" 结束的;

PChar 串见到 "空字节" 就认作结束了;

"空字节" 在 Delphi 中可以用 #0 或 Chr(0) 来表示.
 
   
//举例:
var
pc: PChar;
begin
pc := 'ABCD' + #0 + 'EFGHIJKLMNOPQRSTUVWXYZ';
ShowMessage(pc); {ABCD}
end;

posted @ 2008-06-13 16:11 DoubleCat 阅读(600) | 评论 (0) | 编辑

raise抛出异常

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;

posted @ 2008-06-13 16:10 DoubleCat 阅读(448) | 评论 (0) | 编辑

GoTO语句

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语句

posted @ 2008-06-13 16:09 DoubleCat 阅读(110) | 评论 (0) | 编辑

DupeString重复字串 与StringOfChar的区别

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.

posted @ 2008-06-13 16:09 DoubleCat 阅读(95) | 评论 (0) | 编辑

For循环

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

posted @ 2008-06-13 16:08 DoubleCat 阅读(92) | 评论 (0) | 编辑

你可能感兴趣的:(Delphi编程)