Delphi常用总结
(2008-03-30 23:45:17)
1.
定义leftstr,midstr时需uses strutils.
2.打开记事本需要在單元接口部分引用 SHELLAPI單元
3.获取计算机名与IP时,需定义uses winsock;
4.试用sndplaysound,需定义mmsystem。
4、VCL组件中引用CxGrid导出Excel表格时可引用cxExportGrid4Link,
如:procedure TForm1.BitBtn3Click(Sender: TObject);
begin
if sdlgEXCEL.Execute then
begin
ExportGrid4ToEXCEL(sdlgEXCEL.FileName,cxGrid1,True,True);
end;
end;
5.常用类型定义:
var
NT:TNOTIFYICONDATA;
TNOTIFYICONDATA:系统托盘;
EnableMenuItem:修改菜单;
GetSystemMenu:获取系统菜单
6.
常用ascII值用法:
"+" if (Key in [$6B]) then
begin
RzMaskEdit1.Text:='0';
Abort;
end;
"-" if (Key in [$6D]) then
"*"
"/"
ESC键:关闭程序
procedure TEatForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
if ord(key)=27 then
begin
close();
end;
end;
回车键:if ord(key)=13 then
Delphi流操作技巧总结
TMemoryStream的继承关系如下
TObject
|
TStream
|
TCustomMemoryStream
|
TMemoryStream
如何使用TMemoryStream?
其实TmemoryStream使用就跟TStream 一样
具体的属性,方法可看帮助。
下举一例:
如我想在内存中直接读写一个Bitmap,怎么办?
TmemoryStream帮了你大忙
var
BitmapMemoryStream:TMemoryStream;
Bitmap1:TBitmap;
procedure TForm.Button1Click(Sender:TObject);
begin
BitmapmemroyStream:=TmemoryStream.Create; file://建立MemoryStream
Bitmap1:=TBitmap.Create;
try
Bitmap1.LoadFromFile('d:/Bitmap1.bmp');
except
ShowMessage('Error On LoadFile bitmap1.bmp');
end;
end;
procedure TForm.Button2Click(Sneder:Tobject);
begin
if Assigned(Bitmap1) then
Bitmap1.SaveToStream(BitmapmemoryStream);
end;
procedure TForm.Button3Click(Sender:TObject);
begin
if BitmapMemoryStream<>nil then
begin
try
BitmapMemroyStream.SaveToFile('Bitmap1.str'); file://内存流保存,大小与
file://Bitmap1.bmp一样
except
showmessage('error on access memory!');
end;
end;
end;
procedure TForm.Button4Click(Sender:TObject);
var
Buffer:Array[0..53] of char;
begin
if Assigned( BitmapMemroyStream) then
try
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Read(Buffer,54);
if Buffer[0]='B' and Buffer[1]='M' then file://改写内存内容
begin
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);//将改写的内容写入文件
end;
except
ShowMessage('error On Access memroyStream');
end;
end;
大家可看到用TMemoryStream对与内存读写多么方便,当然其实用不着先建一Bitmap
可以用LoadFromFile直接引导文件,但是如果对于其它的内存流却是可以用上述方法
上文只是抛转引玉,其它的一些功能大家可以看帮助,自己琢磨!
还有很多其它的流式对象,大致都差不多,一通百通!
如何将一个流的内容写入到剪贴板中,并处理
这个技巧是参考Delphi的剪贴板类的实现来完成的。将一个流的内容放入剪贴板,
首先要注册你自已的格式,使用RegisterClipboardFormat()函数
然后做下面三步:
1.创建一个内容流,并将内容写进去
2.创建一个全局的内容区,并将流的内容写入
3.调用ClipBoard.SetAsHandle()将内容写入剪贴板
将内容写入剪贴板中
var
hbuf : THandle;
bufptr : Pointer;
mstream : TMemoryStream;
begin
mstream := TMemoryStream.Create;
try
{-- 处理流的代码 --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
try
bufptr := GlobalLock(hbuf);
try
Move(mstream.Memory^, bufptr^, mstream.size);
Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
finally
GlobalUnlock(hbuf);
end;
except
GlobalFree(hbuf);
raise;
end;
finally
mstream.Free;
end;
end;
请注意不要将分配的全局缓冲区释放,这个工作由剪贴板来完成,在读出数据中
你应该将它复制后处理。
将剪贴板内容读出来
var
hbuf : THandle;
bufptr : Pointer;
mstream : TMemoryStream;
begin
hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);
if hbuf <> 0 then begin
bufptr := GlobalLock(hbuf);
if bufptr <> nil then begin
try
mstream := TMemoryStream.Create;
try
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
mstream.Position := 0;
{-- 处理流的代码 --}
finally
mstream.Free;
end;
finally
GlobalUnlock(hbuf);
end;
end;
end;
end;
在Dephi中使用TStream读写数据的技巧
在Dephi中提供了一个抽象的数据类型TStream来支持对流式数据的操作。这些数据通常来自文件、数据库、内存对象、OLE对象等,TStream提供了统一、简洁的方法来进行数据的读写。在通常情况下,我们并不需要直接使用TStream类,对流式数据的读写封装在VCL控件的方法中。但是如果这些方法无法满足我们的要求,就需要自己手动控制数据的读写。
一、 TStream的常用的方法和属性:
---- 1. function Read(var Buffer; Count: Longint): Longint; virtual; abstract
---- 2. function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
---- 3. function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;
---- 4. property Position: Longint;
---- 5. property Size: Longint
---- Read,Write,Seek都是纯虚函数,提供了数据读写和定位的抽象的方法。Read方法将数据从Stream中读到Buffer缓冲区中,Write则实现相反的操作,返回值表示实际读写数据的大小。Seek提供了在Stream中移动数据指针的方法。参数Origin可以取soFromBeginning,soFromCurrent,soFromEnd 三个值,Offset是偏移量,返回值是当前Stream数据指针的位置。
---- Position表示了数据指针在Stream中的位置。这个属性是可读写的,它实际上就是通过调用Seek方法实现的,所以实际使用时使用这个属性更为方便一些。Size属性表示当前Stream的大小,对于不同的Stream,有些时候是只读的。
二、 Stream数据的读写。
---- 1. SaveToStream(Stream: TStream ); file://将类中的数据写到Stream的当前位置中
---- 2. LoadFromStream(Stream: TStream); file://从当前位置读入Stream里的数据
---- 实际使用时我们基本上只要使用上面两个函数就可以了。
三、 例子
---- TStream的继承树图如图1所示(略),实际使用时比较常用的是TFileStream,TMemoryStream,TblobStream,就以这三种流举一例说明具体用法。
---- 创建一个窗体Form1,放置三个按钮btnRead,btnInvert,btnSave和一个文件打开对话框OpenDialog1以及数据控件DataSource1,Table1,test.
---- 使用Dephi提供的Database Desktop创建一个表test,表里有一个字段域Image,数据库文件名存为test.db。在窗体上放置一个TDatabase控件dbTest,一个TTable控件Table1,一个DataSource控件DataSource1,一个TDBNavigator控件DBNavigator1。将dbTest与刚才Desktop创建的数据库相连,Table1的TableName属性设为test.db,DataSource1的DataSet属性设为Table1,DBNavigator1的DataSource属性设为DataSource1,VisibleButtons属性前四个设为TRUE。此外,将dbtest的Connected设为TRUE,Table1的Active属性设为TRUE,使得数据库一开始就处于打开状态。
---- 事件代码编写如下:
---- 1. btnRead的Click事件,这里演示了TFileStream的用法。
var
MS: TFileStream;
begin
if OpenDialog1.Execute then
begin
MS:=TFileStream.Create
(OpenDialog1.FileName, fmOpenRead);
Image1.Picture.Bitmap.LoadFromStream(MS);
MS.Free;
end;
end;
---- 2. btnInvert的Click事件,这里演示了TMemoryStream的用法。其中使用了Invert函数,这是一个简单的将图象反色的函数(仅对真彩图象有效),它返回一个指向处理过的图象数据块的指针。
var
M
S: TMemoryStream;
pImage: pointer;
begin
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
pImage:=Invert(MS.Memory, MS.size);
file://Memory属性是指向实际内存块的指针
MS.Write(pImage^,MS.size);
MS.Position:=0;
file://上一行代码使指针移到了Stream末尾,所以要复位
Image1.Picture.Bitmap.LoadFromStream(MS);
FreeMem(pImage);
MS.Free;
end;
Invert函数如下:
function TForm1.Invert
(pImage: pointer; size: Integer): pointer;
var
pData, pMem: PChar;
i: Integer;
begin
pMem:=AllocMem(size);
CopyMemory(pMem,pImage,size);
pData:=pMem+54;
for i:=0 to size-54-1 do
begin
pData^:=Char(not integer(pData^));
pData:=pData+1;
end;
Result:=pMem;
end;
---- 1. btnSave的Click事件,这里演示了TMemoryStream的另一种用法,将Stream中的数据写到数据库中去。
var
MS: TMemoryStream;
begin
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
Table1.Append;
file://在数据库中添加一条记录
TBlobField(Table1.FieldbyName
('image')).LoadFromStream(MS);
Table1.Post;
file://将所作的更新写入数据库
end;
---- 4. DBNavigator1的Click事件,这里演示了TBlobStream的用法,使用了和写入时不同的方法来读出数据库的图象数据。
var
MS: TStream;
begin
with Table1 do
MS:=CreateBlobStream
(FieldbyName('image'),bmRead);
Image1.Picture.Bitmap.
LoadFromStream(MS);
MS.Free;
end;
继 《Delphi + SDK 开发技巧》 和 《深入理解 Delphi 指针》 之后我们该进行总结了。
经过前面两篇文章的分析,应该对 Delphi 的指针概念包括内存组织形式已经相当清楚了。这里的总结就是提取分析精华,我们探究指针的原因是想 Delphi 的指针能像 C++ 那样使用,也就是如何使 Delphi 的指针像 C++ 指针那样能当数组指针来用。
终其原因,就是 C++ 中并没有严格规定普通指针和数组指针的区别,但 Delphi 中要明确指出来。
我们知道,数组指针是一个指针变量,它里面存放着数组在内存区的首地址,数组名就是指针,它可以使用 [] 运算符来取元素值。比如 p[2] := 5; p 是指针,存放着该数组在内存中的地址,无论是 C++ 还是 Delphi ,在这点上都是相通的。知道这种形式后,我们就来看看 Delphi 中怎么定义一个数组指针:
首先,你想定义一个指针,不管是什么类型,你先写上
type
TPMyArr = ^TMyArr;
表示我们定义一个指针类型。但还没完,TMyArr 我们还没定义,接下来就是要写出它的类型。很显然,我们这里要定义的是数组指针,因指针已经定义了,再定义一个数组就可以了。因此可以这么写
type
TPMyArr = ^TMyArr;
TMyArr = array [0..100] of Integer;
怎么样?Delphi 中定义东西还是蛮符合人的思维习惯的吧 —— 我们需要指针就先定义指针,没有类型马上给出类型。这样,一个指针就定义完了,可以拿到程序里使用它了。
那么我们会想,为什么要定义一个静态数组类型呢?明明指针当数组来用时不应该有长度限制的呀。的确,长度不应该有限制,但任何东西都不可能无限长吧,你如果需要访问的范围大些,可以把这数组定义的最大下标值改大些。你看在 Delphi 中有个 TByteArray 的字节数组,就定义得比较大,这个范围大家都应该够用了。数组的长度大小确定 还有个好处,就是将数组指针自增自减时可以使它移动一个数组的长度值,在上篇文章里大家通过调试应该看得很清楚了。
哦,那为什么不干脆定义这个数组为动态数组呢?要讨论这个问题,我们来一次正常思维推理吧。
在 C++ 中,只要一个指针指向一个内存区就可以像数组那样操作了。但是在 Delphi 中,因为类型严格,不能直接这么干,我们得定义一个数组指针。让我们接着看。
首先,一个数组需要有一块内存区(大小确定),对编译器来说就是一个数组类型(大小确定)。然后要用一个指针指向它,对编译器来说,就是定义指向这个类型的指针,我们称这个指针为 静态数组指针。数组长度已经确定了嘛。
清楚了没有?自始至终,我们的指针就一个,即 静态数组指针,没有第二个指针出现,而这个指针就指向一明确的内存区块,所以不可能用动态数组。
简单点说吧,为什么动态数组不可以呀,动态数组是什么?前面文章中已经调试过 N 次了,我想你马上就可以说出来,是的,就是指针呀。如果你使用动态数组,难道说你要的是指向指针的指针不成?这样解释应该清楚了吧?
另外要提一点的是,动态数组有自管理性,即 Delphi 会在编译时插入一些代码在源代码里维护这个数组,这对使用指针这种底层操作来说并不是件好事,有时会干扰你的意图,所以我们是不可以把它定义为数组指针来用的。
下面是数组指针的应用例子,我们来看一看:
procedure TForm1.Button2Click(Sender: TObject);
type
TPMyArr = ^TMyArr;
TMyArr = array [0..100] of Integer;
var
I: Integer;
PMyArr: TPMyArr;
p: Pointer;
begin
p := @I;
PMyArr := @I;
PMyArr[0] := 100;
TPMyArr(p)[0] := 200;
Caption := IntToStr(I);
end;
下面是使用动态数组指针来操作变量,这里的代码也说明动态数组不适合拿来做数组指针,这完全是它的自管理代码搞的鬼。
procedure TForm1.Button3Click(Sender: TObject);
type
TDArr = array of Integer;
var
// P: TDArr;
I: Integer;
P: TDArr; //这句放下面就不行了,会产生异常。 奇怪吧?
begin
P := @I;
P[0] := 100;
Caption := IntToStr(I);
end;
总结:要像 C++ 那样用指针操作数组,Delphi 中可以定义静态数组指针,然后指向你要操作的内存区块首地址,就可以像 C++ 那样随意操作内存了。
取数组在内存中的首地址,应该使用 @MyArr[0] 这种形式,无论它是在堆中还是在栈中,这样的写法能保证不会错,而且简单明了,因为它直接给出了内存地址值。不用担心效率问题,编译器都会做优化处理的,我们写的代码应该清晰简明地便于阅读就好。
程序设计和调试中的几点总结。
1. 不知道如何在函数中传递数组做实参,一开始连如何定义函数中的形参都不知道,还是用了帮助才了解,正式发现F1的帮助作的十分贴心,很好用,只是不太会用。我想,学好如何使用帮助能够大大缩短学习的周期。
数组实参的传递最后解决了,要在type 中对数组进行定义 ,如下操作:
Type
arr1=array[1..100] of integer ;
这样就定义了一个数组类型---arr1,以后声明数组只要 x :arr1 ; 而不用 x :array[1..100] of integer ;在数组的实参传递中只要使用数组名,如下:
//函数定义
function f1( x,y :arr1 ) :real ;
begin
.....
end;
//函数使用
p := f1(x,y) ; //x,y 分别为两个数组。
2. 在插值调试过程中,算法是以知的,具体的代码调试要求比较细心。对于变量的定义尤其要注意,应当遵守一定的规则,否则在以后的维护和修改中会带来许多不必要的麻烦,更有可能带来许多意想不到的错误,这一点在以后说明。对于书上已经写好的算法,可能由于你取数组下标不同(0或1),循环变量起点不同而有所差异,不能照抄。有时错误往往在一个符号(如:>写成< 等)。
3 . 对于delphi提供的函数、方法,他们在使用时都有一定的提示。比如 edit1. 当你.下去的时候就会列出此时可以使用的方法,如果没有找到你要用的方法只有2种情况:①没有该方法。②你在某地方有错误,使该方法不能显现出来。比如:inttostr(edit1.Text) ,在写好edit1. 后,找不到Text方法。因为用的函数错误,inttostr()中用的是整数值,但是 edit1.Text 是字符串类型,所以不会显示。用这种方法可以自我检测。
4. 对于变量的规范命名是十分必要和有用的,这在编写一些小程序中察觉不出来。因为在小程序中使用不了许多变量,容易管理,用脑子就可以记住,不会产生许多麻烦。而在大程序中,尤其是多人合力完成的程序,你自己定义的变量别人也许不知道,所以规范的命名有助于别人和自己管理和维护程序。如果定义不得当的话,有可能出现意想不到的错误。我在写Unit1的代码时就遇到了这样的情况。在写一次线性插值的时候,在处理边缘点的时候出现了错误。
错误是这样的:当输入点后,第一次按插值按钮,没有错误。但是在按一次按钮就出错了,这是为什么呢?为什么其他的插值没有出现类似问题呢?我进行了单步调试,发现了出错的地方是循环变量出错。当按第二次的时候,循环变量改变了,从而使结果出错。一看循环变量,原来是i ,而我又用i做了全局变量,由于全局变量中储存的是循环的次数,因而就没有在函数中定义i变量,而直接用全局变量代替局部变量。这样局部的改变影响到全局,就是错误的根源。所以,通过这件事,我深刻的了解到规范命名和注释的重要性。
5. 在对form进行退出过程的执行是一定要注意,如果你对任何一个form进行了操作,如果对其有影响的话,那么就要在调用form的退出过程是进行复原操作,这是必须的工作,也是很重要的工作之一。
在对form的退出过程的编写的时候要注意几个方面:首先,如果你要关闭的form中有一些可视的组件,如:edit,listbox,label,memo等等一些组件,那么就要将这些组件的内容恢复form刚创建时的样子,这是十分必须的一步工作。别小看了这一步工作,这有可能给你带来捆饶。大多数我们调用form使用的语句是formx.show 。而该语句仅仅把你所要调用的form显示出来而不做其他任何事情,更别说是初始化工作,所以我们要对该form在上次退出的时候就进行初始化工作,以便为我们本次的操作打好基础。否则,上次操作留下的数据会继续在form中显示,从而影响我们本次的操作。
其次,在form的退出过程的编写也要注意某些有漏洞的地方,初学者往往容易犯这样的错误。比如:大家往往习惯与用form.close来关闭窗口,这是对的,有时我们会单独做一个退出按钮,里面调用了form.close,并且对本form进行了还原,这一切都很正常。但是在他使用form自带的叉型图标来关闭form时就会遇到麻烦。再次进入时会发现上次退出的时候没有进行还原操作,但是还原操作的代码明明写了,这是为什么呢?因为form自带的关闭只调用了form.close,而不进行其他操作,解决的方法就是在form的Onclose事件中加入还原代码就可以了。而在自己添加的退出按钮的过程代码段中也只需要用一句show.close,还原的是就交给了OnClose Event来完成。
再者,在form关闭的时候,如果对其他的form有过改动,必须要还原,否则会出现上面讲过的错误。有时两个form互相影响,就要互相还原。这样难免就要用到对方form的unit,用语句uses unitx ;而这也有规定。在interface 里,是不能互相uses 的。如果在interface 里互相uses,系统会报错 Circle use ;所以只能够一个在interface中,另一个在implementation 里uses,或者两个都在implementation里uses。
6. 文件的共享,这是一个减少代码量和减少重复劳动,减少代码冗余的好方法。具体来说就是写一个公共的unit,把多个form都要用到的函数、过程、数据、类型等等都放在一起,这样便于管理和修改。在每个要用到该unit中的函数的unit中uses一下就可以了。不过有一点很重要,那就是要为每一个函数,过程写一个声明,这样的话别的unit才能够看见这些函数和过程。否则,仅仅在implementation中写了函数、过程的实现而不写声明的话,他们只在本unit可见,着一点很重要。切记,切记!
7. 对于命名规则我再多说一点,在给变量命名的时候要考虑到他的逻辑性。也就是说给这个变量起的名字是有意义的,能够让人一看见就能够知道他是干什么用的。这样不仅仅方便维护人员管理与维护,也方便自己理清思路,可以很快的判断出逻辑表达试。在这方面,逻辑变量的体现最为明显,比如: 定义一个逻辑变量 flag 这样我们就可以看出 flag 是标记的意思。那么当有标记也就是 flag=true 时,我们可以写成
if flag then ……
而不是写成 if flag=true then …… 对于前一种写法他的逻辑性更强,而且易于我们的逻辑思维。但是初学者往往会用后一种写法,这是对 Boolean 类型不太熟悉造成的,我们要养成习惯。尽量使自己的程序的逻辑性强,而且遵守编程规范,这样会给我们和他人节省很多宝贵的时间和精力。在给函数的形参和实参起名字的时候也要有意义,这样才不至于搞混淆。我就遇到了这样的情况,在该设计的 unit2 中,做的是有关积分的东西,积分分为上限和下限,这两个限定一旦搞错就会出现错误,如果是全部都搞错还比较容易纠正,上限和下限颠倒过来只是值变成相反数。如果一部分搞错,一部分是对的,那么就错的有够离谱了,这样的错误往往不能从错误的结果加以判断,只能分段查找程序中的问题。看是否在那里出错,如此而已,费时费力,所以要进行合理的命名是十分重要的。
8. 调试工作中很重要的一步就是确定错误的位置,这个工作已经由编译器代替我们完成了。有时后编译器完成的工作只是初步,具体的位置还是要求我们自己去找出来。有一些错误的定位由于某些原因会和实际出错的位置差别比较大,这些位置的查找是要靠编程的经验和仔细的观察才能够找出来的,在实际中,良好的书写习惯会帮助我们克服这些实际出错位置和报错位置差别比较大的错误。这些错误中,比较典型的就是:多写或漏写 begin 或 end ,使之没有配对,从而造成程序的出错。有时候对 ;,(),[ ] 的使用也会造成同样的效果。克服这些错误就是要养成良好的书写习惯,比如: 在写程序的时候,一般在同一个循环内的语句都要向左对齐,一个二重循环的内循环要向内缩进一些,用来区别与外循环。在写 begin 和end 的时候就要一起写,对于括号(),[ ] 也是一样的处理,这样一起写的好处是以后不会漏掉另一个这样我们在写程序的时候就不需要记着前面我还在哪儿用了一个 begin,这里要写一个 end 与之对应。这样的好处在写函数表达式的时候显得尤其好用。在一个比较复杂的表达式中如果括号的层数超过3层就十分难以看清楚,这时良好的书写习惯就会帮了你的大忙了。你不会为了找另一个对应的括号而瞅花了眼,只要一步一步的从里到外的写出来,不会有太大困难。当然,别人要看懂是要花一定时间的,但是你写的却不会有错。
除了定位错误之外还要改正错误,当然我前面讲的方法大都是改正错误,但是最有效的就是看编译器给你的提示信息。这是我们查找错误的出发点,其中的一些小错误很容易就能看出来,比如:变量没有声明,在 else 前加了 ; ,类型不对应,函数参数传递错误等。而有一些错误是从信息中看不出来的,语法的错误不太难纠正,但是算法的错误就不好纠正了。这就要求我们用调试工具来一步步找出错误。其中最常用到的工具就是断点、单步进入、单步跳出,以及 观察变量。断点可以帮助我们将程序分段,看一看到底是在那一部分出了错,以便于查找。不过在调试完毕以后一定要记着把断点都清除掉,不然你的程序会在运行时突然中断,而你也查不出错。我个人比较爱用的是单步进入+单步跳出+Add Watch 这是调试程序的一个必由之路。写程序并不难,调试程序的高手才是很有本事的人,我一向是这么认为。单步进入 就是一步一步的调试,边解释边运行,这样便于我们找到错误。单步跳出 是为了帮助单步进入的,单步跳出对于一个过程或者是一个函数是将其看成一条语句,一下子跳过去,这样节省了那些正确的部分的检查。也可以用 运行到光标处这一项,两者都是缩短正确的程序段的检查时间。 Add Watch 是一个非常好用的东东,你可以在里面加入你想要监视的变量名称。则该变量的值会在表中显示出来,他配合单步操作,可以看见你想要知道的变量在每一步的变化情况是否和预料的一样变化。如果有出入则可以对该语句进行分析,从而找出出错的原因。可见单步操作+Add Watch 是调试程序必不可少的步骤,也是最有效的方法。但是,在程序比较复杂,调用函数比较多的时候,单步进入就不是那么好用了。因为往往在一个按钮事件中有用到好几个procedure 或者 function ,在每一个function或者procedure中往往又要调用别的function和 procedure。所以用单步进入很容易让人搞的晕头转向,不知所云。假如用到了第三方的控件,那就更不知道程序运行到什么地方了。所以,在程序量比较大,而且调用函数比较多的地方,单步操作就不太好用了。这时我们最好使用断点工具,他使用的意义和单步操作的意义是一样的,就是为了看清楚程序是否按我们所设计的思路在运行。断点的好处就是在于他可以使我们在希望停止的地方暂停,而其余不需要停止的地方则按原来的速率进行运行。结合Add Watch,我们就可以看见整个程序运行的过程了。断点的增加是比较有讲究的,一般情况下都要在以下几个地方加上断点: ①循环语句的入口处,在此处加上断点可以监视进入循环的数据,看看是否在循环以前就有错误。在每个循环前放一个就象作一个备份一样,看看会出什么样的结果。 ②在循环语句的最后一句设置一个断点,这样就可以监视每一次的循环过程,看看是在那一次循环出错。还有一个好处就是这样在循环内部设置一个断点可以防止无限循环。万一你编写的程序出错,出现了无限循环,这样会造成系统资源急剧下降,从而容易造成死机。如果你没有备份这次所做的工作的话,那真是欲哭无泪了。 ③在循环完成处设置一个断点,这样可以把入口处和出口处进行对照,看一看该循环是否按照你的要求正常工作,可以很快的判断出循环语句的正确性。 ④在判断语句前设置断点,这个断点主要的目的是观察此时的Add Watch 中的值。此时的各个判断参数的值可以看出程序是否按照正常步骤进行,或者在判断语句中出现了逻辑错误,这些都是很常见的断点设置处。
9. 设置procedure 和function 的各种用法。不要小看了var 这三个字,我们通常在定义变量中使用,而他的一个很重要的用途就是在 procedure 或者function中设置变参。变参在普通的procedure 和function中不是很常用,但是却有着十分重要的用途。如果你想编写一个函数,要返回两个值,因为这两个值是在同一个函数中得出的。所以想要有两个返回值,但是函数只能有一个返回值,这时该如何解决呢?变参就派上了用场,在函数和过程中使用的变参会改变实参的值就象传址函数一样。这样的话,在一个过程或者函数中定义多个变参就可以返回多个参数了。
实现用鼠标点住窗体的任意位置,拖动窗体
程序TForm1.FormMouseDown(发件人:TObject的;按钮:TMouseButton;
移位:TShiftState,X,Y:整数);
开始
releasecapture;
执行(WM_SYSCOMMAND,$ F012,0);
结束;
2。
/ /屏蔽系统功能键;
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,无,0);
/ /恢复功能键
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,零,0);
3。
而Frm_Login.Login_Off =假做
Application.ProcessMessages; / /等待,并不断检测Frm_Login.Login_Off
ProcessMessages不允许应用程序进入空闲状态,而的handleMessage一样。
4。
/ /不在任务栏上显示图标
SetWindowLong函数(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
5。
刷新局部屏幕
Rect.Left:= X - 50;
Rect.Top:= Y - 50;
Rect.Right:= X +85;
Rect.Bottom:= Y +85;
RedrawWindow(0,@矩形,0,RDW_ERASE或RDW_INVALIDATE或RDW_INTERNALPAINT或RDW_ERASENOW或RDW_ALLCHILDREN);
睡眠(5)/ /若不延时,将不能刷新局部屏幕
6。
Alphablend:= TRUE; / /呵呵,这个就是让窗口变的透明的办法了
Alphablendvalue:= 100;
FormStyle:= fsStayOnTop / /让窗体总在最前面
7.function TRUNC(X:扩展):Int64的; / /将实际转为整数形
8.delphi + ADO远程连接SQL Server 2000的服务器的问题,
ADOConnection.ConnectionString:=
“供应商= SQLOLEDB.1;密码= YourPWD;用户ID = YourID;'+
“初始目录=数据库名,数据源=数据服务器名;'+
“网络图书馆= DBMSSOCN,网络地址=所在的IP,1433”;
ADOConnection.Open;
9,通过计算机名取得IP
VAR
HostEnt:PHostEnt;
WSADATA:TWSAData;
开始
调用WSAStartup(2,WSADATA);
HostEnt:=的gethostbyname(PChar类型(Edit2.Text));
与HostEnt ^做
SIP:=格式(“%d年%d%d月%d”,[字节(h_addr ^ [0]),字节(h_addr ^ [1]),字节(h_addr ^ [2]),字节(h_addr ^ [3 ])]);
WSACleanup;
10,自动填写IE的网页的输入框的内容}
{程序TForm1.PutData;
VAR
ShellWindow:IShellWindows;
nCount:整数;
spDisp:IDispatch的;
I,J,X:整数;
六:OleVariant;
IE1:IWebBrowser2的;
IDoc1:IHTMLDocument2;
IELC:IHTMLElementCollection;
S,S2:字符串;
HtmlInputEle:IHTMLInputElement;
HtmlSelEle:IHTMLSelectElement;
开始
ShellWindow:= CoShellWindows.Create;
nCount:= ShellWindow.Count;
对于i:= 0 nCount - 1做
开始
六:= I;
spDisp:= ShellWindow.Item(六);
如果spDisp =无再继续;
spDisp.QueryInterface(IWebBrowser2的,IE1);
如果IE1 <>无则
开始
IE1.Document.QueryInterface(IHTMLDocument2,iDoc1);
如果iDoc1 <>无则
开始
IELC:= idoc1.Get_all;
对于j:= 0 ielc.length - 1做
开始
Application.ProcessMessages;
spDisp:= ielc.item(J,0);
如果SUCCEEDED(spDisp.QueryInterface(IHTMLInputElement,HtmlInputEle)),那么
与HtmlInputEle做
开始
S2:= Type_;
S2:=大写(S2);
/ /我把所有的输入都填上尝试,复选框都打勾
如果(StrComp(PChar类型(S2),“文”)= 0)或(StrComp(PChar类型(S2),“密码”)= 0),则
价值:='尝试'/ / S:= S +#9 +价值
否则,如果StrComp(PChar类型(S2),“CHECKBOX”)= 0,则
开始
检查:= TRUE;
结束;
结束;
如果SUCCEEDED(spDisp.QueryInterface(IHTMLselectelement,HtmlSelEle)),那么
与HtmlSelEle,Memo1.Lines做
开始
S:= S +#9 + IntToStr(selectedIndex值+1)/ /这个是获取数据了
结束;
结束; / /结束
Memo2.Lines.Add(S);
退出;
结束;
结束;
结束;
结束;
}
11访问作者主页:ShellExecute的(句柄,零,PChar类型('http://www.jijian.sdu.edu.cn/shaojian“),零,零,SW_SHOWNORMAL);
12,给MDI主窗口加背景
在MDI程序中,由于MDI的主窗口一般的功能是提供子窗口显示的位置和提供菜单,工具条,状态条等,而窗口的客户区则一般不会有其它的用途,如果在这里画上一些软件的标志,公司的标志或者其它的背景图案的话,不仅可以使MDI的主窗口更加充实,美观,而且还可以更加突出公司的形象和增加公司标志在客户心中的地位。
由于MDI主窗口的特性,使用普通的OnPaint和使用TImage等方法都不会产生作用。下面将用编写一个简单的MDI程序来介绍如何实现。
第一步:打开德尔福(Delphi的1,2,3都可以),创建一个新的工程。
第二步:将Form1中的FormStyle设置为fsMDIForm,设置成MDI的主窗口。
第三步:在Form1中上增加一个图像元件,并选择要设置的背景到形象的图片中。
第四步:在Form1中的私人中定义:
FClientInstance,
FPrevClientProc:TFarProc;
程序ClientWndProc(VAR消息:TMessage);
第五步:在实现(实施)中加入上述过程的具体内容:
程序TForm1.ClientWndProc(VAR消息:TMessage);
VAR
MYDC:HDC;
RO,钴:字;
开始
有消息做
案件味精
WM_ERASEBKGND:
开始
MYDC:= TWMEraseBkGnd(消息)DC;
反渗透:= 0 TO ClientHeight DIV Image1.Picture.Height DO
为协办:= 0至ClientWIDTH DIV Image1.Picture.Width DO
BitBlt函数(MYDC,CO * Image1.Picture.Width,RO * Image1.Picture.Height,
Image1.Picture.Width,Image1.Picture.Height,
Image1.Picture.Bitmap.Canvas.Handle,0,0,SRCCOPY);
结果:= 1;
结束;
其他
结果:= CallWindowProc(FPrevClientProc,ClientHandle,味精,WPARAM,LPARAM);
结束;
结束;
第六步:在Form1中的创建事件中加入:
FClientInstance:= MakeObjectInstance(ClientWndProc);
FPrevClientProc:=指针(GetWindowLong(ClientHandle,GWL_WNDPROC));
SetWindowLong函数(ClientHandle,GWL_WNDPROC,LongInt(FClientInstance));
上面的步骤已经完成了MDI主窗口背景图案的设置,下面可以增加一个MDIChild窗口,实现MDI程序。
第七步:新增加一个表格,并将FormStyle设置为fsMDIChild。
现在你可以编译运行这个程序,你会发现,图像元件并不会在表上显示出来,但是整个窗体的客户区域被图片中的图像所铺满。
(1)按下CTRL和其它键之后发生一事件。
程序TForm1.FormKeyDown(发件人:TObject的; VAR重点:字;
移位:TShiftState);
开始
如果(ssCtrl在Shift)和(键= 67),则
showmessage('的KeyDown按Ctrl + C');
结束;
(2)。DBGRID中用回车键代替Tab键。
程序TForm1.DBGrid1KeyPress(发件人:TObject的; VAR键:字符);
开始
如果键=#13然后
如果当时的ActiveControl = DBGrid1
开始
。TDBGrid中(的ActiveControl)的SelectedIndex:= TDBGrid中(的ActiveControl)的SelectedIndex + 1;
重点:=#0;
结束;
结束;
(3)。DBGRID中选择多行发生一事件。
程序TForm1.Button1Click(发件人:TObject的);
VAR
我:整数;
bookmarklist:Tbookmarklist;
书签:tbookmarkstr;
开始
书签:= adoquery1.Bookmark;
bookmarklist:= dbgrid1.SelectedRows;
试试
开始
对于i:= 0 bookmarklist.Count - 1做
开始
adoquery1.Bookmark:= bookmarklist [I];
与adoquery1做
开始
编辑;
。fieldbyname('千年发展目标“)AsString:= edit2.Text;
职位;
结束;
结束;
结束;
最终
adoquery1.Bookmark:=书签;
结束;
结束;
(4)表格的一个出现效果。
程序TForm1.Button1Click(发件人:TObject的);
VAR
R:thandle;
我:整数;
开始
对于i:= 1 TRUNC(width/1.414)做
开始
R:= CreateEllipticRgn(TRUNC(宽度/ 2)- I,TRUNC(身高/ 2)- I,TRUNC(宽度/ 2)+ I,TRUNC(身高/ 2)+ I);
SetWindowRgn(手柄,R,TRUE);
Application.ProcessMessages;
睡眠(1);
结束;
结束;
(5)用回车代替Tab键在编辑框中移动隹点。
程序TForm1.FormKeyPress(发件人:TObject的; VAR键:字符);
开始
如果key =#13则
开始
如果没有(的ActiveControl是Tmemo),那么
开始
关键:=#0;
keybd_event(vk_tab,mapvirtualkey(vk_tab,0),0,0);
结束;
结束;
结束;
(6)。进度列加上色彩。
常量
{$ EXTERNALSYM PBS_MARQUEE}
PBS_MARQUEE = 08;
VAR
FORM1:TForm1;
实施
{$ R *. DFM}
使用
CommCtrl;
程序TForm1.Button1Click(发件人:TObject的);
开始
/ /设置背景颜色为蓝绿色
Progressbar1.Brush.Color:= clTeal;
/ /设置栏的颜色为黄色
SendMessage消息(ProgressBar1.Handle,PBM_SETBARCOLOR,0,clYellow);
结束;
(7)。住点移动时编辑框色彩不同。
程序TForm1.Edit1Enter(发件人:TObject的);
开始
(如TEDIT发件人)颜色:= clred;
结束;
程序TForm1.Edit1Exit(发件人:TObject的);
开始
(如TEDIT发件人)颜色:= clwhite;
结束;
(8)备份和恢复
程序TForm1.Button1Click(发件人:TObject的);
开始
如果OpenDialog1.Execute然后
开始
试试
adoconnection1.Connected:= FALSE;
adoconnection1.ConnectionString:='供应商= SQLOLEDB.1;坚持安全信息= FALSE;用户ID = SA;初始目录=掌握;资料来源=朋友 - YOFZKSCO;'+
“使用准备= 1程序;自动翻译= TRUE;数据包大小= 4096;工作站ID =朋友 - YOFZKSCO;用于数据加密=假;与列的排序规则标签时可能=假”;
adoconnection1.Connected:= TRUE;
与adoQuery1做
开始
关闭;
SQL.Clear;
SQL.Add(“备份数据库SFA到磁盘='''+ opendialog1.FileName +'''');
ExecSQL;
结束;
除非
ShowMessage ('±?·叶§ · U');
出口;
结束;
结束;
Application.MessageBox(1 § 2 ×英镑EY Ÿ ± ° Y3é1 |','IAE',MB_OK + MB_ICONINFORMATION????);
结束;
程序TForm1.Button2Click(发件人:TObject的);
开始
如果OpenDialog1.Execute然后
开始
试试
adoconnection1.Connected:= FALSE;
adoconnection1.ConnectionString:='供应商= SQLOLEDB.1;坚持安全信息= FALSE;用户ID = SA;初始目录=掌握;资料来源=朋友 - YOFZKSCO;'+
“使用准备= 1程序;自动翻译= TRUE;数据包大小= 4096;工作站ID =朋友 - YOFZKSCO;用于数据加密=假;与列的排序规则标签时可能=假”;
adoconnection1.Connected:= TRUE;
与adoQuery1做
开始
关闭;
SQL.Clear;
SQL.Add(“还原数据库SFA从磁盘='''+ opendialog1.FileName +'''');
ExecSQL;
结束;
除非
ShowMessage ('???' ê § · U');
出口;
结束;
结束;
Application.MessageBox(1 § 2 ×英镑EY Ÿ '3 E1 |','IAE',MB_OK + MB_ICONINFORMATION?????);
结束;
(9)。查找局域网上的SQLSERVER报务器。
使用Comobj;
程序TForm1.Button1Click(发件人:TObject的);
VAR
SQLSERVER:变异;
ServerList:变式;
我,nServers:整数;
sRetValue:字符串;
开始
SQLSERVER:= CreateOleObject('SQLDMO.Application');
ServerList:= SQLServer.ListAvailableSQLServers;
nServers:= ServerList.Count;
对于i:= 1 nservers做
ListBox1.Items.Add(ServerList.Item(I));
SQLSERVER:= NULL;
serverList:= NULL;
结束;
(10)。窗体打开时的淡入效果。
程序TForm1.FormCreate(发件人:TObject的);
开始
AnimateWindow(手柄,400,AW_CENTER);
结束;
(11)。动态创建窗体。
程序TForm1.Button1Click(发件人:TObject的);
开始
试试
Form2的:= Tform2.Create(个体经营);
form2.ShowModal;
最终
form2.Free;
结束;
结束;
程序TForm1.FormClose(发件人:TObject的; VAR行动:TCloseAction);
开始
行动:= cafree;
结束;
程序TForm1.FormDestroy(发件人:TObject的);
开始
FORM1:=零;
结束;
(12)。复制文件。
程序TForm1.Button1Click(发件人:TObject的);
开始
试试
copyfileA(PChar类型('C:/ AAA.txt'),PChar类型('D:/ AAA.txt“),FALSE);
除非
showmessage('sfdsdf');
结束;
结束;
(13)。复制文件夹。
使用shellAPI;
程序TForm1.Button1Click(发件人:TObject的);
VAR
lpFileOp:TSHFileOpStruct;
开始
与lpFileOp做
开始
Wnd的内容:= Self.Handle;
wfunc:= FO_COPY;
pFrom中:= PChar类型('C:/ AAA');
PTO:= PChar类型('D:/ AAA');
FFLAGS:= FOF_ALLOWUNDO;
hNameMappings:=零;
lpszProgressTitle:=零;
fAnyOperationsAborted:= TRUE;
结束;
如果SHFileOperation(lpFileOp)<> 0,则
ShowMessage(“删除失败”);
结束;
(14)。改变DBGrid中的选定色。
程序TForm1.DBGrid1DrawDataCell(发件人:TObject的;常量矩形:TRect;
现场:TField;状态:TGridDrawState);
开始
如果gdSelected然后在状态
SetBkColor(dbgrid1.canvas.handle,clgreen)
其他
setbkcolor(dbgrid1.canvas.handle,clwhite);
dbgrid1.Canvas.TextRect(RECT,0,0,field.AsString);
dbgrid1.Canvas.Textout(rect.Left,rect.Top,field.AsString);
结束;
(15)。检测系统是否已安装了ADO。
使用注册表;
功能Tform1.ADOInstalled:布尔;
VAR
R:TRegistry;
年代:字符串;
开始
R:= TRegistry.create;
试试
用R做
开始
RootKey:= HKEY_CLASSES_ROOT;
OpenKey('/ ADODB.Connection / CurVer“,FALSE);
S:= ReadString ('');
如果s <> ''然后结果:= TRUE
否则结果:= FALSE;
CloseKey;
结束;
最终
r.free;
结束;
结束;
程序TForm1.Button1Click(发件人:TObject的);
开始
如果ADOInstalled然后showmessage('这台计算机已经安装了ADO');
结束;
(16)取利主机的IP地址。
使用WinSock;
程序TForm1.Button1Click(发件人:TObject的);
VAR
IP:字符串;
IPstr:字符串;
缓冲区:ARRAY [1 .. 32]的字符;
我:整数;
WSData:TWSAdata;
主持人:PHostEnt;
开始
如果调用WSAStartup(2,WSData)<> 0,则
开始
showmessage('WS2_32.DLL3 êˉê § · U??');
退出;
结束;
试试
如果GetHostname(@缓冲区[1],32)<> 0,则
开始
showmessage('?óDμ?μ?÷?ú ??.');
退出;
结束;
除非
showmessage('óD3é1 |??·μ???÷? Ú ??');
退出;
结束;
主持人:=的gethostbyname(@缓冲区[1]);
如果主机=无则
开始
showmessage('IPμ??·?a ??.');
退出;
年底
其他
开始
edit2.Text:= Host.h_name;
edit3.Text:= CHR(host.h_addrtype +64);
对于i:= 1至4做
开始
IP:= inttostr(ORD(host.h_addr ^ [I - 1]));
如果i <4,然后
ipstr:“'= ipstr + IP +
其他
edit1.Text:= ipstr + IP;
结束;
结束;
WSACleanup;
结束;
(17)取得计算机名。
功能tform1.get_name:字符串;
VAR计算机名:PChar类型,大小:DWORD;
开始
GetMem(计算机名,255);
大小:= 255;
如果GetComputerName(计算机名,大小)= false,则
结果:= ''
其他
结果:=计算机名;
FreeMem(计算机名);
结束;
程序TForm1.Button1Click(发件人:TObject的);
开始
label1.Caption:= get_name;
结束;
(18)。取得硬盘序列号。
功能tform1.GetHDSerialNumber:LongInt;
{$ IFDEF WIN32}
VAR
PDW:PDWORD;
MC,FL:DWORD;
{$ ENDIF}
开始
{$ IFDEF WIN32}
新(PDW);
GetVolumeInformation(“C:/',零,0,PDW,MC,FL,零,0);
结果:= PDW ^;
处置(PDW);
{$ ELSE}
结果:= GetWinFlags;
{$ ENDIF}
结束;
程序TForm1.Button1Click(发件人:TObject的);
开始
edit1.Text:= inttostr(gethdserialnumber);
结束;
(19)。限定光标移动范围。
程序TForm1.Button1Click(发件人:TObject的);
VAR
rect1:trect;
开始
rect1:= button2.BoundsRect;
mapwindowpoints(句柄,0,rect1,2);
clipcursor(@ rect1);
结束;
程序TForm1.Button2Click(发件人:TObject的);
VAR
screenrect:trect;
开始
screenrect:RECT =(0,0,screen.Width,screen.Height);
clipcursor(@ screenrect);
结束;
(20)。限制编辑框只能输入数字。
程序TForm1.Edit1KeyPress(发件人:TObject的; VAR键:字符);
开始
如果不是(在['0'.. '9 ','.',# 8]键),则
开始
关键:=#0;
的MessageBeep(0);
结束;
结束;
(21)。DBGrid的中根据任一条件某一格变色。
程序TForm_main.DBGridEh1DrawColumnCell(发件人:TObject的;
const的矩形:TRect; DataCol:整数;色谱柱:TColumnEh;
状态:TGridDrawState);
开始
如果(TRIM(DataModule1.ADOQuery1.FieldByName('dczt')。AsString)='OK'),那么
开始
如果datacol = 6则
开始
DbGrideh1.Canvas.Brush.Color:= clGradientActiveCaption;
DbGrideh1.DefaultDrawColumnCell(矩形,datacol,列,状态);
结束;
结束;
结束;
(22)。打开文字文件。
程序TfjfsglForm.SpeedButton4Click(发件人:TObject的);
VAR
MSWORD:变式;
STR:字符串;
开始
如果修剪(DataModule1.adoquery27.fieldbyname('fjmc')。asstring )<>''然后
开始
STR:=修剪(。DataModule1.ADOQuery27.fieldbyname('fjmc')AsString);
MSWORD:= CreateOLEObject(“Word.Application ');//
MSWord.Documents.Open('D:/ Program Files文件/共同文件/ SFA /'+ STR,TRUE); / /
MSWord.Visible:= 1; / /
STR :='';
MSWord.ActiveDocument.Range(0,0); / /
MSWord.ActiveDocument.Range.InsertAfter(STR );//? úWord?D??ó ×?·?'标题“
MSWord.ActiveDocument.Range.InsertParagraphAfter;
年底
其他
showmessage ('');
结束;
(23)字文件传入和传出数据库。
使用IdGlobal;
程序TdjhyForm.SpeedButton2Click(发件人:TObject的);
VAR
sfilename:字符串;
功能BlobContentTostring(常量名:字符串):字符串;
开始
与Tfilestream.Create(文件名,fmopenread)做
试试
中用SetLength(结果,大小);
阅读(指针(结果)^,大小);
最终
免费;
结束;
结束;
开始
如果opendialog1.Execute然后
开始
sfilename:= opendialog1.FileName;
DataModule1.ADOQuery14.Edit;
。DataModule1.ADOQuery14.FieldByName('字')AsString:= blobcontenttostring(sfilename);
DataModule1.ADOQuery14.Post;
结束;
结束;
程序TdjhyForm.SpeedButton1Click(发件人:TObject的);
VAR
sfilename:字符串;
BS:Tadoblobstream;
开始
BS:= Tadoblobstream.Create(TBLOBfield(DataModule1.ADOQuery14.FieldByName('字')),bmread);
试试
sfilename:= extractfilepath(application.ExeName)+修剪(。DataModule1.adoquery14.fieldbyname('hybh')AsString);
sfilename:= sfilename +'.'+' DOC“;
bs.SaveToFile(sfilename);
试试
djhyopenform:= Tdjhyopenform.Create(个体经营);
djhyopenform.olecontainer1.CreateObjectFromFile(sfilename,FALSE);
djhyopenform.OleContainer1.Iconic:= TRUE;
djhyopenform.ShowModal;
最终
djhyopenform.Free;
结束;
最终
bs.free;
结束;
结束;
(24)中文标题的提示框。
程序TdjhyForm.SpeedButton5Click(发件人:TObject的);
开始
如果Application.MessageBox('',MB_YESNO + Mb_IconWarning)= Id_yes然后DataModule1.ADOQuery14.Delete;
结束;
(25)。运行一应用程序文件。
WinExec(“HH.EXE D:/程序文件/共同文件/ MyshipperCRM电子销售帮助/ MyshipperCRM电子销售指南Help.chm”,SW_NORMAL);
1,关于MDI主窗体背景新解
在表格中添加图像控件
设BMP图象
名称为IMG_BK
在Foem的创建事件中写入
Self.brush.bitmap:= img_bk.picture.bitmap;
2,在标题栏处画VCL控件(一行解决问题!)
在形式的的OnPaint事件中
控件pointto(的GetDC(0),左,上);
3编辑中只输入数字
SetWindowLong函数(Edit1.Handle,GWL_STYLE,
GetWindowLong(Edit1.Handle,GWL_STYLE)或
ES_NUMBER);
4,类似MDI方式新解
在要设置孩子的OnCreate中方式下写入:
self.parent:='要设置为MainForm中的表“;
5。屏幕的刷新(只需一行!)
RedrawWindow(0,零,0,RDW_ERASE或RDW_INVALIDATE或RDW_ALLCHILDREN);
| |
--- ----
处理RGN(可刷新局部屏幕)
6,类似DOS下的CLS指令的WINDOWS指令!
paintdesktop(的GetDC(0));
7,扩展控件新功能
在编程中,我们经常要控制控件的动作,但该控件又没有提供该方法
这时,可通过发消息给该控件,以达到我们的目的!
如:
button1.perform(WM_KEYDOWN,13,0);
listbox1.perform(WM_VSCROLL,sb_linedown,0);
等等可少去重载之苦!!!!!
8。闪烁标题如打印机超时(一行)
形式放一定时器控件
一次事件中写入;
flashwindow(application.handle,TRUE);
9,在桌面上加个VCL控件!(不是画的,不可更新)
windows.setparent(控件句柄,0);
注:想放哪都行(如“开始处状态栏”)
10,关于“类似MDI方式新解(一行就行!!!!)'的修正
windows.setparent(self.handle,“要设置为MainForm中的表”);
11普通表格象MDI中主窗体始终在最底层
SetActiveWindow(0);
或SetwindowPos (...);
12执行下列语句开始的Windows屏幕保护程序
SendMessage消息(HWND_BROADCAST,WM_SYSCOMMAND,SC_SCREENSAVE,0);
13按钮的标题多行显示:
SetWindowLong函数(Button1.handle,GWL_STYLE,
GetWindowlong(Button1.Handle,GWL_STYLE)或
BS_MULTILINE);
必要时加上Button1.Invalidate;
14整死WINDOWS98。)
ASM INT19美元结束
/ /实现使窗口的关闭变灰(H:窗口的句柄)
功能TFrmPublic.GrayedCloseItem(H:HWND):布尔;
VAR
HM:HMENU;
开始
如果H <> 0,/ /有效句柄
开始
HM:= GetSystemMenu(H,假);
结果:= EnableMenuItem(HM,SC_CLOSE,MF_BYCOMMAND + MF_DISABLED + MF_GRAYED);
年底
其他
结果:= FALSE;
结束;
/ /实现使窗口的关闭有效(H:窗口的句柄)
功能TFrmPublic.EnableCloseItem(H:HWND):布尔;
VAR
HM:HMENU;
开始
如果H <> 0,/ /有效句柄
开始
HM:= GetSystemMenu(H,假);
结果:= EnableMenuItem(HM,SC_CLOSE,MF_BYCOMMAND + MF_ENABLED);
年底
其他
结果:= FALSE;
结束;
功能GetKbStatus():字符串;
/ /返回当前键盘状态,包括NumLoce,大写锁定,插入
/ /每个状态信息占两个字符,顺序为:NumLoce,大写锁定,插入
/ /版权所有 549 @ 11:29 2003-7-22
VAR状态:字符串;
KeyStates:TKeyboardState;
开始
GetKeyboardState(KeyStates);
如果奇(KeyStates [VK_NUMLOCK]),则
现状:='数字'
其他
现状:='光标“;
如果奇(KeyStates [VK_CAPITAL]),则
现状:=状态+“大写”
其他
现状:=状态+“小写”;
如果奇(KeyStates [VK_INSERT]),则
现状:=状态+'插入'
其他
现状:=状态+'改写';
结果:=状态;
结束;
给MDI主窗口加背景
在MDI程序中,由于MDI的主窗口一般的功能是提供子窗口显示的位置和提供菜单,工具条,状态条等,而窗口的客户区则一般不会有其它的用途,如果在这里画上一些软件的标志,公司的标志或者其它的背景图案的话,不仅可以使MDI的主窗口更加充实,美观,而且还可以更加突出公司的形象和增加公司标志在客户心中的地位。
由于MDI主窗口的特性,使用普通的OnPaint和使用TImage等方法都不会产生作用。下面将用编写一个简单的MDI程序来介绍如何实现。
第一步:打开德尔福(Delphi的1,2,3都可以),创建一个新的工程。
第二步:将Form1中的FormStyle设置为fsMDIForm,设置成MDI的主窗口。
第三步:在Form1中上增加一个图像元件,并选择要设置的背景到形象的图片中。
第四步:在Form1中的私人中定义:
FClientInstance,
FPrevClientProc:TFarProc;
程序ClientWndProc(VAR消息:TMessage);
第五步:在实现(实施)中加入上述过程的具体内容:
程序TForm1.ClientWndProc(VAR消息:TMessage);
VAR
MYDC:HDC;
RO,钴:字;
开始
有消息做
案件味精
WM_ERASEBKGND:
开始
MYDC:= TWMEraseBkGnd(消息)DC;
反渗透:= 0 TO ClientHeight DIV Image1.Picture.Height DO
为协办:= 0至ClientWIDTH DIV Image1.Picture.Width DO
BitBlt函数(MYDC,CO * Image1.Picture.Width,RO * Image1.Picture.Height,
Image1.Picture.Width,Image1.Picture.Height,
Image1.Picture.Bitmap.Canvas.Handle,0,0,SRCCOPY);
结果:= 1;
结束;
其他
结果:= CallWindowProc(FPrevClientProc,ClientHandle,味精,WPARAM,LPARAM);
结束;
结束;
第六步:在Form1中的创建事件中加入:
FClientInstance:= MakeObjectInstance(ClientWndProc);
FPrevClientProc:=指针(GetWindowLong(ClientHandle,GWL_WNDPROC));
SetWindowLong函数(ClientHandle,GWL_WNDPROC,LongInt(FClientInstance));
上面的步骤已经完成了MDI主窗口背景图案的设置,下面可以增加一个MDIChild窗口,实现MDI程序。
第七步:新增加一个表格,并将FormStyle设置为fsMDIChild。
现在你可以编译运行这个程序,你会发现,图像元件并不会在表上显示出来,但是整个窗体的客户区域被图片中的图像所铺满。
]
金额改大写:
功能XTOD(I:真实的):字符串;
CONST
D ='零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿';
瓦尔
M,K:字符串;
J:整数;
开始
K:= '';
米:= floattostr(INT(I * 100));
对于J:=长度Downto 1(M)不要
开始
K:= K + D [(strtoint(M [长度(M) - J + 1]))* 2 + 1] +
D [(strtoint(M [长度(M) - J + 1]))* 2 + 2] + D [(10 + J)* 2 - 1] +
D [(10 + J)* 2];
完;
结果:= K;
完;
的CopyFile( PChar类型 ( “newfile.txt' ), PChar类型 ( '/ /计算机名/方向/ targer.txt“ ), 假 ); |
通过的MouseMove事件,的DragOver事件,EndDrag事件实现,例如在面板上的 标签 : |
VAR xpanel,ypanel,xlabel,ylabel: 整数 ; |
PANEL的MouseMove事件的:xpanel:= X; ypanel:= Y; |
面板的的DragOver事件:xpanel:= X; ypanel:= Y; |
LABEL 的MouseMove事件的:xlabel:= X; ylabel:= Y; |
LABEL 的EndDrag事件: 标签 。 左:= xpanel - xlabel; 标签 。 顶部:= ypanel - ylabel; |
VAR WINDIR: 数组 [ 0 .. 255 ] 的 字符 ; |
getwindowsdirectory(WINDIR,SIZEOF(WINDIR)); |
HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION |
SYSTEMROOT键,取得如:C:/ WINDOWS |
VAR X,Y: 数组 [ 0 .. 50 ] 的 整数 ; |
Form1上 。 画布 。 moveTo的(TRUNC(X [I]),TRUNC(Y [I])); |
Form1上 。 画布 。 LineTo的(TRUNC(X [J]),TRUNC(Y [J])); |
提示 。 loadfromfile( “FILENAME.TXT' ); |
提示 。 插入( 1 , 'NO 2行插入字符串' ); |
提示 。 的SaveToFile( “newfile.txt' ); |
richedit1 。 copytoclipboard; |
richedit1 。 cuttoclipboard; |
EDIT1 。 pastefromclipboard; |
CHDIR( “C:/ abcdir' );转到目录 |
Renamefile( “old.txt” , “new.txt” ); |
ExtractFilename(filelistbox1 。 文件名 ); |
ExtractFileExt(filelistbox1 。 文件名 ); |
ATTR:= filegetattr(filelistbox1 。 文件名 ); |
如果 (ATTR 和 faReadonly)= faReadonly 然后 ... |
如果 (ATTR 和 faSysfile)= faSysfile 然后 ... |
如果 (ATTR 和 faArchive)= faArchive 然后 ... |
如果 (ATTR 和 faHidden)= faHidden 然后 ... |
winexec(“命令 。 COM / C复制*.* C:/',SW_Normal); |
的ShellExecute或ShellExecuteEx |
功能 executefile( const的 文件名 ,PARAMS,DEFAULTDIR: 字符串 ; showCmd: 整数 ):THandle; |
ExecuteFile( 'C:/ ABC / a.txt“ , “x.abc' ,'C:/ ABC /', 0 ); |
ExecuteFile( “MAILTO:tingweb@wx88.net' , '' , '' , 0 ); |
VAR hCurrentWindow:HWND; szText: 数组 [ 0 .. 254 ] 的 字符 ; |
hCurrentWindow:= Getwindow(处理,GW_HWndFrist); |
如果 GetWindowText函数(hcurrnetwindow,@ sztext, 255 )> 0 ,然后 listBox1的 。 项 。 添加(strpas(@ sztext)); |
hCurrentWindow:= Getwindow(hCurrentwindow,GW_HWndNext); |
可以任意修改EAX,ECX,EDX;不能修改ESI,EDI,ESP,EBP,EBX。 |
的FormatDateTime( 'YYYY - MM - DD,HH - MM - SS“ , 日期); |
CONCAT(ST1,ST2,ST3 ... ...,STN); |
章 。 rootkey:= “HKEY_CURRENT_USER” ; |
章 。 openkey( “ 控制面板/桌面” , 假的 ); |
章 。 WriteString( “ 标题墙纸' , '0' ); |
章 。 writeString( “ 壁纸” ,filelistbox1 。 文件名 ); |
VK_BACK / VK_TAB / VK_RETURN / VK_SHIFT / VK_CONTROL / VK_MENU / VK_PAUSE / VK_ESCAPE |
/ VK_SPACE / VK_LEFT / VK_RIGHT / VK_UP / VK_DOWN |
F1 - F12: 70美元 ( 112 ) - 70亿美元 ( 123 ) |
AZ: 41美元 ( 65 ) - $ 5A ( 90 ) |
0 - 9 : 30美元 ( 48 ) - 39美元 ( 57 ) |
DELPHI软件的DOS提示:此 程序 必须是在Win32下运行。 |
VC + +软件的DOS提示:此 程序 不能运行 在 DOS模式。 |
shAddToRecentDocs(shArd_path, PChar类型 (文件路径)); |
shAddToRecentDocs(shArd_path, 无 ); |
WINDOWS / SYSTEM /用户 。 REM |
WINDOWS / SYSTEM / tmmr 。 REM |
如果 GetAsyncKeyState(VK_LButton)<> 0 ,然后 ... |
如果 GetAsyncKeyState(VK_MButton)<> 0 ,然后 ... |
如果 GetAsyncKeyState(VK_RButton)<> 0 ,然后 ... |
的OnCreate事件中处理:应用程序 。 的onMessage:= MyOnMessage; |
程序 TForm1 。 MyOnMessage( VAR 味精:TMSG; VAR 手柄: 布尔 ); |
共享效果:可访问,但不可见(在资源管理,网络邻居中) |
◇[Java脚本]的Java Script网页常用效果 |
数据源,一个是MQIS,一个是LocalSever,任选一个选后点击配置按钮,不知你的SQL7 0.0 |
是不是安装在本地机器上,如果是的话直接进行下一步,如果不是,在服务器一栏中填上 |
服务器,然后进行下一步,填写登录ID和密码(登录ID,和密码是在SQL7 0.0 中的用户选项 |
打开Delphi中的BDE,然后点击MQIS或LocalServer,就会提示用户名和密码,这和 |
如果用的是TTable,就在TTable的数据库名中选择MQIS或LocalServer,然后在 |
的TableName中选择销售就行了,然后将活动改为 真 ,德尔福弹出提示对话,填入用户 |
如果用的是的TQuery,在的TQuery上点击右键,再击“SQL生成器”,这是以界面方式配置 |
SQL语句,或者在的TQuery的SQL中填入SQL语句,最后,别忘了将活动改为 真 。 |
在运行也可能配置的TQuery,具体见德尔福帮助。 |
程序 TForm1 。 Image1MouseDown(发件人:TObject的;按钮:TMouseButton; |
移位:TShiftState,X,Y: 整数 ); |
Label1的 。 标题:= inttostr(红色); |
Label2的 。 标题:= inttostr(绿色); |
Label3 。 标题:= inttostr(蓝色); |
VAR 年,月,日: 字 ; now2:Tdatatime; |
lable1 。 文字:= inttostr(年)+ '年' + inttostr(月)+ '月' + inttostr(天)+ “日” ; |
结果:=的InternetGetConnectedState(@标志, 0 ); |
如果 (标志 和 INTERNET_CONNECTION_MODEM)= INTERNET_CONNECTION_MODEM 然后 |
如果 (标志 和 INTERNET_CONNECTION_LAN)= INTERNET_CONNECTION_LAN 然后 |
如果 (标志 和 INTERNET_CONNECTION_PROXY)= INTERNET_CONNECTION_PROXY 然后 |
如果 (标志 和 INTERNET_CONNECTION_MODEM_BUSY)= INTERNET_CONNECTION_MODEM_BUSY 然后 |
◇[DELPHI]如何判断字符串是否是有效EMAIL地址 |
功能 IsEMail(电邮: 弦乐 ): 布尔 ; |
VAR 年代: 字符串 ; ETpos: 整数 ; |
ETpos:= POS( “@” , 电子邮件); |
S:=复制(电子邮件,ETpos + 1 ,长度(电子邮件)); |
如果 (POS( '。' ,S)> 1 ) 和 (POS( '。' ,S)<长度(S)) ,然后
|
◇[DELPHI]判断系统是否连接INTERNET |
需要引入URL 。 DLL中的InetIsOffline函数。 |
功能 InetIsOffline(标志: 整数 ): 布尔 ,STDCALL;外部 “URL.DLL” ; |
如果 InetIsOffline( 0 ), 然后 ShowMessage( “ 没有连接!” ) |
该函数返回 TRUE, 如果本地系统没有连接到互联网。 |
大多数装有IE或OFFICE97的系统都有此DLL可供调用。 |
功能 PlayWav( const的 文件名 : 字符串 ): 布尔 ; |
结果:= PlaySound( PChar类型 (文件名 ), 0 ,SND_ASYNC); |
缓冲区: 数组 [ 0 .. 2 ] 的 字符 ; |
PlaySound(缓冲, 0 ,SND_PURGE); |
新增( “MainBoardBiosName:” + ^ I + 字符串 ( PCHAR (PTR( $ FE061 )))); |
新增( “MainBoardBiosCopyRight:” + ^ I + 字符串 ( PCHAR (PTR( $ FE091 )))); |
新增( “MainBoardBiosDate:” + ^ I + 字符串 ( PCHAR (PTR( $ FFFF5 )))); |
新增( “MainBoardBiosSerialNo:” + ^ I + 字符串 ( PCHAR (PTR( $ FEC71 )))); |
功能 DownloadFile(来源,目的地: 字符串 ): 布尔 ; |
结果:= UrlDownloadToFile( 零 , PChar类型 (源), PChar类型 (DEST), 0 , 零 )= 0 ; |
其他 ShowMessage( '下载unsuccesful“ ) |
功能 IPAddrToName(IPADDR: 字符串 ): 字符串 ; |
调用WSAStartup( 101美元 ,WSADATA); |
SockAddrIn 。 sin_addr 。 s_addr:= inet_addr( PChar类型 (IPADDR)); |
HostEnt:= gethostbyaddr(@ SockAddrIn 。 sin_addr 。 S_addr, 4 ,AF_INET); |
如果 HostEnt <> 无 则 结果是:= StrPas(Hostent ^ h_name) 其他 结果:= '' ; |
功能 ExeFromLink( 常量 linkname: 字符串 ): 字符串 ; |
ExeName:= StrAlloc(MAX_PATH); |
FName参数:= StrAlloc(MAX_PATH); |
FDir:= StrAlloc(MAX_PATH); |
StrPCopy(FName参数,ExtractFileName(linkname)); |
StrPCopy(FDir,ExtractFilePath(linkname)); |
Z:= FindExecutable(FName参数,FDir,ExeName); |
◇[DELPHI]控制TCombobox的自动完成 |
程序 TForm1 。 AutoCompleteChange(发件人:TObject的); |
SearchStr:=(发件人 的 。TCombobox)文本; |
RETVAL:=(发件人 的 。TCombobox)执行(CB_FINDSTRING - 1 , LongInt ( PChar类型 (SearchStr))); |
(发件人 的 。TCombobox)的ItemIndex:= RETVAL; |
(发件人 的 。TCombobox)SelStart的:=长度(SearchStr); |
(发件人 的 。TCombobox)并将SelLength:= |
(长((发件人 的 。TCombobox)文本) -长度(SearchStr)); |
程序 TForm1 。 AutoCompleteKeyDown(发件人:TObject的; VAR 重点: 字 ; |
功能 EmptyDirectory(TheDirectory: 字符串 ;递归: 布尔 ): |
TheDirectory:= NormalDir(TheDirectory); |
RES:=使用FindFirst(TheDirectory + '*.*' ,faAnyFile,SearchRec); |
如果 (SearchRec 。 名称<> '。' ) 和 (SearchRec 。 名称<> '..' ), 然后 |
如果 ((SearchRec 。 的Attr 和 faDirectory)> 0 ) 和 递归 |
EmptyDirectory(TheDirectory + SearchRec 。 名, 真 ); |
RemoveDirectory( PChar类型 (TheDirectory + SearchRec 。 名称)); |
删除文件( PChar类型 (TheDirectory + SearchRec 。 名称)) |
RES:= FindNext(SearchRec); |
FindClose(SearchRec 。 FindHandle); |
功能 GetDirectorySize( 常量 ADirectory: 字符串 ): 整数 ; |
路径:= ExtractFilePath(ADirectory); |
RET:= sysutils的 。 使用FindFirst(ADirectory,faAnyFile,DIR); |
如果 (目录 。 的Attr 在 [faDirectory]) 和 (目录 。 名称[ 1 ] <> '。' ) ,然后 |
公司(结果,GetDirectorySize(路径+目录 。 名称+ '/ *.*“ )); |
RET:= sysutils的 。 FindNext(目录); |
sysutils的 。 FindClose(目录); |
1 ,在HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION /卸载键下建立一个主键,名称任意。 |
例HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION /卸载/ MyUninstall |
2 ,在HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION /卸载/ MyUnistall下键两个串值, |
这两个串值的名称是特定的:的DisplayName和UninstallString。 |
3 给串的DisplayName赋值为显示在“删除应用程序列表”中的名称,如。 “针对卸载之一” ; |
给串UninstallString赋值为执行的删除命令,如C:/ WIN97 / UNINST 。 EXE - F“C:/ TestPro / aimTest 。 ISU“ |
◇[DELPHI]截获WM_QUERYENDSESSION关机消息 |
程序 WMQueryEndSession( VAR 消息:TWMQueryEndSession);消息WM_QUERYENDSESSION; |
程序 CMEraseBkgnd( VAR 消息:TWMEraseBkgnd);消息WM_ERASEBKGND; |
程序 TForm1 。 WMQueryEndSession( VAR 消息:TWMQueryEndSession); |
Showmessage( “ 计算机即将关闭” ); |
netres: 数组 [ 0 .. 1023 ] 的 NETRESOURCE; |
alldomain:= tstringlist 。 创建; |
dwscope:= RESOURCE_GLOBALNET; |
dwtype:= RESOURCETYPE_ANY; |
dwdisplaytype:= RESOURCEDISPLAYTYPE_DOMAIN; |
dwusage:= RESOURCEUSAGE_CONTAINER; |
ERRCODE:= wnetopenenum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@ netres [ 0 ],enumhandle); |
如果 ERRCODE = NO_ERROR 然后 开始 |
BUFFERSIZE:= SIZEOF(netres); |
ERRCODE:= wnetenumresource(enumhandle,enumentries,@ netres [ 0 ],BUFFERSIZE); |
mylistitems:= ControlCenter的 。 lstcomputer 。 项目; |
而 ( 字符串 (netres [A]。lpprovider)<> '' ) 和 (ERRCODE = NO_ERROR) 做 |
alldomain 。 添加(netres [A] lpremotename); |
wnetcloseenum(enumhandle); |
mylistitems:= ControlCenter的 。 lstcomputer 。 项目; |
为 I:= 0 至 alldomain 。 计数, 1 做 |
dwscope:= RESOURCE_GLOBALNET; |
dwtype:= RESOURCETYPE_ANY; |
dwdisplaytype:= RESOURCEDISPLAYTYPE_SERVER; |
dwusage:= RESOURCEUSAGE_CONTAINER; |
lpremotename:= PChar类型 (alldomain [I]); |
ERRCODE:= WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@ netres [ 0 ],EnumHandle); |
的bufferSize:=一下SizeOf(NetRes); |
ERRCODE:= WNetEnumResource(EnumHandle,EnumEntries,@ NetRes [ 0 ]的bufferSize); |
而 ( 字符串 (netres [A]。lpprovider)<> '' ) 和 (ERRCODE = NO_ERROR) 做 |
mylistitem:= mylistitems 。 添加; |
mylistitem 。 的ImageIndex:= 0 ; |
mylistitem 。 标题:=大写(stringreplace( 字符串 (NetRes [A] lpremotename), '/ /' , '' ,[rfReplaceAll])); |
wnetcloseenum(enumhandle); |
程序 getsharefolder( const的 计算机名: 字符串 ); |
netres: 数组 [ 0 .. 1023 ] 的 NETRESOURCE; |
enumentries,BUFFERSIZE:DWORD; |
dwscope:= RESOURCE_GLOBALNET; |
dwtype:= RESOURCETYPE_DISK; |
dwdisplaytype:= RESOURCEDISPLAYTYPE_SHARE; |
dwusage:= RESOURCEUSAGE_CONTAINER; |
lpremotename:= PChar类型 (计算机名); |
ERRCODE:= wnetopenenum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER,@ netres [ 0 ],enumhandle); |
的bufferSize:=一下SizeOf(NetRes); |
ERRCODE:= WNetEnumResource(EnumHandle,EnumEntries,@ NetRes [ 0 ]的bufferSize); |
wnetcloseenum(enumhandle); |
mylistitems:= ControlCenter的 。 lstfile 。 项目; |
而 ( 字符串 (netres [A]。lpprovider)<> '' ) 和 (ERRCODE = NO_ERROR) 做 |
mylistitem 。 的ImageIndex:= 4 ; |
mylistitem 。 标题:= extractfilename(。netres [A] lpremotename); |
VAR SerialNum:PDWORD; A,B:DWORD;缓冲: 数组 [ 0 .. 255 ] 的 字符 ; |
如果 GetVolumeInformation(“C:/',缓冲,一下SizeOf(缓冲区),SerialNum,A,B, 无 , 0 ), 然后 Label1的 。 标题:= IntToStr(SerialNum ^); |
程序 ScrollMemo(备注:TMemo;方向: 字符 ); |
程序 TForm1 。 Button1Click(发件人:TObject的); |
程序 TForm1 。 Button1Click(发件人:TObject的); |
◇[DELPHI] DBGrid的中回车到下个位置(Tab键) |
程序 TForm1 。 DBGrid1KeyPress(发件人:TObject的; VAR 键: 字符 ); |
如果 DBGrid1 。 列 。 电网 。 的SelectedIndex <DBGrid1 。 列 。 计数- 1 则 |
DBGrid1 。 列[DBGrid1 。 列 。 电网 。 的SelectedIndex + 1 ]。领域 。 FocusControl |
DBGrid1 。 专栏[ 0 ]字段。 。 FocusControl; |
1 对于单个控件,组件- >安装组件..--> PAS或DCU文件- >安装 |
2 对于带*. DPK文件的控件包, 文件 - >打开(下拉列表框中选*. DPK) - >安装即可。 |
3 对于带*. DPL文件的控件包,安装软件包- >添加- > DPL文件名 即可。 |
5 ,是运行时库则在选项下的包下的runtimepackes加之。 |
如果编译时提示文件找不到的话,一般是控件的安装目录不在Delphi中的LIB目录中,有两种方法可以解决: |
1 ,把安装的原文件拷入到Delphi中的LIB目录下。 |
2 或者工具- >环境选项中把控件原代码路径加入到Delphi中的LIB目录中即可。 |
程序 TForm1 。 DeleteDirectory(strDir: 字符串 ); |
strpth:= Getcurrentdir(); |
如果 使用FindFirst(strpth + '/'+ strdir +' / *.*', FileAttrs,SR)= 0 则 |
如果 (SR 。 的Attr 和 FileAttrs)= SR 。 的Attr 然后 |
如果 fileexists(strpth + '/'+ strdir +' /'+ strfilename) 则 |
删除文件(strpth + '/'+ strdir +' /'+ strfilename); |
如果 (SR 。 的Attr 和 FileAttrs)= SR 。 的Attr 然后 |
如果 fileexists(strpth + '/'+ strdir +' /'+ strfilename) 则 |
删除文件(strpth + '/'+ strdir +' /'+ strfilename); |
removedir(strpth +'/'+ strdir); |
◇[DELPHI]取得TMemo控件当前光标的行和列信息到Tpoint中 |
1, 功能 ReadCursorPos(SourceMemo:TMemo):TPoint; |
点 。 Y:= SendMessage消息(SourceMemo 。 手柄,EM_LINEFROMCHAR,SourceMemo 。 SelStart的, 0 ); |
点 。 X:= SourceMemo 。 (SourceMemo SelStart的,SendMessage消息 。 手柄,EM_LINEINDEX,点 , Y, 0 ); |
2。 LineLength:= SendMessage消息(memol.handle,EM - LINELENGTH,CPOS, 0 ); |
功能 GetDiskSerial(DiskChar: 字符 ): 字符串 ; |
缓冲液: 数组 [ 0 .. 255 ] 的 字符 ; |
如果 GetVolumeInformation( PChar类型 (diskchar +“:/”),缓冲,一下SizeOf(缓冲区),SerialNum, |
结果:= IntToStr(SerialNum ^); |
字体大小:字体大小:[XX小| X -小|小|中|大| X -大| XX -大|大|小| <长度> | <百分比>] |
文本修饰:文本装饰:[下划线| |划线| |行通| |闪烁] |
行高:行高:[一般| <数字> | <长度> | <百分比>] |
边框样式:边框风格:[无|点|虚线|固体| 双 |槽|脊|插图|开始] |
(建立库单元,继承为新的类型,添加属性,方法,事件,注册部件,建立包文件) |
静态装载: 程序 名称;外部 “lib.dll” ; |
处理:= LoadLibrary的( “lib.dll' ); |
ByteType( “ 你好哈哈吗' , 1 )= mbLeadByte |
ByteType( “ 你好哈哈吗' , 2 )= mbTrailByte |
ByteType( “ 你好哈哈吗' , 5 )= mbSingleByte |
结果:= 字节 (S [ 1 ])* 百美元 + 字节 (S [ 2 ]); |
插入到表名(field1,field2欲)值(:RECORD1:RECORD2) |
EXECUTE 程序 addrecord(“urrecord1”,“urrecord2”) |
功能 blobcontenttostring( 常量 名: 字符串 ): 字符串 ; |
与 tfilestream 。 创建(文件名 ,fmopenread) 做 |
如果 (opendialog1 。 执行) ,然后 |
sFileName:= OpenDialog1 。 文件名; |
adotable1 。 fieldbyname( “Visio的” 。)asstring:= Blobcontenttostring(文件名 ); |
使用 shlobj,ACTIVEX,clipbrd; |
程序 Tform1 。 copytoclipbrd( VAR 文件名 : 字符串 ); |
FE 。 cfFormat:= CF_HDROP; |
FE 。 dwAspect:= DVASPECT_CONTENT; |
FE 。 tymed:= TYMED_HGLOBAL; |
中 。 HGLOBAL:=的GlobalAlloc(GMEM_SHARE 或 GMEM_ZEROINIT,一下SizeOf(TDropFiles)+长度(文件名 )+ 1 ); |
如果 中等 。 HGLOBAL <> 0 ,然后 开始 |
中 。 tymed:= TYMED_HGLOBAL; |
dropfiles:= GlobalLock(中等 。 HGLOBAL); |
。dropfiles ^ PFILES:=一下SizeOf(TDropFiles); |
longint (PFILE):= longint (dropfiles)+一下SizeOf(TDropFiles); |
公司(PFILE,长度(文件名 )+ 1 ); |
GlobalUnlock(中等 。 HGLOBAL); |
剪贴板 。 SetAsHandle(CF_HDROP,中等 。 HGLOBAL); |
程序 TForm1 。 Button1Click(发件人:TObject的); |
VAR lppe:TProcessEntry32; |
手:= CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0 ); |
发现:= Process32First(手,lppe); |
ListBox1中 。 项 。 添加(StrPas(lppe 。 szExeFile)); |
发现:= Process32Next(手,lppe); |
◇[DELPHI]根据BDETable1建立新表表2 |
表2 。 FieldDefs 。 分配(表1 。 FieldDefs); |
表2 。 IndexDefs 。 分配(表1 。 IndexDefs); |
功能 addit(F: 整数 ,S: 整数 ): 整数 ;出口; |
功能 addit(F: 整数 ,S: 整数 ): 整数 ;远;外部 'Project1的“ ; |
assignfile(F,应用 。 exename); |
新增( “MainBoardBiosName:” + ^ I + 字符串 ( PCHAR (PTR( $ FE061 )))); |
新增( “MainBoardBiosCopyRight:” + ^ I + 字符串 ( PCHAR (PTR( $ FE091 )))); |
新增( “MainBoardBiosDate:” + ^ I + 字符串 ( PCHAR (PTR( $ FFFF5 )))); |
新增( “MainBoardBiosSerialNo:” + ^ I + 字符串 ( PCHAR (PTR( $ FEC71 )))); |
程序 TForm1 。 Button1Click(发件人:TObject的); |
添加( “SERVER NAME = 210.242.86.2” ); |
会议1 。 AddAlias( “TESTSQL” , “MSSQL” , 我清单); |
数据库1 。 AliasName:= 'TESTSQL“ ; |
数据库1 。 的LoginPrompt:= 假 ; |
数据库1 。 PARAMS 。 添加( “USER NAME = SA' ); |
数据库1 。 PARAMS 。 添加( “PASSWORD =' ); |
程序 TForm1 。 Button2Click(发件人:TObject的); |
会议1 。 DeleteAlias( “TESTSQL' ); |
MCISendString( “OPEN E:/ 1.MID型SEQUENCER ALIAS NN' , '' , 0 , 0 ); |
MCISendString( “PLAY NN 0' , '' , 0 , 0 ); |
MCISendString( “ 关闭动画' , '' , 0 , 0 ); |
MCISendString( “OPEN E:/ 1.MID型SEQUENCER ALIAS NN' , '' , 0 , 0 ); |
MCISendString( “STOP NN' , '' , 0 , 0 ); |
MCISendString( “ 关闭动画' , '' , 0 , 0 ); |
Tsample = 类 (TInterfacedObject,Isample) |
功能 Tsample 。 GetString的: 字符串 ; |
showmessage(样品 。 GetString的+ “类的对象!” ); |
VAR sampleinterface:Isample; |
showmessage(sampleInterface 。 GetString的+ “接口!” ); |
ExtendedStyle:= GetWindowLong(应用程序 。 手柄,GWL_EXSTYLE); |
SetWindowLong函数(应用程序 。 手柄,GWL_EXSTYLE,ExtendedStyle 或 WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW); |
应用 。 CreateForm(TForm1,Form1中); |
◇[DELPHI] ALT + CTRL + DEL看不到程序 |
函数 RegisterServiceProcess(dwProcessId和,dwType: 整数 ): 整数 ; STDCALL;外部 “KERNEL32.DLL” ; |
RegisterServiceProcess(GetCurrentProcessID, 1 ); |
RegisterServiceProcess(GetCurrentProcessID, 0 ); |
cdromID:= GetDriveType( PChar类型 (驱动器+':/')); |
如果 cdromID = 5 然后 showmessage( '你的光驱为:“ +驱动器+ '!盘“ ); |
如果 auxGetNumDevs()<= 0 则 showmessage( '没有声卡找到!“ ) 其他 showmessage( “ 任何声卡找到!” ); |
StringGrid 。 OnDrawCell事件 |
画(矩形 , 左,矩形 , 顶,Image1的 。 图片 。 图形); |
◇[SQL SERVER] SQL中代替像语句的另一种写法 |
从表1中选择其中username LIKE'%C%*“ |
从表1中选择其中CHARINDEX(* 'C' , 用户名)> 0 |
这种方法理论上比上一种方法多了一个判断语句,即> 0 ,但这个判断过程是最快的,我想信 80 %以上的运算都是花在查找字 |
符串及其它的运算上,所以运用CHARINDEX函数也没什么大不了。用这种方法也有好处,那就是对%,|等在不能直接用像 |
查找到的字符中可以直接在这CHARINDEX中运用,如下: |
从表1中选择其中CHARINDEX(* '%' ,用户名)> 0 |
从表1中选择其中CHARINDEX(* 字符 ( 37 ),用户名)> 0 |
SELECT DISTINCT一个 。 边壕,一 , 兴明,B , 从“建杰公子 。 DBF“的,”公子 。 DBF“B |
◇[DELPHI] RFC(请求 对于 评论)相关 |
IETF(互联网工程任务组)维护RFC文档HTTP: |
◇[DELPHI] TNMUUProcessor的使用 |
VAR inStream中,outStream:TFileStream; |
inStream中:= TFileStream 。 创建(INFILE 。 TXT,fmOpenRead); |
outStream:= TFileStream(OUTFILE 。 TXT,fmCreate); |
NMUUE 。 InputStream中:=河道; |
NMUUE 。 OutputStream的:= OutStream; |
函数 读取( VAR 缓冲区;数: longint ): longint ;覆盖; |
函数 写 ( 常量 缓冲区;数: longint ): longint ;覆盖; |
函数 求(偏移: longint ;来源: 字 ): longint ;覆盖; |
功能 copyfrom(来源:TStream;数: longint ): longint ; |
VAR myFStream:TFileStream; |
myFStream:= TFileStream 。 创建(OpenDialog1 。 文件名 ,fmOpenRead); |
[JavaScript的]检测是否安装IE插件和QuickTime的冲击波 |
VAR myPlugin =航海家 。 插件[“冲击波”; |
文件 。 writeln (“你已经安装了冲击波!”) |
文件 。 writeln (“你尚未安装冲击波!”) |
VAR myPlugin =航海家 。 插件[“QuickTime的”]; |
文件 。 writeln (“你已经安装了QuickTime的!”) |
文件 。 writeln (“你尚未安装QuickTime的!”) |
程序 TForm1 。 Edit1Enter(发件人:TObject的); |
(发件人 作为 。TEDIT)颜色:= ClInfo; |
程序 TForm1 。 Edit1Exit(发件人:TObject的); |
(发件人 作为 。TEDIT)颜色:= ClWhite; |
程序 TForm1 。 Button1的(发件人:TObject的); |
对于 指数:= 0 至 ControlCount - 1 做 |
(组件[索引] 作为 。TEDIT)颜色:= ClLime; |