delphi 的一些注意点和知识点
关于Delphi中产生的文件
编辑阶段: pas/单元文件,dpk/组件包文件,dpr/工程文件,dfm/窗体文件
编译阶段: dcu/单元编译文件,dcp/Delphi Compile package
连接阶段: exe,dll,bpl/Borland package library
运行阶段
使用Delphi编程中需要掌握的四大语言
A. Object Pascal B. SQL C. HTML/XML D. UMI
Delphi发展的两个主要技术 {数据库引擎,网络开发}
工程中包含的单元主要有带Form的单元和不带Form的单元
单元文件的结构{unit 单元名,接口部分,实现部分,初始化部分,结束部分}
前三个部分是必选的,后两个是可选的。
初始化部分:单元载入内存的时候初始化里面的代码
结束部分: 单元结束的时候执行的代码
代码模版在Tools菜单的Editor Options 中的Code Insight
Code Template 部分的Code中编写代码的时候加个"|"表明光标定位处
Ctrl+J:在单元中编写代码的时候,敲入模版 按下Ctrl+J自动产生模版代码
{$开头的表示:编译器指令字 而不是纯粹的注释
单行注释 //
块注释 (* *) 或者 { } 相同类型块注释不能嵌套
微调控制方向键:Ctrl+方向键;微调改变大小: Shift+方向键
Edit菜单中Creation Order的功能是:控制非可视组件在窗体产生的时候的创建顺序
Edit菜单--〉Scale功能:改变窗体上所有组件的位置和大小范围在[25%-400%]
包括Left,Top,Width,Height都按照比例改变
Compile Ctrl+F9 仅仅编译,只有当源代码文件改变了才加以编译
build 不管改变否,都重新编译连接生成目标文件
Run F9 先看源文件是否改变,改变则Compile ,然后连接生成目标文件运行
断点设置F5,鼠标单击针对一行,如果该行有多条语句则F8后同时执行完成
F4 Run to Cursor让程序运行起来,若程序运行到该行则类似F5功能,
如果把光标移到其它行再按下F4程序就跳到光标行很实用
F7 Trace Into :可以进入例程
F8 Step Over :单行/句执行
工程选项中Options的Compile中的 Use Debug Dcus 可以跟踪进入DCU、
Run 中的 program Reset 或者使用Ctrl+F2 可以把僵死在IDE环境中的程序解除。
Project菜单下的Options中的设置仅对当前工程有效,
如果选中了Options中的Default则该设置对以后产生的工程也有效。
1> Project菜单下的Options设置中Compile页中选中Optimization
可以消除无用代码,如for I:=0 to–1 do 绝对不会编译
2> Extended syntax 如果去掉则 function中的result不能用
3> Record field alignment:分配变量的对齐方式字节为单位,8指8字节比较超前
工具菜单环境选项命令,以下设置针对所有工程
preferences->Docking->选中Auto Drag Docking 窗口拖放自动融合,
若想不入邬则按住Ctrl键(在选中情况下)。
Library->Library path :可以设置常用的搜索路径,适用所有工程
顺带了解:Tools-->Editor Options 和 Tools-->Debug Options
试题19 窗体模版的选用 File->New->other->Forms 三种选用方式:
Copy拷贝:完全拷贝,互不影响
Inherited继承:作为子类使用,模版改变则子类改变
Use使用:以指针的方式来用,双向变化
删除模版方法:进入Tools->Repository找到模版页,在Objects中选中对象删除
试题20 标识符的注意点:字母或下划线开始,只能包含字母、数字和下划线的字符串
不能与保留子相同,尽量使用有意义的单词或单词组合
试题21 命名约定
常量名:全大写
保留字:全小写
类型名:T 表示类 E表示异常 I表示COM接口
对象名:edtName btnCalc 类中元音不要,取辅音作前缀,重复辅音取一个
如 button 去掉u和o 仅保留 btn用小写
枚举常量名:如Pen中Style:psSolid,psDash,psDot,psDashDot,psDashDotDot,psClear,psInsideFrame
事件属性名:OnClick 以On开头
变量、域名:用名词;
例程名:动宾结构 DoAdd,DrawCircle
试题22 保留字和指示字,65个保留字 + 类中的4个P和异常处理中的on
44个指示字只在特定上下文中有特定含义如message abstract virtual
否则可以当作标识符使用。
试题23 数值数据:十进制,科学表示法7e-2 12.35E6 ; 十六进制 $AAAA
试题24 字符串中的注意点
‘I can’’t ‘ = ‘I can’#39’t’
‘Line ‘#13#$A’Line 2’=’Line 1’+#13#10+’Line 2’
var message:Single;
message:=12.25E6; 总共11位
write(message :15:2);
writeln(''''); 输出'符号后加上回车换行符
试题25 运算符的优先级排列问题
., @, not,^ first (highest)
*, /, div, mod, and, shl, shr(右移), as(类型转换) second
+, - ,or, xor third
=, <>, <, >, <=, >=, in, is(类型判断) fourth (lowest)
试题26 数据类型中的几个问题
17数据类型,5种标准数据类型(内建声明的数据类型)
{整型9种:integer 和Cardinal 通用:32位机上是32位,64位上是64位
实型5种,记住字节数 Single 4; Extended 10; 其他8 Real为通用
Currency类型实际存放的方式:数值*10000保存整数形式,取出来除以10000
字符型 AnsiChar 等价 char 1个字节 WideChar 2个字节
字符串型 shortstring 短字符串 Ansistring 长字符串
WideString 宽字符串 string 同AnsiString 通用型 String
布尔型 Boolean 只能取 True or False }
七种结构数据类型{数组、记录、集合、文件、类、类引用(class of)、接口}
三种特殊数据类型{指针 ^ , 变体 variant , 过程 procedure}
Delphi专用数据类型{Type TdateTime=type double; TPoint}
试题27 变量的内存空间
var I:Byte I占据1个字节
var str:String; 占据4个字节为空指针,当str:=’abcd’的时候,
在堆中分配空间存放引用计数和abcd四个字符,然后空指针指向这个堆中的起始地址
字符串具有:CopyOnWrite技术和具有垃圾回收功能。
var str:string[100] 占据101字节
var str:ShortString; 分配256个字节,实际字符占据255
试题28 有序数据类型的用法,直接前趋pred、直接后继succ
如for循环和case 只能用有序数据类型
整数、字符、布尔、子界、枚举 Ord( )返回整数序号, Pred(),Succ()返回枚举类型
枚举要注意:它的序号问题,占据的内存问题(可变长的):占据1个字节还是多个字节,看序号大小
如:TEnum=(meBlue,meRed=0,meGreen=65536) 4个字节 2000则为2个字节
TmyEnum=(meBlue,meRed=0,meGreen=1) 1个字节还有mrGreen的前趋可以是 meBlue也可以是meRed
数组:一维动态数组,二维动态数组,下标总是从0开始,分配函数SetLength( )
例如 type dynIntOne=array of integer;
dynIntTwo:array of array of integer;
var dd1:dynIntOne;
dd2:dynIntTwo;
没有使用SetLength分配空间之前,此时low(dd1)=0, high(dd1)=-1;
记录变量是静态分配的,在栈中分配,所有的对象都是在堆中分配的。
集合类型 type Tmyset=set of 基类型 最多256个元素,基类型为有序类型
不但数量<=255 且序号都必须0<=X<=255
type myset=set of 5..256; 不行,set of 0 .. 255 正确
File类型:无类型文件 File (按128字节分块) 文本文件 TextFile
试题33 type TnotifyEvent=procedure(sender:Tobject) of object;
//类中的过程指针
type TmyProcedure=procedure(s:string); //一般的过程指针
试题34 Type TdateTime=type double;
整数部分:表示日期 加1表示天数加1
小数部分:表示时间 0 表示午夜0点,0.5表示中午12点
1/24 一小时,1/(24*60) 一分钟 1/24*60*60 一秒钟 以此类推
从1899年12月30日午夜0点 开始计时 :0
试题34 数据类型转化
x mod y=x-(x div y)*y 求余看被除数的符号
10 mod 3=1 -10 mod 3=-1 -10 mod –3=-1 10 mod –3=1
试题35 Pascal中的语句知识,考小程序较多
语句以分号结束,程序或单元以点句号结束。
试题36 通常函数调用不应当单独构成语句,而应当用作表达式置于赋值语句的右侧。
设置工程选项对话框Compiler标签页的Extended Syntax为未选中,
可以禁止函数用作语句。同时,也禁止了Result预定义变量的使用。
试题37 注意Begin End 界定符的用法:end 之前的那条语句可以不用分号”;”,
end之后如果作为复合语句一般情况下有分号,但也可以没有分号如if else语句
试题38 with 语句的功能:用在记录、类和无名对象中如 with Tbitmap.Create do
嵌套的with语句的优先级问题:按照最接近原则处理.结果为Button2.caption变为dddd
with button2,button1 do
begin
caption:='ddd';
end;
with button1 do
begin
with button2 do
begin
caption:='ddddd';
end;
end;
试题39 注释语句:同级不可以嵌套,切记!!
If xxxx then dosomething
Else do else; 上述两句在Delphi中算一条语句
If xxxx then dosomething ; 算一条语句,对一条语句的理解
试题40 Case 语句:值表达式必须是有序类型
case 值表达式 of
valuei: 语句;//begin end; 复合语句
else 语句;//begin end; 复合语句 此处else 没有冒号
end; //有end 没有 begin
试题41 循环语句:for 循环中的循环变量在循环体中不能赋值,且为有序类型
I:Char;
for I:=’A’ to ‘Z’ do
只能在循环中使用的:continue(再度进入循环)和 break(退出循环);
试题42 exit 退出一段例程,如果为主例程则整个程序退出
repeat语句中有必要用begin end结束吗?可以/不可以,应该可以。
begin
end;
until 结束条件为真;
试题43 两种例程:procedure / function
声明:相同的连续的形参可以放在一条以逗号隔开的类型声明语句中
多个形参用分号隔开。
定义:只能在implementation部分
调用:调用的时候参数间全部用逗号分隔。
试题44 参数类型5种:值参,变参 var,常参 const,
in/out COM应用中:单纯的只(进)读和只(出)写,两个可合用
试题45 例程中的缺省参数的使用:注意从后往前缺省,中间不能跳跃
试题46 例程重载(overload)的使用:必须满足一下条件之一
参数个数不同;参数类型不同;相同个数情况下某个对应位置类型不同
记住:只要参数类型不同即可,返回值不同无效,
但是以下可以通过,
procedure swap(const A,B:Integer);overload;
begin
end;
function swap(const A,B:single):Integer;overload;
begin
end;
试题46 作用域问题
可见性:变量可以被访问的范围。
生命期:变量能在多长时间内保持其值和保持可见性。
试题47 记录与类的区别
记录中只能放数据,记录变量是在栈中分配内存,不能自动初始化,
所有的数据(域)不能对外隐藏。
试题48 type my=record
name:string; //4 实际 4 地址吗
age:single; //4 实际 4
bs:Boolean; //4 实际 1
end;
//如果Project Options的编译器中设置了对齐为1个字节则为9,4-8个字节为12
如果使用sizeof(my)则结果为:12,
如果声明变量 var dd:my 不管有没有赋值; sizeof(dd)则结果都为:12
试题49 类中可以包含数据外,还能包含处理数据的例程即方法,对于数据和方法的可见性的约束。
类类型变量(即对象)的存储分配方式为动态分配也不同于记录变量,类中还包括属性成员
试题50 ctrl+shift+c :自动代码完成针对:方法(定义)、属性(Private方法和域的自动添加)
Ctrl+shift+↑:回到代码声明处 Ctr+Shift+↓:进入代码定义处
Ctrl+J: 代码完成 Ctrl+Shift+U 整块左移,Ctrl+Shift+I整块右移
试题51 构造函数功能:实例化和初始化对象
var bb:Tbitmap; //此时只是个空指针,还没有创建实例
begin
listbox1.Items.Add(inttostr(Integer(bb))); //指针1
bb:=TBitmap.Create; //在heap中创建对象,
listbox1.Items.Add(inttostr(Integer(bb))); //指针2
指针1和2不一样,但是大小都是4个字节,用来存放指针。
End;
试题52 类的Free方法在Tobject中:间接调用了Destroy;
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
试题53 TPerson = class
Name: string;
BirthDay: TDate;
Sex: Boolean;
constructor Create(const N: string; B: TDate; S: Boolean); overload;
procedure Talk; virtual;
end;
procedure TForm1.Button2Click(Sender: TObject);
var b:Tperson;
begin
ListBox1.Clear;
ListBox1.Items.Add(b.Name);
if b.Sex then
ListBox1.Items.Add('男')
else
ListBox1.Items.Add('女');
//变量b的存储空间大小
ListBox1.Items.Add(IntToStr(SizeOf(b)));
//对象b的实例空间大小
ListBox1.Items.Add(IntToStr(b.InstanceSize));
//变量b所在的存储地址
ListBox1.Items.Add(IntToStr(LongInt(@b)));
//对象b所在的存储地址
ListBox1.Items.Add(IntToStr(LongInt(b)));
//对象b中第一个数据成员的存储地址
ListBox1.Items.Add(IntToStr(LongInt(@b.Name)));
//对象b中第二个数据成员的存储地址
ListBox1.Items.Add(IntToStr(LongInt(@b.BirthDay)));
//对象b中第三个数据成员的存储地址
ListBox1.Items.Add(IntToStr(LongInt(@b.Sex)));
b.Free; b:=nil; //特别要注意回收内存
end;
试题54 成员的讨论:重要
数据(域)成员:变量。
方法成员:前向分类——构造(器)方法、析构(器)方法、一般方法、类方法。
类方法:可以通过对象和类引用的方法含构造方法。
一般方法:只能通过对象引用
方法成员:后向分类——静态方法 尾巴干净的、虚拟方法Virtual、
动态方法dynamic、抽象方法abstract、覆盖override和重载overload的方法、处理消息的方法message 消息常量。
虚拟方法:用空间换时间,较快 动态方法:时间换空间,较慢
抽象方法:前缀必须是虚拟方法或动态方法,只需声明不用定义
Tobject.destroy 是虚拟的
属性成员:反映数据(域)的窗口,对数据处理。包括数据属性和事件属性。
试题55 所谓面向对象的语言OOP,就是同时具备抽象性、封装性、继承性和多态性的语言。
试题56 抽象性:建模考虑的问题
封装性 private protected public
private 除本单元外,完全不可见。C++中的友元问题。
注:在Delphi中,对友元概念的支持是通过放置在同一个单元来实现的。
Protected 除本单元及其子类外,不可见。
Public 如果类声明在单元接口部分,其它单元只需uses即可见。
Published 如果是组件,则不仅具有public的可见性,
而且在设计期的对象检视器可见。缺省的可见性为published。
编写组件的时候按可见性从小到大排列。
在每一种可见性中,先数据(域),后方法,再属性。
试题58 通常:数据(域)放在private部分;属性放在published(组件)
或public(一般类)部分。方法的放置要复杂一些,请注意积累,
能够可见性低则尽量不要高。
子类访问父类的私有域出错!子类访问保护域没问题!
孙子类调用访问父类的私有方法,出错!访问祖父类的保护域没问题!
如果把三个类都放在一个单元内,则都可以访问!四个域都可以!
继承:如果子类调用父类的Create则只实现了实例化,而没有初始化。
多态:构成多态的基本要素:
(1)类有继承关系;
(2)派生类对象可以赋给父对象;
(3)派生类可以override基类的virtual和dynamic方法。
多态判断规则:
(1)静态方法看声明,谁声明就是调用谁的即使字类赋给父类,尘归尘,土归土;
(2)覆盖方法看实际,参考procedure(Sender:Tobject);中的Sender
下列代码执行后,其正确的输出结果序列为:[考题]
type
TA = class
procedure One; virtual;
procedure Two;
end;
TAA = class(TA)
procedure One; override;
procedure Two;
end;
procedure TA.One;
begin
ShowMessage('基类One');
end;
procedure TA.Two;
begin
ShowMessage('基类Two');
end;
procedure TAA.One;
begin
ShowMessage('派生类One');
end;
procedure TAA.Two;
begin
ShowMessage('派生类Two');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
fa: TA;
ca: TAA;
begin
Memo1.Clear;
fa := TA.Create;
ca := TAA.Create;
fa.One;
ca.One;
fa.Free;
ca.Free;
fa := TAA.Create;
fa.One; //重点考这里
fa.Two;
fa.Free;
end;
三大数据模块和公司(Corba:OMG组织;
DCOM:MS微软公司,RMI(Remote Mothod Invocation):SUN公司
试题63 试题:exception主体结构
Exception = class(TObject)
private
FMessage: string;
public
constructor Create(const Msg: string);
property Message: string read FMessage write FMessage;
end;
销毁一个窗口的事件发生的顺序OnCloseQuery OnClose OnDestroy
创建一个窗口的事件发生的顺序OnCreate OnShow OnActivate OnResize OnPaint
按键发生的系列事件顺序如下:OnKeyDown OnKeyPress OnKeyUp
鼠标单击的时间顺序onMouseDown OnClick OnMouseUp
双击鼠标 OnMouseDown OnClick OnMouseUp OnDblClick OnMouseDown OnMouseUp
注意:OnEnter和OnExit事件 如果没有焦点则在单/双击多发生一个事件OnEnter
试题66 Polygon(const Points:array of TPoint); //封闭图形,用当前的画刷填充,边框用Pen
PolyLine(const Points:array of TPoint); //画多边形,用当前的Pen
试题67 Arc,Ellipse,LineTo,MoveTo,Pie, Rectangle方法的使用以及参数
试题68 类层次结构图,从Tobject 开始的整个VCL类图,有考类之间的继承关系
TObject->TPersistent->TComponent->TControl->{TGraphicControl/TWinControl}
TObject->Exception->
TObject->TInterfaceObject
TWinControl即窗口控件的三大特征:句柄、焦点、部分可以为父
TGraphicControl即图形控件的三大特征:无句柄、无焦点,全部不可以为父
TControl类中,控件为了显示出来要指定父parent,但是为父的一定是TwinControl 窗口控件
Enabled visible parent 属性进来了
控件关系Tcontrol->TgraphicControl->Speedbutton
Tbutton->BitBtn
因为没有多继承,所以先确定一个主类加以继承,然后把另一个类作为一个属性
试题72 Sizeof(self) //4
Sizeof(sender) //4
类的函数 instancesize(real size) 返回实例空间
祖先类的选择原则:
非可视组件最好的基类:TComponent
作图形控件最好的基类:TgraphicControl
作窗口控件最好的基类:TcustomControl,因为它引入了Canvas属性
组件命名问题:在组件名称之前加一些个性化东西如TLSLPerson
procedure Register;
begin
RegisterComponents('Wujispace', [TLSLPerson]);
end;
Register的大小写不能改变,参数含义:(组件面板页名称,组件类名字-〉开放数组)
在设计组件时候,属性如果为字符串则不能有缺省值 即不能使用 default
为组件建立位图图标
默认使用父类图标,父类没有则使用缺省的Delphi位图
用Image Editor建立DCR文件,并在其中建立24*24位图,保存时候位图名应与
组件类名完全相同并大写,DCR名字同组件包名相同这时候在包文件中编写{$R *.dcr}。
如果dcr文件不同于组件包名的话,需要在包文件中指定{$R 文件所在路径}
注意:左下角的颜色决定了透明色。这个*号表示:名字相同的情况下缺省。
试题77 定义定制的事件
1.通过添加事件属性在发布部分建立事件句柄
property OnPersonClick:TnotifyEvent read FpersonClick write FpersonClick;
2.在保护部分添加事件调度程序
procedure PersonClick;dynamic;
3.在私有部分定义消息处理过程,访问调度程序
FOnPersonClick:TnotifyEvent;
procedure WMLButtonClick(var Msg:TWMMouse);message WM_LBUTTONDOWN;
属性中的default作用:
属性的值如果在设计器改变且不同于default的值则该属性要保存
在dfm文件中,如果相同则不保存。如果去掉default则属性都会保存在dfm文件中。
如果保留default部分,删除create中的属性赋值,结果同上,这个来自Tpersistent.
注意:有没有default都不会对属性初始化,初始化只在构造方法中。如果构造方法中
没有对属性初始化则所有属性初始值为0或者空。
组件拖放到窗体上由IDE自动实现组件的Owner和Parent的设置
创建组件对象的时候指定Owner需要注意:Owner必须比被拥有者存活的时间长
测试组件对象,注意:1. 事件的赋值和处理方式
2. 顺序 * 创建组件对象 * 测试组件对象 *释放对象
异常处理注意:中四个关键字和两套结构[异常共2题]
try 决定一个代码保护块的起始
except 有异常才执行
finally 有没有异常都执行
raise 抛出一个异常
1)如何处理在程序中出现的异常
2)当程序中出现错误时候,如何引发异常 raise 异常实例初始化
3)异常处理它处理的是异常而不是错误,其实错误还没有发生
4)多个异常如何处理
要想IDE环境直接显示异常消息对话框,而不是进入异常调试状态请在
Tools中的Debugger Options中的Language Exceptions页中
不勾选 Stop On Delphi Exception
试题83 分析下面的代码中调用了那个异常处理
try
i := StrToInt('Sam');
ShowMessage(IntToStr(i));
except
on A: EDatabaseError do ShowMessage(A.message);
on B: EDivByZero do ShowMessage(B.Message);
on C: Exception do ShowMessage('Exception: ' + C.Message);
on D: EConvertError do ShowMessage('EConvertError: ' + D.Message);
end;
只执行了:On C:Exception do 这一条,实际上应该由On D: 来处理的!
异常机制做了这样两件奇妙的事
(1)错误消息自动包含在异常类的message属性中出现;
(2)异常帮助你避免发生错误之后意外地执行任何敏感的代码。
自定义异常类,为创建自己的异常,需要声明一个异常类:
type
ESillySpellingError = class(Exception);
异常处理完后,还可以在把这个异常继续抛出
此时就没有必要再实例化和初始化一个异常对象,直接使用 Raise 即可。
因为此时异常处理中已经知道这个异常是属于哪个异常类了。
如何使下面代码中光标在处理完计算后保持crDefault,可以使用处理异常保护
try
try
for I := 1000 downto 0 do
J := J + J div I;
MessageDlg('Total: ' + IntToStr(J), mtInformation, [mbOK], 0);
finally
Screen.Cursor := crDefault;
end;
except
on E: EDivByZero do ShowMessage('Error in Algorithm');
end;
包是被Delphi程序或IDE所调用的一类特殊的DLL。在Delphi中有两类包:
运行期包和设计期包,前者在程序运行时提供一定的功能,后者主要用于扩展IDE的功能。
动态连接库允许多个由不同语言创建的Windows应用程序或DLL共享程序代码和资源,
以过程和函数调用的方式来提供服务。在多数Delphi开发的应用程序中,包比DLL更加灵活,
而且易于创建,但在下列情况下,DLL更适合:
(1)程序模块由非Delphi应用程序调用; (2)扩展Web Server的功能;
(3)创建第三方应用模块; (4)创建的工程是一个OLE容器。
试题90 理解静态连接和动态连接的概念:
静态连接:编译后将子程序连接到EXE中;EXE文件大,但运行时快。
动态连接:编译后连接时根据程序中的external声明建立与子程序的联系表, 运行时,先将DLL装入内存并用其运行地址填入联系表(子程序与程序在同一地址空间,
参数传递发生在堆栈上);EXE文件小,但运行时慢,这个是动态连接中的静态方式。
另一种动态方式:在程序中真正需要访问的时候通过LoadLibrary FreeLibray动态调用
哪些是动态连接库文件:bpl,dll,fon,drv
动态连接库的好处:
1.如果不同的程序使用相同的DLL,只需在内存中装载该DLL一次即可。
2.对于复杂程序的维护更加方便。仅需维护易于维护的DLL即可。
3.使用DLL存储资源如字体、设备驱动程序、不同语言的字符串、位图图标等。
4.DLL独立于编程语言。
由外部程序调用的DLL函数或过程必须遵守下列规则:
1.它必须列在exports子句中,使其可在外部看到;
2.输出函数应被声明为stdcall,以使用标准的Win32参数传递技术代替
优化的register参数传递技术;
3.DLL的参数类型必须是默认的Windows类型,至少在希望该DLL能够应用于其它开发环境时;
4.DLL可以使用全局数据,每当应用程序装载DLL时,实际上是在自己的地址空间中存储着DLL的全局数据,互相不会冲突,无需保护。
DLL的使用方式
(1)完成一般子例程的功能;
(2)用于窗体重用;
(3)用于数据交换。
试题95 应用程序调用DLL的两种方式:
(1)静态调用(隐式装载)使用external ‘DLL文件名’; //严格讲此处是一个dll文件路径
(2)动态调用(显式装载)使用三个API函数:LoadLibrary、GetProcAddress、FreeLibrary。
试题96 字符串在dll中传递可以用但是会出异常。这时候就要在工程代码文件中uses Sharemem单元,
而且必须放在uses语句中的第一个;而且在开发的动态库文件中也要加入uses的第一个单元,
两边都要加。如果只是将字符串传入dll则无需在两端都加入sharemem(都不要),如果要加则都加。
Name属性 所有的组件有,并非所有的类都有.
Anchors 大部分组件有,相对于父控件Resize而言的锚定点默认为左上角,试着拖动窗体
助手类知识点
Tpersistent->Tstrings->TstringList
有排序:sort 和 sorted
提供文本变化的事件处理器:OnChange
Tlist->TobjectList/TClassList->TcomponentList
管理指针数组
TorderedList->Tqueue->TobjectQueue->Tstack
管理指针的队列和堆栈,管理对象指针的队列和堆栈
只要是组件就有属性:Name组件名称和 tag组件标记
owner拥有者概念:
任何一个组件必须被另一个组件所拥有,任何一个组件都可以拥有其他组件
拥有者在销毁自己之前必须负责被拥有组件的销毁
窗体的拥有者是 Application ,Application的拥有者是 nil
Tobject,总共25个方法,了解其中7个
1) 构造和析构相关的3个
create 静态 destroy 虚拟 Free 静态
2) 3个类方法
ClassName 返回类的名称,shortstring
ClassParent 返回直接基类的指针(类引用)
InstanceSize 返回对象实例空间的大小 Longint
3) 一个一般方法
ClassType 返回指向本身类的指针 (类引用)
4) 其他
dispatch 消息分发 GetInterface COM接口中用到
类引用类型是指向类而不是对象的指针,方便使用类方法,它不是类。
Tclass=class of Tobject;
Delphi自带的Tclass如上所示,它不是一个类,而是一个类引用,
所以不可以创建类引用类型的数组。实际上可以创建数组。
对象之间进行类型转化:使用As进行类型转化 或者 类型加()
Tcomponent(Sender) 或者使用 (Sender as Tcomponent)
AS运算符可以在基类和派生类指针之间进行相互转化,但是基类转成派生类会不会出现异常呢?
编译可以通过,但是运行后会出异常提示类型不匹配。
类型判断操作符 Is, 如 If Sender is Tbutton then //左边是否为右边的派生类
在确定类型的情况下使用As或者()两种方式,否则先用is 判断后使用As
任何继承自TForm的窗体,他的任何事件创建时,Delphi默认书写方式都是以Form打头的,切记。
如TForm1.FormCreate(Sender:Tobject);
这个不同其它控件的事件实现,都是名字后加事件,如Button1Click(sender:TObject);
Application 中关于hint属性和OnHint事件的使用,实现上下文们敏感提示
procedure Tform1.ShowMyHint(Sender:Tobject);
begin
self.caption:=Application.Hint;
end;
Procedure Tform1.FormCreate(Sender:Tobject);
Begin
Application.OnHint:=ShowMyHint;
End;
hint:=’toolbar text|statusbar text’; 《1》
则 《1》处的hint中”|”前面显示在组件上,后面显示在caption上
关于Self 和 Sender
Self 用来引用运行时调用该方法的对象,对调用者的引用,是一个指针
用来判断一般例程和方法的一个标志
Sender 传递引发该事件的对象,也是一个指针 如:Sender:Tobject
试题107 控制Table的可编辑的属性是:readonly
控制Query的可编辑的属性是:readonly和 RequestLive
Table、Query和StoredProc的区别
试题108 数据集的Locate方法的使用和结果
locate(关键字段,字段值,大小写匹配+部分匹配) 返回true找到
找到结果则:定位到找到的第一条,找不到则位置不动。
试题109 Query1.SQLS.Text:='select * from Customer where Custno:=custno';
Query1.params.parambyname('custno').asinteger := 134;
If not Query1.Prepared then
Query1.prepare; //优化准备
Query1.open;
Delphi自动做准备吗? 对,不写也可以
如果Query1.Open 已经打开,是否可以做Query1.Prepare? 可以,不会出现任何异常
试题110 数据集的Active与数据库Database的Connected属性的关系
可以由 Active:=true 触发 Database.Connected连接变为true,注意表/库该关闭的时候关闭,
试题111 数据库组件好处:提供事务的支持;减少与实际数据库的连接的句柄,减少开销;
可以提供内部使用的别名即使外部文件路径改变也不用改变内部程序;登录提示可设置loginPrompt
试题112 BDE设置的问题:
取别名 非SQL数据库别名指定文件夹,SQL数据库指定到文件
数据库中的表通过主键+外键–〉关键字
默认的interbase的账号 SYSDBA 密码 masterkey
Database组件的AliasName 来自BDE; DatabaseName提供给程序内部用,自定义
Table组件中的DataBaseName必须设成 Database.DataBaseName
此处建议Database.DataBaseName同AliasName一样,好处:内部使用保持一致性
这样一致的Databasename实现了外部实际数据库的物理无关性
试题113 BDE borland传统引擎,功能强大,配合SQL与ODBC,能够支持绝大多数主流数据库,
缺点是部署复杂导致不容易分发以及只支持windows
试题114 ADO (ActiveX Data Object) 微软标准,功能强大,易于分发针对windows
试题115 dbExpress Delphi 6新技术,跨Windows And Linux平台,轻量级引擎,开销小,
缺点:提供单向只读数据集,但与客户数据集组件技术一起使用
有很高的性能,易于分发(仅需150KB,BDE用几兆)
但dbExpress数据集不能使用过滤技术。
试题116 procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=0 to ListBox1.Items.Count-1 do
begin
if listBox1.Selected then
ListBox1.Items.Delete(i);
end;
end;
请问这段代码会出哪些问题?
删除最后一行没有问题,删除第0行到第n-1行都会出异常,因为Listbox1的Items.Count会变化,
显然selected[]已经变化了
试题117 ExtractFiledrive/Path/filename/ext各返回什么
Drive:返回 盘符+:如C: Path:返回所在目录+’\’
Filename:返回文件名xxx.txt ext:返回扩展名 如.txt
试题118 按下Esc键可以逐步返回父组件的焦点,设计的时候
模式窗口和非模式窗口的制作,ShowModal 和Show的区别
试题120 对话框的defaultExt 设置缺省扩展名的时候只需要三个字母即可,
不需要加点如:defaultext:='txt';
Filter设置:注意由'|'分隔(描述|过滤器) 如filter:=’all file(*.*)|*.*
多个过滤器用'|'隔开,一个过滤器中的复合filter用分号隔开 '文本文件(*.*)|*.txt;*.doc'
试题121 利用ActionList进行事件/任务以及Groupindex的分配,比较方便
试题122 Style Grouped AllowAllUp 效果
TbsButton(缺省)任意 任意 普通按钮
False(缺省) 任意 复选按钮
TbsCheck True False(缺省) 单选按钮
True 单选但可全不选
试题123 如果要做出复选效果,可令几个按钮有不同的非0的GroupIndex且其AllowAllUp为True。
Panel + Speedbutton做出工具栏的样子
GroupIndex AllowAllUp 效果
0(缺省) 任意 普通按钮
非0 False(缺省) 单选按钮
True 单选但可全不选
非0但值不同 true 多选但可全不选
试题124 Imagelist组件的使用
试题125 在按钮中如何改变Form1的标题
Caption:=’kkk’;
Self.caption :=’kkk’;
Form1.Caption:=’kkk’;
试题126 查询字段必须做过索引(findkey:datasource),或者locate不一定需要有索引。
试题127 通过DBExpress单向只读引擎从数据库下载数据到本地客户集,在本地修改后,如何提交到服务器上。
如果在本地修改了数据,然后执行Refresh方法希望从数据库得到新的数据,你会得到一个异常。
这个问题的解决要这样做:先在本地提交数据修改Applyupdates使(delta为空),然后refresh
利用客户数据集的ApplyUpdates方法将本地数据提交到服务器,参数的含义表示容错级别
-1表示忽略所有的修改错误,有多少可以在数据库提交的就该多少
>=0 表示如果有一条修改在服务器出现错误则所有的修改无效
例如5 如果发生了4个错误则可以把其他的正确提交,如果错误数达到5则所有的修改无效。
这个要注意。
试题128 窗体默认的Position属性是poDesigned,屏幕居中 poScreenCenter
试题129 如何访问字段,持久字段(利用字段组件名即可),命名习惯:数据集名+字段名
非持久字段的方法:Fields/FieldByName/FindField 返回的类型都是TField
还有一个方法直接在数据集名字后加上['数据表中字段名']如:Table1['ID'] 返回类型是变体
属性数组中如果缺省值做法是 default; 说明它是这个类的缺省属性,可以通过类名加下标访问
property FieldValues[const FieldName: string]: Variant read GetFieldValue write SetFieldValue; default;
default 只能针对数组
试题130 Trunc(2.8) 返回整数部分,Round(2.5)返回的总是偶数此处为:2,Round(3.5)返回4
正负数规律一样。
试题131 DataSetProvider:构成客户数据集与外部存储之间的管道,向提出请求的客户集提供数据,
并且在客户修改数据时候赋则将数据发送回底层数据存储(实际由构造SQL语句完成)
应用程序服务器:通常包含企业逻辑,它包含连接底层数据库和向客户应用程序提供结果数据所需的全部代码。
试题132 TClientSocket如何指定服务器:
1.指定服务器机器,其中Host优先于Adress
2.指定服务器服务端口,Service优先于Port
TServerSocket组件如何监听,指定监听端口时候service优先于Port
连接或者监听采用:Active属性或者Open方法
试题133 [学生]考过InputQuery以及相关的对话框的使用
试题134 NMFTP NMHTTP NMUDP NMSMTP NMPOP3使用的协议
试题135 通过文件或者流填充记住四个方法
LoadFromFile, SaveToFile, LoadFromStream, SaveToStream
注意:上述保存方法中除文件名/流对象名称参数外还有一个格式参数,有缺省值
Format:TdataPacketFormat = dfBinary
DfBinary 专门的二进制格式,
DfXML,dfXMLUTF8 :XML格式
保存到磁盘上的客户数据集文件就是所谓MyBase文件(cds文件),
一般它保存一个单独的数据集,也可以保存嵌套数据集。
试题136 Data 与 Delta的作用:客户机的数据全部放在data中,
刚开始delta为空;用户修改使用post后,修改的状况将反馈到data和delta中
最后使用ApplyUpdates()提交到服务器(实际构造SQL语句从Delta中提交数据完成)
试题137 嵌套数据集例子需要如下组件:(利用DBExpress组件实现三层形式的数据库应用)
SQLConnection,两个SQLClientDataSet,DataSource,DatasetProvider, ClientDataset
SQLConnection连接Interbase数据库,主SQLClientDataSet取自SQLConnection连接Customer表,
从SQLClientDataSet取自SQLConnection连接Order表,
DataSource的DataSet属性与主客户集连接
从客户集的MasterSource连接DataSource,MasterFields产生Customer表的CustNo
与Order表的CustON建立关联。
DataSetProvider的DataSet取自主客户集,然后将ClientDataSet的ProviderName
设成DataSetProvider,设置Active=true就可以了在客户端提取服务器端的数据了。
在ClientDataSet上右键单击保存成Binary或者XML文档
这样就实现了从服务器下载数据到本地客户集,然后保存成本地文件,方便携带编辑,
如果需要提交到服务器,可以再把本地数据发送到服务器的数据库。把单向数据集变成
可双向编辑方便携带的本地数据集。
试题138 组件 TcustomerClientDataSet->TclientDataSet
优点:1)基于内存 // 2)快速 //本地内存数据当然快
3)高效 //数据存储的格式 4)支持动态索引
5)支持撤销操作和汇聚 //汇聚 求平均值等
缺点: 1)单用户 //基于内存
试题139 在设计期创建
数据字段:data 占据物理存储
计算字段:不占据物理存储,每当需要时候动态计算受AutoCalcFields属性影响,
缺省(True)条件下在打开数据集进入编辑模式,窗体上移动焦点修改时候自动计算。
否则只有在打开数据集进入编辑模式时候重新计算。
内部计算字段:占物理存储,因此可以在其上创建索引,计算一次后存储在内存中,
当相关底层字段发生变化时候自动重新计算
查找字段:类似计算字段,当要依赖另外一个数据集
添加两个ClientDataSet组件,双击进入字段编辑:建立一个部门表和部门描述表
cdsCustomer: ID,LastName,FirstName,Department,Bonus,Names,DepartDesc,Salary
计算字段:Bonus, 内部计算字段:Names
在cdsCustomerCalcFields事件中编写:
CDSCustomerBonus.AsFloat:=CDSCustomerSalary.AsFloat*0.15;
if CDSCustomer.State=dsInternalCalc then //只有当内部字段需要计算时候
CDSCustomerNames.AsString:=CDSCustomerLastName.AsString+','+
CDSCustomerFirstName.AsString;
cdsDepartment: Dept,Description
其中Department->Dept DepartDesc->Description
然后 Create DataSet创建一个数据集,最后右击选择4种类型进行保存数据集这就是公文包的形式
试题140 运行其创建字段的方法
var
cds:TclientData;
begin
cds:=Tclientdataset.create(nil);
try
finally
end;
添加字段,使用AddFieldDef方法
var FieldDef:TfieldDef;
begin
FieldDef:=cds.FieldDefs.AddFieldDef;
FieldDef.Name:=’ID’;
FieldDef.DataType:=ftString;
FieldDef.Size:=20;
FieldDef.Required:=True;
end;
也可以使用:cds.FieldDefs.Add(‘Names’,ftString,20,true)
试题141 创建索引
设计时候创建:indexdefs属性
运行时候创建:AddIndex方法和DeleteIndex方法
ClientDataset1.AddIndex(‘ByName’,’LastName;FirstName’,[ixUnique]);
参数:索引名,索引字段名用分号隔开,选项
使用索引: IndexName属性如:clientDataset1.IndexName:=’Byname’;
或者 IndexFieldNames属性注意分号隔开。、
获取索引信息:GetIndexNames方法,结果放入Tstings对象中。
delphi 的一些注意点和知识点的更多相关文章
- Delphi基础语法的学习笔记和注意事项总结
以下是我在自学Delphi的时候,对一些注意点的简单总结,并没有什么系统性可言,只是一个学习时顺手记下的笔记,主要为了当时加深对知识的印象,并没有希望能在以后的复习和使用Delphi中有什么多大的参考 ...
- Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)
最近在开发中使用到了UpDown这个控件,但是因为之前没有使用过,所以很不熟悉,于是就编写了一个简单的demo来学习UpDown以及其结合TEdit的用法. 初步的常用功能的简介 目前(2015.08 ...
- 使用delphi+intraweb进行微信开发3—微信消息处理
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在第二讲使用delphi+intra ...
- delphi软件启动的顺序解密。
运行顺序 1.主窗体的oncreate -- onshow ---- onActivate ---- onResize --- 然后继续走,这个时候主窗体已经显示出来了,猜想delphi的思路是先让主 ...
- Delphi 中的全局快捷键+给指定窗体发送按键
[背景] 公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集.同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像.说干就干,一直想做全局快捷键了,网 ...
- 剑指Offer——知识点储备--Linux基本命令+Makefile
剑指Offer--知识点储备–Linux基本命令 1.linux下查看进程占用cpu的情况(top): 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参 ...
- Delphi 对象模型学习笔记(转)
摘要 Borland Object Pascal 对象模型(现在已经正是命名为 Delphi 语言)与其他 OOP 语言一样,都提供了一些基础服务: 如对象创建服务.对象释放服务.对象识别服务 ...
- delphi 组件安装工具开发
当一个组件的dpk文件数量较多且安装工具不顺手的时候,写一个属于自己的组件安装工具就很有必要了. 本例以 Dev Express 16.1.2 为例,设计一个组件安装工具,以便更深入理解 delphi ...
- Delphi - 手把手教你基于D7+Access常用管理系统架构的设计与实现 (更新中)
前言 从事软件开发工作好多年了,学的越深入越觉得自己无知,所以还是要对知识保持敬畏之心,活到老,学到老! 健身和代码一样都不能少,身体是革命的本钱,特别是我们这种高危工种,所以小伙伴们运动起来!有没有 ...
随机推荐
- Matrix [POJ3685] [二分套二分]
Description 有一个N阶方阵 第i行,j列的值Aij =i2 + 100000 × i + j2 - 100000 × j + i × j,需要找出这个方阵的第M小值. Input 第一行输 ...
- postman基本使用
一.安装 官网:https://www.getpostman.com/ Postman是一个Chrome的一个插件工具,我们可以通过Chrome的应用商店进行进行搜索并安装,安装完成会在桌面上显示一个 ...
- A network-related or instance-specific error occurred while establishing a connection to SQL Server
今天同事给我发了个图片过来, 服务器环境 sql 2000 + IIS7 看到这张图片,我先自己试了下,确实是有这个问题的,而且不是偶然性的,那么再看报错意思,在跟sql建立连接的时候发生了一个错误 ...
- foreach next 操作数组指针移动问题
2018年10月20日10:39:40 先说结论,foreach 维护的是一套属于自己的数组指针 会在操作数据的时候,分裂一套变量地址,即使你强制使用 & 取地址一样会分裂,不会引用同一套指针 ...
- python连接服务器上传文件,后台执行命令
上传文件 import os import paramikoimport logging from django.core.cache import cache from YunTai import ...
- java_基础_类加载
类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载. 类加载特性 : *在虚拟机的生命周期中一个 ...
- 在Fastreport里使用的CRC函数
如标题, 是在Fastreport的脚本里运行的CRC计算函数, 包括CRC-16/CRC-32 基本是从网上找的代码, 然后改出来的 至于为什么要在FR的脚本里运行....呵呵 不要在意这些细节(找 ...
- Create-React-App创建antd-mobile开发环境
Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 详细文档可前往链接:Create-React-App文 ...
- 如何让模拟的json数据接口能够正常的在手机上有效果
1. 确保手机与PC在同一个ip网下 这里我是通过------------360随身WIFI,20块钱淘宝上卖的,外观像U盘一样的,直接插在电脑的USB上就能在PC上创建一个WiFi,手机连接上就可以 ...
- ADB——连接手机的三种方式
有USB连接 硬件状态正常. 包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好. Android 设备的开发者选项和 USB 调试模式已开启. 可以到「设置」-「开发者选项」- ...