Delphi 编程基础
通过例题掌握 Delphi 编
程的思路
对象 PASCAL基本结构
? Delphi 是面向对象和事件驱动的,过去
那种自上而下的结构化方法已不适应在
Delphi 中编程。
? OP 的 一个程序是由一个 Program程序单
元和若干可选的子程序单元组成。
? 在 Delphi 中 Program程序单元就是它的项
目文件。
? 子程序单元就是 Delphi 的单元文件
Program project1;
uses
forms;
unit1 in unit1.pas ;
{$R *.RES}
begin
… …
end.
项目文件
在 Delphi 中,程序员
几乎不 接触
Program单元
单元的含义
? 单元是复用 技术的体现。单元为开发人
员提供了一种方法,来创造一套子例程,
并将它们封装在一个代码块中,经过编
译而供他人使用。
? 在 Interface中公开了本单元的意图,
在 Implementation中实现在 Interface中
,通告”的内容。
? 由于可以将大多数应用程序的功能分成
组,所以引入支持这种概念的编程模型
是合乎情理的。
单
元
unit Unit1;
interface {所定义的内容, 可为其他项目利用 }
uses <引用单元列表 >
type
var 说明部分
procedure / function
implementation
uses <引用单元列表 >
说明部分 {内部公共说明 }
procedure {在 interface中声明的,
function 也可定义内部过程与函数 }
initialization {初始化程序代码, 可选 }
finalization {结束处理代码, 可选 }
end,{ 单元结束 }
单
元
}
}
interface
uses
Windows,Messages,SysUtils,Classes,
Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
单
元
Type
Tdays=(mon,tue,wed,thu,fri,sat,sun);
TForm1 = class(TForm)
Button1,TButton;
procedure Button1Click(Sender,TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Temp =class(tobject) 自定义对象
name,string[10];
sal,integer;
function total, integer;
end;
单
元
窗体对象
? 对象与记录相似之处是都包含数据域,
但对象还包括方法,即操作对象数据的
方法。
? 在 Delphi 中编写的所有事件处理程序都
是窗体对象的方法。
? 可以在 Public和 private中添加新的数据域
和方法。
单
元
var
Form1,TForm1;
emp:Temp;
key, Boolean ;
单
元
interface {所定义的内容,可为其他项目利用 }
uses <引用单元列表 >
type
var
Function verify(sno:integer;sname:string):boolean;
implementation
单
元
implementation
{$R *.DFM}
uses
var 仅供单元内部使用
function Temp.total,integer;
begin
total:=emp.sal*12;
end;
procedureTForm1.Button1Click(Sender:TObject);
begin
emp.sal:=10 ;
showmessage(inttostr(emp.total));
end;
end.
单
元
}
Project1
Unit1
Unit2
Procedure2
Procedure3
Procedure1
Procedure4
Procedure5
Procedure6
变
量
作
用
域
Initialization
begin
emp:=temp.create;
end;
finalization
begin
emp.free;
end;
end.
单
元
常用运算符
? 算术运算符 + - * / div(整除〕 mod
? 字符串运算符 +
? 集合运算符 + - * in
? 对象类型判别 is
? 例:
procedure Tform1.cclick(sender:Tobject);
Begin
if sender is Tbutton then
Tbutton(sender).Height:=50;
end;
对象
属性 - 状态信息
方法 - 动作信息
事件 - 对象之间传递的信息
?事件就是对象之间传递的信息
?而对象具有响应事件( event)的能力
?Delphi允许开发者编写事件处理程序。
?通过对象之间的交互与事件响应,
一个应用程序就可以运转工作了。
建立窗体 Form1后,
首先引发窗体的 OnCreate事件窗体的 Visible属性为,True”,引发窗体的 OnShow事件窗体出现在屏幕后
又会引发窗体的 OnPaint事件窗体出现后即被置为激活状态这时引发窗体的 OnActivate事件窗体进入工作状态后首先将焦点置于
窗体上的第一个控件 edit1,
引发编辑框 1的 OnEnter事件;
用户输入被除数,每当输入一位数字,
就会引发 Edit1的 OnKeyPress事件
当用户输入完被除数后用鼠标单击
edit2准备输入除数时,
又会引发 Edit1的 OnExit事件
和 Edit2的 OnEnter事件;
……
OnClick
----- 用户用鼠标单击关闭框以结束程序,
这时会引发窗体的 OnCloseQuery事件窗体关闭时又会引发 OnClose事件,
而这是整个操作过程的最后一个事件。
例
一
?当光标进入某输入框时,该输入框及输出框自动
置空。
?本题要求只能输入整数(暂不考虑数的范围),
如果输入的不是数字,程序不予接收。
?当按运算键时,如果还有输入框没有输入数字的
情况,就在该框中给出输入提示,并将该框颜色
变红。
?当除数为零时显示出错信息。
implementation
{$R *.DFM}
var
x,y,integer;
function editempty(editbox,Tedit):boolean;
begin
if Editbox.Text = `` then
begin
Editbox.Color:=Clred;
Editbox.Text:='请输入 ';
Result:=True;
end
else
begin
Editbox.Color:=Clwindow;
Result:=false;
end ;
end;
procedure TForm1.Button4Click(Sender,TObject);
begin
if editempty(edit1) or editempty(edit2) then
exit;
x:= strtoint(edit1.text);
y:= strtoint(edit2.text);
if y =0 then
begin
showmessage('除数为零 ');
exit;
end;
edit3.text:= inttostr(x div y) ;
end;
除键的 OnClick
事件句柄
procedure TForm1.EditKeyPress(Sender,TObject;
var Key,Char);
begin
if not(key in ['0'..'9'] )then
key:=chr(0);
end;
Edit1和 edit2的共享
OnKeyPress事件句柄
procedure TForm1.EditClr(Sender,TObject);
begin
if sender = edit1 then
begin
edit1.text:='';
edit1.Color:=Clwindow;
end
else
begin
edit2.text:='';
edit2.Color:=Clwindow;
end;
edit3.text:='';
end;
Edit1和 edit2的共享
OnEnter事件句柄
例
二
RadioGroup
加
减
乘
除
procedure TForm1.calClick(Sender,TObject);
var
x,y,z,integer;
begin
x:= strtoint(edit1.Text);
y:= strtoint(edit2.Text);
case RadioGroup1.ItemIndex of
0, z:=x+y;
1, z:=x-y;
2, z:=x*y;
3, z:=x div y;
else
begin
showmessage('没有选择运算类型 ');
exit;
end;
end;
edit3.text:=inttostr(z);
例
三
listBox1.selected[0]
T/F
listBox1.ItemIndex
0,1,2,3…
正方
园
长方
椭圆
F
T
procedure TForm1.startClick(Sender,TObject);
begin
if ComboBox1.text='slow' then
timer1.interval:=1000
else if ComboBox1.text='fast' then
timer1.interval:=10
else
timer1.interval:=100;
timer1.enabled:=true;
end;
ComboBox1.Items[ComboBox1.ItemIndex]
procedure TForm1.Timer1Timer(Sender,TObject);
begin
if listBox1.selected[0] then
square.left:=(square.left+1) mod panel1.width;
if listBox1.selected[1] then
circle.left:=(circle.left+1) mod panel1.width;
if listBox1.selected[2] then
rect.left:=(rect.left+1) mod panel1.width;
if listBox1.selected[3] then
ellipse.left:=(ellipse.left+1) mod panel1.width;
end;
procedure TForm1.stopClick(Sender,TObject);
begin
timer1.enabled:=false;
end;
例
四
memo
7个 Button
caption属性为“剪切”,…
1个 memo(备注控件 )
Lines属性为空,
WordWrap属性 为 true
CrollBars 属性为 ssVertical
1个 Dialogs/OpenDialog
1个 Dialogs/SaveDialog
1个 Dialogs/ColorDialog
属性 opendialog1.FileName
方法 opendialog1.Execute True
False
{
ColorDialog1.Execute
ColorDialog1.Color
procedure TForm1.CutButtonClick(Sender,TObject);
begin
memo1.CutToClipboard;
end;
procedure TForm1.CopyButtonClick(Sender,TObject);
begin
memo1.CopyToClipboard;
end;
procedure TForm1.PasteButtonClick(Sender,TObject);
begin
memo1.PasteFromClipboard;
end;
procedure TForm1.ClrButtonClick(Sender,TObject);
begin
memo1.Clear;
end;
procedure TForm1.ReadButtonClick(Sender,TObject);
begin
if opendialog1.Execute then
memo1.Lines.LoadFromFile(opendialog1.FileName);
end;
procedure TForm1.SaveButtonClick(Sender,TObject);
begin
if Savedialog1.Execute then
memo1.Lines.SaveToFile(savedialog1.FileName);
end;
procedure TForm1.chcolorClick(Sender,TObject);
begin
if ColorDialog1.Execute
then
Form1.Color:= ColorDialog1.Color
else
Form1.Color:=ClBtnface ;
end;
图
像
组
件
图
像
组
件
图
像
组
件
图
像
组
件
图
像
组
件
procedure TForm1.Button1Click(Sender,TObject);
begin
if opendialog1.Execute then
image1.Picture.LoadFromFile(opendialog1.FileName);
end;
图
像
组
件
图
像
组
件
图
像
组
件
通过例题掌握 Delphi 编
程的思路
对象 PASCAL基本结构
? Delphi 是面向对象和事件驱动的,过去
那种自上而下的结构化方法已不适应在
Delphi 中编程。
? OP 的 一个程序是由一个 Program程序单
元和若干可选的子程序单元组成。
? 在 Delphi 中 Program程序单元就是它的项
目文件。
? 子程序单元就是 Delphi 的单元文件
Program project1;
uses
forms;
unit1 in unit1.pas ;
{$R *.RES}
begin
… …
end.
项目文件
在 Delphi 中,程序员
几乎不 接触
Program单元
单元的含义
? 单元是复用 技术的体现。单元为开发人
员提供了一种方法,来创造一套子例程,
并将它们封装在一个代码块中,经过编
译而供他人使用。
? 在 Interface中公开了本单元的意图,
在 Implementation中实现在 Interface中
,通告”的内容。
? 由于可以将大多数应用程序的功能分成
组,所以引入支持这种概念的编程模型
是合乎情理的。
单
元
unit Unit1;
interface {所定义的内容, 可为其他项目利用 }
uses <引用单元列表 >
type
var 说明部分
procedure / function
implementation
uses <引用单元列表 >
说明部分 {内部公共说明 }
procedure {在 interface中声明的,
function 也可定义内部过程与函数 }
initialization {初始化程序代码, 可选 }
finalization {结束处理代码, 可选 }
end,{ 单元结束 }
单
元
}
}
interface
uses
Windows,Messages,SysUtils,Classes,
Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
单
元
Type
Tdays=(mon,tue,wed,thu,fri,sat,sun);
TForm1 = class(TForm)
Button1,TButton;
procedure Button1Click(Sender,TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Temp =class(tobject) 自定义对象
name,string[10];
sal,integer;
function total, integer;
end;
单
元
窗体对象
? 对象与记录相似之处是都包含数据域,
但对象还包括方法,即操作对象数据的
方法。
? 在 Delphi 中编写的所有事件处理程序都
是窗体对象的方法。
? 可以在 Public和 private中添加新的数据域
和方法。
单
元
var
Form1,TForm1;
emp:Temp;
key, Boolean ;
单
元
interface {所定义的内容,可为其他项目利用 }
uses <引用单元列表 >
type
var
Function verify(sno:integer;sname:string):boolean;
implementation
单
元
implementation
{$R *.DFM}
uses
var 仅供单元内部使用
function Temp.total,integer;
begin
total:=emp.sal*12;
end;
procedureTForm1.Button1Click(Sender:TObject);
begin
emp.sal:=10 ;
showmessage(inttostr(emp.total));
end;
end.
单
元
}
Project1
Unit1
Unit2
Procedure2
Procedure3
Procedure1
Procedure4
Procedure5
Procedure6
变
量
作
用
域
Initialization
begin
emp:=temp.create;
end;
finalization
begin
emp.free;
end;
end.
单
元
常用运算符
? 算术运算符 + - * / div(整除〕 mod
? 字符串运算符 +
? 集合运算符 + - * in
? 对象类型判别 is
? 例:
procedure Tform1.cclick(sender:Tobject);
Begin
if sender is Tbutton then
Tbutton(sender).Height:=50;
end;
对象
属性 - 状态信息
方法 - 动作信息
事件 - 对象之间传递的信息
?事件就是对象之间传递的信息
?而对象具有响应事件( event)的能力
?Delphi允许开发者编写事件处理程序。
?通过对象之间的交互与事件响应,
一个应用程序就可以运转工作了。
建立窗体 Form1后,
首先引发窗体的 OnCreate事件窗体的 Visible属性为,True”,引发窗体的 OnShow事件窗体出现在屏幕后
又会引发窗体的 OnPaint事件窗体出现后即被置为激活状态这时引发窗体的 OnActivate事件窗体进入工作状态后首先将焦点置于
窗体上的第一个控件 edit1,
引发编辑框 1的 OnEnter事件;
用户输入被除数,每当输入一位数字,
就会引发 Edit1的 OnKeyPress事件
当用户输入完被除数后用鼠标单击
edit2准备输入除数时,
又会引发 Edit1的 OnExit事件
和 Edit2的 OnEnter事件;
……
OnClick
----- 用户用鼠标单击关闭框以结束程序,
这时会引发窗体的 OnCloseQuery事件窗体关闭时又会引发 OnClose事件,
而这是整个操作过程的最后一个事件。
例
一
?当光标进入某输入框时,该输入框及输出框自动
置空。
?本题要求只能输入整数(暂不考虑数的范围),
如果输入的不是数字,程序不予接收。
?当按运算键时,如果还有输入框没有输入数字的
情况,就在该框中给出输入提示,并将该框颜色
变红。
?当除数为零时显示出错信息。
implementation
{$R *.DFM}
var
x,y,integer;
function editempty(editbox,Tedit):boolean;
begin
if Editbox.Text = `` then
begin
Editbox.Color:=Clred;
Editbox.Text:='请输入 ';
Result:=True;
end
else
begin
Editbox.Color:=Clwindow;
Result:=false;
end ;
end;
procedure TForm1.Button4Click(Sender,TObject);
begin
if editempty(edit1) or editempty(edit2) then
exit;
x:= strtoint(edit1.text);
y:= strtoint(edit2.text);
if y =0 then
begin
showmessage('除数为零 ');
exit;
end;
edit3.text:= inttostr(x div y) ;
end;
除键的 OnClick
事件句柄
procedure TForm1.EditKeyPress(Sender,TObject;
var Key,Char);
begin
if not(key in ['0'..'9'] )then
key:=chr(0);
end;
Edit1和 edit2的共享
OnKeyPress事件句柄
procedure TForm1.EditClr(Sender,TObject);
begin
if sender = edit1 then
begin
edit1.text:='';
edit1.Color:=Clwindow;
end
else
begin
edit2.text:='';
edit2.Color:=Clwindow;
end;
edit3.text:='';
end;
Edit1和 edit2的共享
OnEnter事件句柄
例
二
RadioGroup
加
减
乘
除
procedure TForm1.calClick(Sender,TObject);
var
x,y,z,integer;
begin
x:= strtoint(edit1.Text);
y:= strtoint(edit2.Text);
case RadioGroup1.ItemIndex of
0, z:=x+y;
1, z:=x-y;
2, z:=x*y;
3, z:=x div y;
else
begin
showmessage('没有选择运算类型 ');
exit;
end;
end;
edit3.text:=inttostr(z);
例
三
listBox1.selected[0]
T/F
listBox1.ItemIndex
0,1,2,3…
正方
园
长方
椭圆
F
T
procedure TForm1.startClick(Sender,TObject);
begin
if ComboBox1.text='slow' then
timer1.interval:=1000
else if ComboBox1.text='fast' then
timer1.interval:=10
else
timer1.interval:=100;
timer1.enabled:=true;
end;
ComboBox1.Items[ComboBox1.ItemIndex]
procedure TForm1.Timer1Timer(Sender,TObject);
begin
if listBox1.selected[0] then
square.left:=(square.left+1) mod panel1.width;
if listBox1.selected[1] then
circle.left:=(circle.left+1) mod panel1.width;
if listBox1.selected[2] then
rect.left:=(rect.left+1) mod panel1.width;
if listBox1.selected[3] then
ellipse.left:=(ellipse.left+1) mod panel1.width;
end;
procedure TForm1.stopClick(Sender,TObject);
begin
timer1.enabled:=false;
end;
例
四
memo
7个 Button
caption属性为“剪切”,…
1个 memo(备注控件 )
Lines属性为空,
WordWrap属性 为 true
CrollBars 属性为 ssVertical
1个 Dialogs/OpenDialog
1个 Dialogs/SaveDialog
1个 Dialogs/ColorDialog
属性 opendialog1.FileName
方法 opendialog1.Execute True
False
{
ColorDialog1.Execute
ColorDialog1.Color
procedure TForm1.CutButtonClick(Sender,TObject);
begin
memo1.CutToClipboard;
end;
procedure TForm1.CopyButtonClick(Sender,TObject);
begin
memo1.CopyToClipboard;
end;
procedure TForm1.PasteButtonClick(Sender,TObject);
begin
memo1.PasteFromClipboard;
end;
procedure TForm1.ClrButtonClick(Sender,TObject);
begin
memo1.Clear;
end;
procedure TForm1.ReadButtonClick(Sender,TObject);
begin
if opendialog1.Execute then
memo1.Lines.LoadFromFile(opendialog1.FileName);
end;
procedure TForm1.SaveButtonClick(Sender,TObject);
begin
if Savedialog1.Execute then
memo1.Lines.SaveToFile(savedialog1.FileName);
end;
procedure TForm1.chcolorClick(Sender,TObject);
begin
if ColorDialog1.Execute
then
Form1.Color:= ColorDialog1.Color
else
Form1.Color:=ClBtnface ;
end;
图
像
组
件
图
像
组
件
图
像
组
件
图
像
组
件
图
像
组
件
procedure TForm1.Button1Click(Sender,TObject);
begin
if opendialog1.Execute then
image1.Picture.LoadFromFile(opendialog1.FileName);
end;
图
像
组
件
图
像
组
件
图
像
组
件