1.根据 Delphi 指令参考手册中
说明:
Assigned 函式在参数不为nil时传回True,表示指针已经指到某个内存地址,这个内存地址可能是一个对象地首地址,也可能在函数或过程中,声明一个指针变量,没有赋值为nil ,无乱的指向某处,这两个种情况,Assigned(指针变量)都不为nil , 函数放回True;
而参数为nil时则传回False。
Assigned 并不是一个真正的函数。
技巧:
用呼叫 Assigned 的方式来取代直接把参数拿来和nil比较,效率会更好。
2.这个问题要从内存方面来解释
当你建构一个物件 SomeComponet.Create(Owner);
系统会有一个指针指向这个对象
当你解构一个物件 SomeComponet.Free;
系统会将指针指到的东西杀掉,但是指标还是指在相同的位置
请注意计算机的资源是有限的,
所以可能下一步你的程序要跟系统要资源,
刚才的指针位置,就出现了其它的数据
If Assigned(SomeComponet) then SomeComponet := nil;
先检查这个对象有没有在其它地方被设成 nil,
然后再将它设成 nil 。
当我们无法预测使用者会如何操爆他的计算机,
程序员必须留意内存的管理。 小弟浅见...
3
function Assigned(var P): Boolean;
Description
Use Assigned to de ......
经典案例分享 暂不涉及分区表,表设计等 只从比较浅的角度来优化
1.先检查程序 检查模型层的设计与编码是否合理 将和这个表有有绑定的数据感知控件全部去掉。
2.估算一个数据的最大量 可以从设计角度 也可以从客户提供的数据分析 未来一定周期内的预增长量
3.将条码的长度保存起来,先用条码的长度进行过滤,如果80%以上的长度都是一个长度,则不用这个方法
4.将条码中的偶数个数保存在一个独立的数字字段中,先进行比较,应该先能排除一半
5.将条码的最后几位数据独立保存在一个数字字段中,先进行比较,数字比较速度应该比字段比较快
6.在根据业务看是否能用时间来划分,每天或每周,每月建立一张表
7.增加一int类型的主键。撤销条码的主键。
总的原则是将数据分类来查,不要每将都在一大堆中查找,就象在书店一样,可以按出版商,按书类型进行
书架分类,然后找书的时间才能快速定位。
/////////////////////////////////////////////////////////////////////////
经典一句SQL:
if not exists(select akey from a where akey='1234')
insert into a values(akey, b,c,d) ......
参考资料
“浅谈Object Pascal的指针”
“Delphi 指针入门”
基本知识
指针
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
注意:
(1)、指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。
(2)、一个指针变量仅仅是存储一个内存的地址,为指针所指向的内容分配空间是程序员要干的工作。
(3)、如果一个指针没有指向任何数据,它的值是n i l,它就被称为是零( n i l )指针或空(null) 指针。
(4)、要访问一个指针所指向的内容,在指针变量名字的后面跟上^运算符。这种方法称为对指针取内容。
(5)、指针的指针就是用来存放指针所在的内存地址的。
要搞清一个指针,需要了解以下内容:
(1)、指针的类型。
(2)、指针所指向的类型。
(3)、指针的值(即指针所指向的内存区)。
(4)、指针本身所占据的内存区。
指针大小
指针是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。指针类型变量本身要占内存,占用内存的大小与机器硬件、操作系统以及编译器都有关系,最直接的关系就是编译器,现在的编译器大都是32 ......
附件资料
*指针的使用(代码)
示例:简单的指针应用
代码:
procedure TForm1.Button2Click(Sender: TObject);
var
a: Integer;
p: ^Integer;
begin
with self.Memo1.Lines do
begin
a := 100;
Add('数据内容:' + inttostr(a));
//---
p := @a;
Add('数据地址:' + inttostr(Integer(p)));
//---
Add('数据地址指向的内容:' + inttostr(p^));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
type
PInteger = ^Integer;
PPInteger = ^PInteger;
var
a: Integer;
p: PInteger;
pp: PPInteger;
b ......
帮助页在http://delphi.about.com/cs/adptips2003/a/bltip0203_2.htm
自己在实现的过程中的具体过程如下:
function InstallInf(const PathName: string; hParent: HWND): Boolean;
var
instance: HINST;
begin
instance := ShellExecute(hParent,
PChar('open'),
PChar('rundll32.exe'),
PChar('setupapi,InstallHinfSection DefaultInstall 132 ' + PathName),
nil,
SW_HIDE) ;
Result := instance > 32;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
if InstallInf('F:\abc\arusb_lh.inf', 0) then
ShowMessage('OK');
end;
......
exit: 退出函数体
abort: 遇到异常,安静处理,就是不显示不提示
break: 退出当前循环体,包括for ,while, repeat等循环体
continue: 结束循环内的本次处理,继续从循环体的开始位置继续执行
Exit 是跳出当前代码块,也就是当前函数,跳出后是要继续向下执行的(如果有后续代码)。
Abort 是从 EAbort 过来的,可以激发 exception,其实质就是 Abort = RaiseException(),是一个不出现对话框的异常。所以 Abort 的行为和异常是一样的,其代码执行顺序也是follow异常的流程。
例如:
try
(1) //执行了
abort;
(2) //不执行
exception
(3) //执行了
end;
用 Abort 能够执行 exception 里边的代码,但是如果用 Exit,就直接离开,不管 exception。
例如:
procedure p1;
begin
p2;
p3;
end;
procedure p2;
begin
abort; //exit;
end;
procedure p3;
begin
//showmessage()..
end;
如果用 Abort,则执行不到 P3,如果用 Exit 就能够执行到 P3 ......