delphi技巧总结收集

Delphi常用总结

  (2008-03-30 23:45:17)
标签: 

杂谈

分类: Delphi程序大全
 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.Speed​​Button4Click(发件人:TObject的);
    VAR
    MSWORD:变式;
    STR:字符串; 
    开始
      如果修剪(DataModule1.adoquery27.fieldbyname('fjmc')。asstr​​ing )<>''然后
      开始
        STR:=修剪(。DataModule1.ADOQuery27.fieldbyname('fjmc')AsString);
        MSWORD:= CreateOLEOb​​ject(“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.Speed​​Button2Click(发件人: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.Speed​​Button1Click(发件人: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.Speed​​Button5Click(发件人: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;
完;


 

 

 

 

DELPHI基础开发技巧
 
 
◇[DELPHI]网络邻居复制文件
使用 shellapi;
的CopyFile( PChar类型 ( “newfile.txt' ), PChar类型 ( '/ /计算机名/方向/ targer.txt“ ), 假 );
◇[DELPHI]产生鼠标拖动效果
通过的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;
◇[DELPHI]取得WINDOWS目录
使用 shellapi;
VAR WINDIR: 数组 0 .. 255 的 字符 ;
getwindowsdirectory(WINDIR,SIZEOF(WINDIR));
或者从注册表中读取,位置:
HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION
SYSTEMROOT键,取得如:C:/ WINDOWS
◇[DELPHI]在FORM或其他容器上画线
VAR X,Y: 数组 0 .. 50 的 整数 ;
帆布 。 笔 。 颜色:= clred;
帆布 。 笔 。 风格:= psDash;
Form1上 。 画布 。 moveTo的(TRUNC(X [I]),TRUNC(Y [I]));
Form1上 。 画布 。 LineTo的(TRUNC(X [J]),TRUNC(Y [J]));
◇[DELPHI]字符串列表使用
VAR 提示:tstringlist;
技巧:= tstringlist 。 创建;
提示 。 loadfromfile( “FILENAME.TXT' );
EDIT1 。 文字:=技巧[ ];
提示 。 添加( “最后一行除了字符串' );
提示 。 插入( , 'NO 2行插入字符串' );
提示 。 的SaveToFile( “newfile.txt' );
提示 。 自由;
◇[DELPHI]简单的剪贴板操作
richedit1 。 全选;
richedit1 。 copytoclipboard;
richedit1 。 cuttoclipboard;
EDIT1 。 pastefromclipboard;
◇[DELPHI]关于文件,目录操作
CHDIR( “C:/ abcdir' );转到目录
MKDIR( “ 目录名称” );建立目录
RMDIR( “ 目录名称” );删除目录
GetCurrentDir; / /取当前目录名,无'/'
GETDIR( ,S); / /取工作目录名S:='C:/ abcdir“;
Deletfile( “abc.txt” ); / /删除文件
Renamefile( “old.txt” , “new.txt” ); / /文件更名
ExtractFilename(filelistbox1 。 文件名 ​​); / /取文件名
ExtractFileExt(filelistbox1 。 文件名 ​​); / /取文件后缀
◇[DELPHI]处理文件属性
ATTR:= filegetattr(filelistbox1 。 文件名 ​​);
如果 (ATTR 和 faReadonly)= faReadonly 然后 ... / /只读
如果 (ATTR 和 faSysfile)= faSysfile 然后 ... / /系统
如果 (ATTR 和 faArchive)= faArchive 然后 ... / /存档
如果 (ATTR 和 faHidden)= faHidden 然后 ... / /隐藏
◇[DELPHI]执行程序外文件
WINEXEC / /调用可执行文件
winexec(“命令 。 COM / C复制*.* C:/',SW_Normal);
winexec( “ 开始abc.txt” );
的ShellExecute或ShellExecuteEx / /启动文件关联程序
功能 executefile( const的 文件名 ​​,PARAMS,DEFAULTDIR: 字符串 ; showCmd: 整数 ):THandle;
ExecuteFile( 'C:/ ABC / a.txt“ , “x.abc' ,'C:/ ABC /', );
ExecuteFile( “ http://tingweb.yeah.net ' , '' , '' , );
ExecuteFile( “MAILTO:tingweb@wx88.net' , '' , '' , );
◇[DELPHI]取得系统运行的进程名
VAR hCurrentWindow:HWND; szText: 数组 0 .. 254 的 字符 ;
开始
hCurrentWindow:= Getwindow(处理,GW_HWndFrist);
而 hCurrentWindow <> 
开始
如果 GetWindowText函数(hcurrnetwindow,@ sztext, 255 )> ,然后 listBox1的 。 项 。 添加(strpas(@ sztext));
hCurrentWindow:= Getwindow(hCurrentwindow,GW_HWndNext);
结束 ;
结束 ;
◇[DELPHI]关于汇编的嵌入
ASM 结束 ;
可以任意修改EAX,ECX,EDX;不能修改ESI,EDI,ESP,EBP,EBX。
◇[DELPHI]关于类型转换函数
FloatToStr / /浮点转字符串
FloatToStrF / /带格式的浮点转字符串
IntToHex / /整数转16进制
TimeToStr
DateToStr
DateTimeToStr
FmtStr / /按指定格式输出字符串
的FormatDateTime( 'YYYY - MM - DD,HH - MM - SS“ , 日期);
◇[DELPHI]字符串的过程和函数
插入(OBJ,目标,POS) 。/ /字符串目标插入在POS机的位置如插入结果大于目标的最大长度,多出字符将被截掉如名次在255以外,会产生运行错例如, ST:=“布莱恩”,则插入('OK',ST,2)会使ST变为“BrOKian”。
删除(ST,POS,NUM); / /从ST串中的POS(整型)位置开始删去个数为序号(整型)个字符的子字串例如,ST:=“布莱恩”,则删除(ST,3,2)将变为BRN。
STR(值,ST); / /将数值值(整型或实型)转换成字符串放在ST中例如,A = 2.5E4时,则STR(A:10,ST)将使ST的值为“25000”。
瓦尔 (ST, VAR ,代码); 。/ /把字符串表达式ST转换为对应整型或实型数值,存放在VAR中圣必须是一个表示数值的字符串,并符合数值常数的规则在转换过程中,如果没有检测出错误,变量代码置为0,否则置为第一个出错字符的位置例如,ST:= 25.4E3,X是一个实型变量,则VAL(ST,X,代码)将使X值为25400,代码值为0。
复制(ST 。 POS 。 NUM) / /返回ST串中一个位置POS(整型)处开始的,含有NUM(整型)个字符的子串如果POS大于ST字符串的长度,那就会返回一个空串,如果POS在255以外,会引起运行错误例如,ST:=“布莱恩”,则复制(ST,2,2)返回'里“。
CONCAT(ST1,ST2,ST3 ... ...,STN); / /把所有自变量表示出的字符串按所给出的顺序连接起来,并返回连接后的值如果结果的长度255,将产生运行错误,例如,ST1:='布赖恩',ST2:='',ST3:='威尔弗雷德“,则CONCAT(ST1,ST2,ST3)返回”布赖恩威尔弗雷德“。
长度(ST) / /返回字符串表达式的长度例如ST,ST:=“布莱恩”,则长度(ST)返回值为5。
POS(OBJ,目标); / /返回字符串obj的目标在目标字符串的第一次出现的位置,如果目标没有匹配的串,POS函数的返回值为0例如,目标:='布赖恩威尔弗雷德“,则POS(“威尔”,目标)的返回值是7,POS('hurbet“,目标)的返回值是0。
◇[DELPHI]关于处理注册表
使用 注册表;
VAR 章:Tregistry;
章:= Tregistry 。 创建;
章 。 rootkey:= “HKEY_CURRENT_USER” ;
章 。 openkey( “ 控制面板/桌面” , 假的 );
章 。 WriteString( “ 标题墙纸' , '0' );
章 。 writeString( “ 壁纸” ,filelistbox1 。 文件名 ​​);
章 。 closereg;
章 。 自由;
◇[DELPHI]关于键盘常量名
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 
: 30美元 ( 48 ) - 39美元 ( 57 
◇[DELPHI]初步判断程序母语
DELPHI软件的DOS提示:此 程序 必须是在Win32下运行。
VC + +软件的DOS提示:此 程序 不能运行 在 DOS模式。
◇[DELPHI]操作曲奇
响应 。 。饼干(“名称”)域:= http://www.086net.com “ ;
与 响应 。 饼干 。 加 
开始
名称:= '用户名' ;
价值:= '用户名' ;
年底
◇[DELPHI]增加到文档菜单连接
使用 shellapi,shlOBJ;
shAddToRecentDocs(shArd_path, PChar类型 (文件路径)); / /增加连接
shAddToRecentDocs(shArd_path, 无 ); / /清空
◇[杂类]备份智能ABC输入法词库
WINDOWS / SYSTEM /用户 。 REM
WINDOWS / SYSTEM / tmmr 。 REM
◇[DELPHI]判断鼠标按键
如果 GetAsyncKeyState(VK_LButton)<> ,然后 ... / /左键
如果 GetAsyncKeyState(VK_MButton)<> ,然后 ... / /中键
如果 GetAsyncKeyState(VK_RButton)<> ,然后 ... / /右键
◇[DELPHI]设置窗体的最大显示
onFormCreate事件
自我 。 宽度:=屏幕 。 宽度;
自我 。 高度:=屏幕 。 高度;
◇[DELPHI]按键接受消息
的OnCreate事件中处理:应用程序 。 的onMessage:= MyOnMessage;
程序 TForm1 。 MyOnMessage( VAR 味精:TMSG; VAR 手柄: 布尔 );
开始
如果 味精 。 消息= 256 然后 ... / /任何键
如果 味精 。 消息= 112 然后 ... / / F1
如果 味精 。 消息= 113 然后 ... / / F2
结束 ;
◇[杂类]隐藏共享文件夹
共享效果:可访问,但不可见(在资源管理,网络邻居中)
取共享名为:方向$
访问: / /计算机/ dirction /
◇[Java脚本]的Java Script网页常用效果
网页 60 秒定时关闭
 
关闭窗口
关闭
定时转URL
数据源,一个是MQIS,一个是LocalSever,任选一个选后点击配置按钮,不知你的SQL7 0.0
是不是安装在本地机器上,如果是的话直接进行下一步,如果不是,在服务器一栏中填上
服务器,然后进行下一步,填写登录ID和密码(登录ID,和密码是在SQL7 0.0 中的用户选项
中设的)。
第二步,配置BDE:
打开Delphi中的BDE,然后点击MQIS或LocalServer,就会提示用户名和密码,这和
ODBC的用户名和密码是一样的,填上就行了。
第三步,配置程序:
如果用的是TTable,就在TTable的数据库名中选择MQIS或LocalServer,然后在
的TableName中选择销售就行了,然后将活动改为 真 ,德尔福弹出提示对话,填入用户
名和密码。
如果用的是的TQuery,在的TQuery上点击右键,再击“SQL生成器”,这是以界面方式配置
SQL语句,或者在的TQuery的SQL中填入SQL语句,最后,别忘了将活动改为 真 
在运行也可能配置的TQuery,具体见德尔福帮助。
□◇[DELPHI]得到图像上某一点的RGB值
程序 TForm1 。 Image1MouseDown(发件人:TObject的;按钮:TMouseButton;
移位:TShiftState,X,Y: 整数 );
VAR
红,绿,蓝: 字节 ;
我: 整数 ;
开始
我:=较受欢迎 。 帆布 。 像素[X,Y];
蓝色:= GetBValue(I);
绿色:= GetGValue(一):
红色:= GetRValue(I);
Label1的 。 标题:= inttostr(红色);
Label2的 。 标题:= inttostr(绿色);
Label3 。 标题:= inttostr(蓝色);
结束 ;
□◇[DELPHI]关于日期格式分解转换
VAR 年,月,日: 字 ; now2:Tdatatime;
now2:= DATE();
decodedate(now2,年,月,日);
lable1 。 文字:= inttostr(年)+ '年' + inttostr(月)+ '月' + inttostr(天)+ “日” ;
◇[DELPHI]如何判断当前网络连接方式
判断结果是MODEM,局域网或是代理服务器方式。
使用 WININET;
功能 ConnectionKind: 布尔 ;
VAR 标志:DWORD;
开始
结果:=的InternetGetConnectedState(@标志, );
如果 结果 
开始
如果 (标志 和 INTERNET_CONNECTION_MODEM)= INTERNET_CONNECTION_MODEM 然后
开始
showmessage( '调制解调器' );
结束 ;
如果 (标志 和 INTERNET_CONNECTION_LAN)= INTERNET_CONNECTION_LAN 然后
开始
showmessage( '网络' );
结束 ;
如果 (标志 和 INTERNET_CONNECTION_PROXY)= INTERNET_CONNECTION_PROXY 然后
开始
showmessage( '代理' );
结束 ;
如果 (标志 和 INTERNET_CONNECTION_MODEM_BUSY)= INTERNET_CONNECTION_MODEM_BUSY 然后
开始
showmessage( '调制解调器忙“ );
结束 ;
结束 ;
结束 ;
◇[DELPHI]如何判断字符串是否是有效EMAIL地址
功能 IsEMail(电邮: 弦乐 ): 布尔 ;
VAR 年代: 字符串 ; ETpos: 整数 ;
开始
ETpos:= POS( “@” , 电子邮件);
如果 ETpos> 
开始
S:=复制(电子邮件,ETpos + ,长度(电子邮件));
如果 (POS( '。' ,S)> ) 和 (POS( '。' ,S)<长度(S)) ,然后
结果:= 真正的 其他 结果:= 虚假的 ;
年底
其他
结果:= 虚假的 ;
结束 ;
◇[DELPHI]判断系统是否连接INTERNET
需要引入URL 。 DLL中的InetIsOffline函数。
函数申明为:
功能 InetIsOffline(标志: 整数 ): 布尔 ,STDCALL;外部 “URL.DLL” ;
然后就可以调用函数判断系统是否连接到互联网
如果 InetIsOffline( ), 然后 ShowMessage( “ 没有连接!” 
其他 ShowMessage( '连接!' );
该函数返回 TRUE, 如果本地系统没有连接到互联网。
附:
大多数装有IE或OFFICE97的系统都有此DLL可供调用。
InetIsOffline
BOOL InetIsOffline(
DWORD dwFlags中,
);
◇[DELPHI]简单地播放和暂停WAV文件
使用 mmsystem;
功能 PlayWav( const的 文件名 ​​: 字符串 ): 布尔 ;
开始
结果:= PlaySound( PChar类型 (文件名 ​​), ,SND_ASYNC);
结束 ;
程序 StopWav;
VAR
缓冲区: 数组 0 .. 2 的 字符 ;
开始
缓冲区[ ]:=# ;
PlaySound(缓冲, ,SND_PURGE);
结束 ;
◇[DELPHI]取机器的BIOS信息
与 Memo1 。 行 
开始
新增( “MainBoardBiosName:” + ^ I + 字符串 ( PCHAR (PTR( $ FE061 ))));
新增( “MainBoardBiosCopyRight:” + ^ I + 字符串 ( PCHAR (PTR( $ FE091 ))));
新增( “MainBoardBiosDate:” + ^ I + 字符串 ( PCHAR (PTR( $ FFFF5 ))));
新增( “MainBoardBiosSerialNo:” + ^ I + 字符串 ( PCHAR (PTR( $ FEC71 ))));
结束 ;
◇[DELPHI]网络下载文件
使用 URLMON;
功能 DownloadFile(来源,目的地: 字符串 ): 布尔 ;
开始
试试
结果:= UrlDownloadToFile( 零 , PChar类型 (源), PChar类型 (DEST), , 零 )= ;
除非
结果:= 假 ;
结束 ;
结束 ;
如果 DownloadFile( “ http://www.borland.com/delphi6.zip ,“ C:/的Kylix 。 压缩“) , 然后
ShowMessage( '下载成功“ 
其他 ShowMessage( '下载unsuccesful“ 
◇[DELPHI]解析服务器IP地址
使用 Winsock的
功能 IPAddrToName(IPADDR: 字符串 ): 字符串 ;
VAR
SockAddrIn:TSockAddrIn;
HostEnt:PHostEnt;
WSADATA:TWSAData;
开始
调用WSAStartup( 101美元 ,WSADATA);
SockAddrIn 。 sin_addr 。 s_addr:= inet_addr( PChar类型 (IPADDR));
HostEnt:= gethostbyaddr(@ SockAddrIn 。 sin_addr 。 S_addr, ,AF_INET);
如果 HostEnt <> 无 则 结果是:= StrPas(Hostent ^ h_name) 其他 结果:= '' ;
结束 ;
◇[DELPHI]取得快捷方式中的连接
功能 ExeFromLink( 常量 linkname: 字符串 ): 字符串 ;
VAR
FDir,
FName参数,
ExeName: PChar类型 ;
Z: 整数 ;
开始
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);
如果 Z> 32 
结果:= StrPas(ExeName)
其他
结果:= '' ;
StrDispose(FDir);
StrDispose(FName参数);
StrDispose(ExeName);
结束 ;
◇[DELPHI]控制TCombobox的自动完成
{'排序'属性的TCombobox为true}
VAR lastKey: 字 / /全局变量
/ / TCombobox的的OnChange事件
程序 TForm1 。 AutoCompleteChange(发件人:TObject的);
VAR
SearchStr: 字符串 ;
RETVAL: 整数 ;
开始
SearchStr:=(发件人 的 。TCombobox)文本;
如果 lastKey <> VK_BACK 然后 / /退格:VK_BACK或08美元
开始
RETVAL:=(发件人 的 。TCombobox)执行(CB_FINDSTRING - , LongInt ( PChar类型 (SearchStr)));
如果 RETVAL> CB_Err 然后
开始
(发件人 的 。TCombobox)的ItemIndex:= RETVAL;
(发件人 的 。TCombobox)SelStart的:=长度(SearchStr);
(发件人 的 。TCombobox)并将SelLength:=
(长((发件人 的 。TCombobox)文本) -长度(SearchStr));
结束 / / RETVAL> CB_Err
结束 / / lastKey <> VK_BACK
lastKey:= / /复位lastKey
结束 ;
/ / TCombobox的OnKeyDown事件
程序 TForm1 。 AutoCompleteKeyDown(发件人:TObject的; VAR 重点: 字 ;
移位:TShiftState);
开始
lastKey:=键;
结束 ;
◇[DELPHI]如何清空一个目录
功能 EmptyDirectory(TheDirectory: 字符串 ;递归: 布尔 ):
布尔 ;
VAR
SearchRec:TSearchRec;
RES: 整数 ;
开始
结果:= 假 ;
TheDirectory:= NormalDir(TheDirectory);
RES:=使用FindFirst(TheDirectory + '*.*' ,faAnyFile,SearchRec);
试试
而 RES = 
开始
如果 (SearchRec 。 名称<> '。' ) 和 (SearchRec 。 名称<> '..' ), 然后
开始
如果 ((SearchRec 。 的Attr 和 faDirectory)> ) 和 递归
然后 开始
EmptyDirectory(TheDirectory + SearchRec 。 名, 真 );
RemoveDirectory( PChar类型 (TheDirectory + SearchRec 。 名称));
年底
否则 开始
删除文件( PChar类型 (TheDirectory + SearchRec 。 名称))
结束 ;
结束 ;
RES:= FindNext(SearchRec);
结束 ;
结果:= 真 ;
最终
FindClose(SearchRec 。 FindHandle);
结束 ;
结束 ;
◇[DELPHI]如何计算一个目录的大小
功能 GetDirectorySize( 常量 ADirectory: 字符串 ): 整数 ;
VAR
导演:TSearchRec;
RET: 整数 ;
路径: 字符串 ;
开始
结果:= ;
路径:= ExtractFilePath(ADirectory);
RET:= sysutils的 。 使用FindFirst(ADirectory,faAnyFile,DIR);
如果 惩戒<> NO_ERROR 然后 退出;
试试
而 RET = NO_ERROR 
开始
公司(结果,导演 。 尺寸);
如果 (目录 。 的Attr 在 [faDirectory]) 和 (目录 。 名称[ ] <> '。' ) ,然后
公司(结果,GetDirectorySize(路径+目录 。 名称+ '/ *.*“ ));
RET:= sysutils的 。 FindNext(目录);
结束 ;
最终
sysutils的 。 FindClose(目录);
结束 ;
结束 ;
◇[DELPHI]安装程序如何添加到卸载列表
操作注册表,如下:
,在HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION /卸载键下建立一个主键,名称任意。
例HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION /卸载/ MyUninstall
,在HKEY_LOCAL_MACHINE / SOFTWARE / MICROSOFT / WINDOWS / CURRENTVERSION /卸载/ MyUnistall下键两个串值,
这两个串值的名称是特定的:的DisplayName和UninstallString。
给串的DisplayName赋值为显示在“删除应用程序列表”中的名称,如。 “针对卸载之一” ;
给串UninstallString赋值为执行的删除命令,如C:/ WIN97 / UNINST 。 EXE - F“C:/ TestPro / aimTest 。 ISU“
◇[DELPHI]截获WM_QUERYENDSESSION关机消息
键入
TForm1 = 类 (TForm)
程序 WMQueryEndSession( VAR 消息:TWMQueryEndSession);消息WM_QUERYENDSESSION;
程序 CMEraseBkgnd( VAR 消息:TWMEraseBkgnd);消息WM_ERASEBKGND;
民营
{}私人声明
市民
{公开声明}
结束 ;
程序 TForm1 。 WMQueryEndSession( VAR 消息:TWMQueryEndSession);
开始
Showmessage( “ 计算机即将关闭” );
结束 ;
◇[DELPHI]获取网上邻居
程序 getnethood(); / / NT做服务器,WIN98上调试通过。
VAR
A,I: 整数 ;
ERRCODE: 整数 ;
netres: 数组 0 .. 1023 的 NETRESOURCE;
enumhandle:thandle;
enumentries:DWORD;
BUFFERSIZE:DWORD;
年代: 字符串 ;
mylistitems:tlistitems;
mylistitem:tlistitem;
alldomain:以TStrings;
开始 / / listcomputer是一个ListView列出所有电脑; ControlCenter的是一种形式。
alldomain:= tstringlist 。 创建;
与 netres [ 做 开始
dwscope:= RESOURCE_GLOBALNET;
dwtype:= RESOURCETYPE_ANY;
dwdisplaytype:= RESOURCEDISPLAYTYPE_DOMAIN;
dwusage:= RESOURCEUSAGE_CONTAINER;
lplocalname:= 零 ;
lpremotename:= 零 ;
lpcomment:= 零 ;
lpprovider:= 零 ;
结束 / /获取所有的域
ERRCODE:= wnetopenenum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@ netres [ ],enumhandle);
如果 ERRCODE = NO_ERROR 然后 开始
enumentries:= 1024 ;
BUFFERSIZE:= SIZEOF(netres);
ERRCODE:= wnetenumresource(enumhandle,enumentries,@ netres [ ],BUFFERSIZE);
结束 ;
A:= ;
mylistitems:= ControlCenter的 。 lstcomputer 。 项目;
mylistitems 。 清除;
而 ( 字符串 (netres [A]。lpprovider)<> '' ) 和 (ERRCODE = NO_ERROR) 
开始
alldomain 。 添加(netres [A] lpremotename);
A:= A + ;
结束 ;
wnetcloseenum(enumhandle);
/ /获取所有的计算机
mylistitems:= ControlCenter的 。 lstcomputer 。 项目;
mylistitems 。 清除;
为 I:= 至 alldomain 。 计数, 
开始
与 netres [ 做 开始
dwscope:= RESOURCE_GLOBALNET;
dwtype:= RESOURCETYPE_ANY;
dwdisplaytype:= RESOURCEDISPLAYTYPE_SERVER;
dwusage:= RESOURCEUSAGE_CONTAINER;
lplocalname:= 零 ;
lpremotename:= PChar类型 (alldomain [I]);
lpcomment:= 零 ;
lpprovider:= 零 ;
结束 ;
ERRCODE:= WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@ netres [ ],EnumHandle);
如果 ERRCODE = NO_ERROR 然后
开始
EnumEntries:= 1024 ;
的bufferSize:=一下SizeOf(NetRes);
ERRCODE:= WNetEnumResource(EnumHandle,EnumEntries,@ NetRes [ ]的bufferSize);
结束 ;
A:= ;
而 ( 字符串 (netres [A]。lpprovider)<> '' ) 和 (ERRCODE = NO_ERROR) 
开始
mylistitem:= mylistitems 。 添加;
mylistitem 。 的ImageIndex:= ;
mylistitem 。 标题:=大写(stringreplace( 字符串 (NetRes [A] lpremotename), '/ /' , '' ,[rfReplaceAll]));
A:= A + ;
结束 ;
wnetcloseenum(enumhandle);
结束 ;
结束 ;
◇[DELPHI]获取某一计算机上的共享目录
程序 getsharefolder( const的 计算机名: 字符串 );
VAR
ERRCODE,A: 整数 ;
netres: 数组 0 .. 1023 的 NETRESOURCE;
enumhandle:thandle;
enumentries,BUFFERSIZE:DWORD;
年代: 字符串 ;
mylistitems:tlistitems;
mylistitem:tlistitem;
mystrings:tstringlist;
开始
与 netres [ 做 开始
dwscope:= RESOURCE_GLOBALNET;
dwtype:= RESOURCETYPE_DISK;
dwdisplaytype:= RESOURCEDISPLAYTYPE_SHARE;
dwusage:= RESOURCEUSAGE_CONTAINER;
lplocalname:= 零 ;
lpremotename:= PChar类型 (计算机名);
lpcomment:= 零 ;
lpprovider:= 零 ;
结束 / /获取根结点
ERRCODE:= wnetopenenum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER,@ netres [ ],enumhandle);
如果 ERRCODE = NO_ERROR 然后
开始
EnumEntries:= 1024 ;
的bufferSize:=一下SizeOf(NetRes);
ERRCODE:= WNetEnumResource(EnumHandle,EnumEntries,@ NetRes [ ]的bufferSize);
结束 ;
wnetcloseenum(enumhandle);
A:= ;
mylistitems:= ControlCenter的 。 lstfile 。 项目;
mylistitems 。 清除;
而 ( 字符串 (netres [A]。lpprovider)<> '' ) 和 (ERRCODE = NO_ERROR) 
开始
与 mylistitems 
开始
mylistitem:=补充;
mylistitem 。 的ImageIndex:= ;
mylistitem 。 标题:= extractfilename(。netres [A] lpremotename);
结束 ;
A:= A + ;
结束 ;
结束 ;
◇[DELPHI]得到硬盘序列号
VAR SerialNum:PDWORD; A,B:DWORD;缓冲: 数组 0 .. 255 的 字符 ;
开始
如果 GetVolumeInformation(“C:/',缓冲,一下SizeOf(缓冲区),SerialNum,A,B, 无 , ), 然后 Label1的 。 标题:= IntToStr(SerialNum ^);
结束 ;
◇[DELPHI] MEMO的自动翻页
程序 ScrollMemo(备注:TMemo;方向: 字符 );
开始
案件 方向 
“D” : 开始
SendMessage消息(备注 。 手柄, {HWND的备忘录控制}
WM_VSCROLL, Windows消息} {
SB_PAGEDOWN, 滚动命令} {
) {}不使用
结束 ;
“U” : 开始
SendMessage消息(备注 。 手柄, {HWND的备忘录控制}
WM_VSCROLL, Windows消息} {
SB_PAGEUP, 滚动命令} {
); } {未使用
结束 ;
结束 ;
结束 ;
程序 TForm1 。 Button1Click(发件人:TObject的);
开始
ScrollMemo(Memo1, “D” ); / /上翻页
结束 ;
程序 TForm1 。 Button1Click(发件人:TObject的);
开始
ScrollMemo(Memo1, “U” ); / /下翻页
结束 ;
◇[DELPHI] DBGrid的中回车到下个位置(Tab键)
程序 TForm1 。 DBGrid1KeyPress(发件人:TObject的; VAR 键: 字符 );
开始
如果 钥匙=# 13 然后
如果 DBGrid1 。 列 。 电网 。 的SelectedIndex <DBGrid1 。 列 。 计数- 
DBGrid1 。 列[DBGrid1 。 列 。 电网 。 的SelectedIndex + ]。领域 。 FocusControl
其他
开始
表1 。 下一步;
DBGrid1 。 专栏[ ]字段。 。 FocusControl;
结束 ;
结束 ;
◇[DELPHI]如何安装控件
安装方法:
对于单个控件,组件- >安装组件..--> PAS或DCU文件- >安装
对于带*. DPK文件的控件包, 文件 - >打开(下拉列表框中选*. DPK) - >安装即可。
对于带*. DPL文件的控件包,安装软件包- >添加- > DPL文件名 ​​即可。
,如果以上安装按钮为失效的话,试试编译按钮。
,是运行时库则在选项下的包下的runtimepackes加之。
如果编译时提示文件找不到的话,一般是控件的安装目录不在Delphi中的LIB目录中,有两种方法可以解决:
,把安装的原文件拷入到Delphi中的LIB目录下。
或者工具- >环境选项中把控件原代码路径加入到Delphi中的LIB目录中即可。
◇[DELPHI]目录完全删除(DELTREE)
程序 TForm1 。 DeleteDirectory(strDir: 字符串 );
VAR
SR:TSearchRec;
FileAttrs: 整数 ;
strfilename: 字符串 ;
strPth: 字符串 ;
开始
strpth:= Getcurrentdir();
FileAttrs:= faAnyFile;
如果 使用FindFirst(strpth + '/'+ strdir +' / *.*', FileAttrs,SR)= 
开始
如果 (SR 。 的Attr 和 FileAttrs)= SR 。 的Attr 然后
开始
strfilename:= SR 。 名称;
如果 fileexists(strpth + '/'+ strdir +' /'+ strfilename) 
删除文件(strpth + '/'+ strdir +' /'+ strfilename);
结束 ;
而 FindNext(SR)= 
开始
如果 (SR 。 的Attr 和 FileAttrs)= SR 。 的Attr 然后
开始
strfilename:= SR 。 名称;
如果 fileexists(strpth + '/'+ strdir +' /'+ strfilename) 
删除文件(strpth + '/'+ strdir +' /'+ strfilename);
结束 ;
结束 ;
FindClose(SR);
removedir(strpth +'/'+ strdir);
结束 ;
结束 ;
◇[DELPHI]取得TMemo控件当前光标的行和列信息到Tpoint中
1, 功能 ReadCursorPos(SourceMemo:TMemo):TPoint;
VAR 点:TPoint;
开始
 点 。 Y:= SendMessage消息(SourceMemo 。 手柄,EM_LINEFROMCHAR,SourceMemo 。 SelStart的, );
 点 。 X:= SourceMemo 。 (SourceMemo SelStart的,SendMessage消息 。 手柄,EM_LINEINDEX,点 , Y, );
 结果:=点;
结束 ;
2。 LineLength:= SendMessage消息(memol.handle,EM - LINELENGTH,CPOS, ); / /行长
◇[DELPHI]读硬盘序列号
功能 GetDiskSerial(DiskChar: 字符 ): 字符串 ;
VAR
SerialNum:PDWORD;
A,B:DWORD;
缓冲液: 数组 0 .. 255 的 字符 ;
开始
结果:=“”;
如果 GetVolumeInformation( PChar类型 (diskchar +“:/”),缓冲,一下SizeOf(缓冲区),SerialNum,
A,B, 无 , ), 然后
 结果:= IntToStr(SerialNum ^);
结束 ;
◇[INTERNET] CSS常用综合技巧
,P:第一字母 {字体大小:300%;浮动:左} / /首字会比普通字体加大三倍。
/连接一个外部样式表
。嵌入一个样式表
 
/内联样式
宋体 / / SPAN接受STYLE,CLASS和ID属性
 
 
DIV 可以包含段落,标题,表格甚至其它部分
 
 
。 CLASS 属性
/ /定义见3。
,ID属性
 
/ /定义见3。
。属性列表
字体风格:字体风格:[一般|倾斜|斜;
字体大小:字体大小:[XX小| X -小|小|中|大| X -大| XX -大|大|小| <长度> | <百分比>]
文本修饰:文本装饰:[下划线| |划线| |行通| |闪烁]
文本转换:文本转换:[无|利用|大写|小写]
背景颜色:背景色:[<颜色> |透明]
背景图象:背景图像:[|无]
行高:行高:[一般| <数字> | <长度> | <百分比>]
边框样式:边框风格:[无|点|虚线|固体| 双 |槽|脊|插图|开始]
漂浮:浮动:[左|右|无]
。长度单位
相对单位:
EM(EM,元素的字体的高度)
EX(x -高度,字母“X”的高度)
PX(像素,相对于屏幕的分辨率)
绝对长度:
在 (英寸, 英寸= 2.54 厘米)
公分(厘米, 厘米= 10 毫米)
毫米(米)
PT(点, 点= 72 英寸)
PC(帕, 帕= 12 点)
◇[DELPHI] VCL制作简要步骤
。创建部件属性方法事件
(建立库单元,继承为新的类型,添加属性,方法,事件,注册部件,建立包文件)
,消息处理
,异常处理
。部件可视
◇[DELPHI]动态连接库的装载
静态装载: 程序 名称;外部 “lib.dll” ;
动态装载: VAR 处理:Thandle;
处理:= LoadLibrary的( “lib.dll' );
如果 处理<> 
开始
{的doSomething}
FreeLibrary则(句柄);
结束 ;
◇[DELPHI]指针变量和地址
VAR X,Y: 整数 ,P:^ 整数 / /指向整数变量的指针
X:= 10 / /变量赋值
P:= @ X; / /变量x的地址
Y:= P ^; / /为Ÿ赋值指针P
@ @ 程序 / /返回过程变量的内存地址
◇[DELPHI]判断字符是汉字的一个字符
ByteType( “ 你好哈哈吗' , )= mbLeadByte / /是第一个字符
ByteType( “ 你好哈哈吗' , )= mbTrailByte / /是第二个字符
ByteType( “ 你好哈哈吗' , )= mbSingleByte / /不是中文字符
◇[DELPHI]备忘录的定位操作
memo1 。 线 。 删除( ) / /删除第1行
memo1 。 SelStart的:= 10 / /定位10字节处
◇[DELPHI]获得双字节字符内码
功能 getit(S: 字符串 ): 整数 ;
开始
结果:= 字节 (S [ ])* 百美元 字节 (S [ ]);
结束 ;
使用:getit( “ 计” ) / / $ bcc6即十进制48326
◇[DELPHI]调用地址数据存储过程
存储过程如下:
创建 过程 addrecord(
RECORD1 VARCHAR( 10 
RECORD2 VARCHAR( 20 
作为
开始
插入到表名(field1,field2欲)值(:RECORD1:RECORD2)
年底
执行存储过程:
EXECUTE 程序 addrecord(“urrecord1”,“urrecord2”)
◇[DELPHI]将文件存到BLOB字段中
功能 blobcontenttostring( 常量 名: 字符串 ): 字符串 ;
开始
与 tfilestream 。 创建(文件名 ​​,fmopenread) 
试试
中用SetLength(结果,大小);
阅读( 指针 (结果)^,大小);
最终
免费;
结束 ;
结束 ;
/ /保存字段
开始
如果 (opendialog1 。 执行) ,然后
开始
sFileName:= OpenDialog1 。 文件名​​;
adotable1 。 编辑;
adotable1 。 fieldbyname( “Visio的” 。)asstring:= Blobcontenttostring(文件名 ​​);
adotable1 。 职务;
结束 ;
◇[DELPHI]把文件全部复制到剪贴板
使用 shlobj,ACTIVEX,clipbrd;
程序 Tform1 。 copytoclipbrd( VAR 文件名 ​​: 字符串 );
VAR
FE:TFormatEtc;
中等:TStgMedium;
dropfiles:PDropFiles;
PFILE: PChar类型 ;
开始
FE 。 cfFormat:= CF_HDROP;
FE 。 dwAspect:= DVASPECT_CONTENT;
FE 。 tymed:= TYMED_HGLOBAL;
中 。 HGLOBAL:=的GlobalAlloc(GMEM_SHARE 或 GMEM_ZEROINIT,一下SizeOf(TDropFiles)+长度(文件名 ​​)+ );
如果 中等 。 HGLOBAL <> ,然后 开始
中 。 tymed:= TYMED_HGLOBAL;
dropfiles:= GlobalLock(中等 。 HGLOBAL);
试试
。dropfiles ^ PFILES:=一下SizeOf(TDropFiles);
dropfiles ^ fwide:= 假 ;
longint (PFILE):= longint (dropfiles)+一下SizeOf(TDropFiles);
StrPCopy(PFILE,文件名);
公司(PFILE,长度(文件名 ​​)+ );
PFILE ^:=# ;
最终
GlobalUnlock(中等 。 HGLOBAL);
结束 ;
剪贴板 。 SetAsHandle(CF_HDROP,中等 。 HGLOBAL);
结束 ;
结束 ;
◇[DELPHI]列举当前系统运行进程
使用 TLHelp32;
程序 TForm1 。 Button1Click(发件人:TObject的);
VAR lppe:TProcessEntry32;
发现: 布尔 ;
手:THandle;
开始
手:= CreateToolhelp32Snapshot(TH32CS_SNAPALL, );
发现:= Process32First(手,lppe);
同时 发现 
开始
ListBox1中 。 项 。 添加(StrPas(lppe 。 szExeFile));
发现:= Process32Next(手,lppe);
结束 ;
结束 ;
◇[DELPHI]根据BDETable1建立新表表2
表2:= TTable 。 创建( 零 );
试试
表2 。 数据库名:=表1 。 数据库名;
表2 。 FieldDefs 。 分配(表1 。 FieldDefs);
表2 。 IndexDefs 。 分配(表1 。 IndexDefs);
表2 , 表名:= 'NEW_TABLE“ ;
表2 。 CreateTable();
最终
表2 , 免费();
结束 ;
◇[DELPHI]最菜理解DLL建立和引用
/ /先看DLL源(文件 - >新建 - > DLL)
库 Project1的;
使用
SysUtils中声明,类;
功能 addit(F: 整数 ,S: 整数 ): 整数 ;出口;
开始
makeasum:= F + S;
结束 ;
出口
addit;
结束 
/ /调用(IN UR PROJECT)
实施
功能 addit(F: 整数 ,S: 整数 ): 整数 ;远;外部 'Project1的“ / /申明
{调用就是addit(2,4),结果显示6}
◇[DELPHI]动态读取程序自身大小
功能 GesSelfSize: 整数 ;
VAR
F: 文件 的 字节 ;
开始
filemode:= ;
assignfile(F,应用 。 exename);
复位(F);
结果:=文件大小(F) / /单位是字节
closefile(F);
结束 ;
◇[DELPHI]读取BIOS信息
与 Memo1 。 行 
开始
新增( “MainBoardBiosName:” + ^ I + 字符串 ( PCHAR (PTR( $ FE061 ))));
新增( “MainBoardBiosCopyRight:” + ^ I + 字符串 ( PCHAR (PTR( $ FE091 ))));
新增( “MainBoardBiosDate:” + ^ I + 字符串 ( PCHAR (PTR( $ FFFF5 ))));
新增( “MainBoardBiosSerialNo:” + ^ I + 字符串 ( PCHAR (PTR( $ FEC71 ))));
结束 ;
◇[DELPHI]动态建立MSSQL别名
程序 TForm1 。 Button1Click(发件人:TObject的);
VAR 我清单:TStringList;
开始
我清单:= TStringList 。 创建;
试试
与 我清单 
开始
添加( “SERVER NAME = 210.242.86.2” );
添加( “数据库名称= DB' );
添加( “USER NAME = SA' );
结束 ;
会议1 。 AddAlias( “TESTSQL” , “MSSQL” , 我清单); / /ミMSSQL
会议1 。 SaveConfigFile;
最终
我清单 , 免费;
会议1 。 活动:= 真 ;
数据库1 。 数据库名:= 'DB' ;
数据库1 。 AliasName:= 'TESTSQL“ ;
数据库1 。 的LoginPrompt:= 假 ;
数据库1 。 PARAMS 。 添加( “USER NAME = SA' );
数据库1 。 PARAMS 。 添加( “PASSWORD =' );
数据库1 。 连接:= 真 ;
结束 ;
结束 ;
程序 TForm1 。 Button2Click(发件人:TObject的);
开始
数据库1 。 连接:= 假 ;
会议1 。 DeleteAlias( “TESTSQL' );
结束 ;
◇[DELPHI]播放背景音乐
使用 mmsystem
/ /播放音乐
MCISendString( “OPEN E:/ 1.MID型SEQUENCER ALIAS NN' , '' , , );
MCISendString( “PLAY NN 0' , '' , , );
MCISendString( “ 关闭动画' , '' , , );
结束 ;
/ /停止播放
MCISendString( “OPEN E:/ 1.MID型SEQUENCER ALIAS NN' , '' , , );
MCISendString( “STOP NN' , '' , , );
MCISendString( “ 关闭动画' , '' , , );
◇[DELPHI]接口和类的一个范例代码
键入 {接口和类申明:区别在于不能在接口中申明数据成员,任何非公有的方法,公共方法不使用公共关键字}
Isample = 接口 / /定义Isample接口
功能 的GetString: 字符串 ;
结束 ;
Tsample = 类 (TInterfacedObject,Isample)
市民
功能 的GetString: 字符串 ;
结束 ;
/ /函数定义
功能 Tsample 。 GetString的: 字符串 ;
开始
结果:= “什么节目是” ;
结束 ;
/ /调用类对象
VAR 样本:Tsample;
开始
示例:= Tsample 。 创建;
showmessage(样品 。 GetString的+ “类的对象!” );
样品 。 自由;
结束 ;
/ /调用接口
VAR sampleinterface:Isample;
示例:Tsample;
开始
示例:= Tsample 。 创建;
sampleInterface:=样品; / /接口的实现必须使用类
{以上两行也可表达成sampleInterface:= Tsample.create;}
showmessage(sampleInterface 。 GetString的+ “接口!” );
/ / sample.free; {和局部类不同,接口中的类自动释放}
sampleInterface:= 零 {释放接口对象}
结束 ;
◇[DELPHI]任务条就看不当程序
VAR
ExtendedStyle: 整数 ;
开始
应用 。 初始化;
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, ); / /隐藏
RegisterServiceProcess(GetCurrentProcessID, ); / /显示
◇[DELPHI]检测光驱符号
VAR 驱动器: 字符 ;
cdromID: 整数 ;
开始
为 驱动器:= 'D' 到 'Z' 
开始
cdromID:= GetDriveType( PChar类型 (驱动器+':/'));
如果 cdromID = 然后 showmessage( '你的光驱为:“ +驱动器+ '!盘“ );
结束 ;
结束 ;
◇[DELPHI]检测声卡
如果 auxGetNumDevs()<= 则 showmessage( '没有声卡找到!“ ) 其他 showmessage( “ 任何声卡找到!” );
◇[DELPHI]在字符串网格中画图
StringGrid 。 OnDrawCell事件
与 StringGrid1 。 帆布 
画(矩形 , 左,矩形 , 顶,Image1的 。 图片 。 图形);
◇[SQL SERVER] SQL中代替像语句的另一种写法
比如查找用户名包含有“C”的所有用户,可以用
使用MyDatabase的
从表1中选择其中username LIKE'%C%*“
下面是完成上面功能的另一种写法:
使用MyDatabase的
从表1中选择其中CHARINDEX(* 'C' , 用户名)> 0
这种方法理论上比上一种方法多了一个判断语句,即> ,但这个判断过程是最快的,我想信 80 %以上的运算都是花在查找字
符串及其它的运算上,所以运用CHARINDEX函数也没什么大不了。用这种方法也有好处,那就是对%,|等在不能直接用像
查找到的字符中可以直接在这CHARINDEX中运用,如下:
使用MyDatabase的
从表1中选择其中CHARINDEX(* '%' ,用户名)> 0
也可以写成:
使用MyDatabase的
从表1中选择其中CHARINDEX(* 字符 ( 37 ),用户名)> 0
ASCII的字符即为%
◇[DELPHI] SQL显示多数据库/表
SELECT DISTINCT一个 。 边壕,一 , 兴明,B , 从“建杰公子 。 DBF“的,”公子 。 DBF“B
其中A , 边壕= B 。 边壕
◇[DELPHI] RFC(请求 对于 评论)相关
IETF(互联网工程任务组)维护RFC文档HTTP: / / www.ietf.cnri.reston.va.us/
RFC882:报文头标结构
RFC1521:MIME第一部分,传输报文方法
RFC1945:多媒体文档传输文档
◇[DELPHI] TNMUUProcessor的使用
VAR inStream中,outStream:TFileStream;
开始
inStream中:= TFileStream 。 创建(INFILE 。 TXT,fmOpenRead);
outStream:= TFileStream(OUTFILE 。 TXT,fmCreate);
NMUUE 。 方法:= uuCode; {UUENCODE /解码}
/ / NMUUE.Method:= uuMIME;} {MIME
NMUUE 。 InputStream中:=河道;
NMUUE 。 OutputStream的:= OutStream;
NMUUE 。 编码; } {编码处理
/ / NMUUE.Decode;} {解码处理
inStream中 。 自由;
outStream 。 自由;
结束 ;
◇[DELPHI] TFileStream的操作
/ /从文件流当前位置读计数字节到缓冲区BUFFER
函数 读取( VAR 缓冲区;数: longint ): longint ;覆盖;
/ /将缓冲区BUFFER读到文件流中
函数 写 ( 常量 缓冲区;数: longint ): longint ;覆盖;
/ /设置文件流当前读写指针为OFFSET
函数 求(偏移: longint ;来源: 字 ): longint ;覆盖;
来源= {soFromBeginning,soFromCurrent,soFromEnd}
/ /从另一文件流中当前位置复制COUNT到当前文件流当前位置
功能 copyfrom(来源:TStream;数: longint ): longint ;
/ /读指定文件到文件流
VAR myFStream:TFileStream;
开始
myFStream:= TFileStream 。 创建(OpenDialog1 。 文件名 ​​,fmOpenRead);
结束 ;
[JavaScript的]检测是否安装IE插件和QuickTime的冲击波
 
VAR myPlugin =航海家 。 插件[“冲击波”;
如果 (myPlugin)
文件 。 writeln (“你已经安装了冲击波!”)
其他
文件 。 writeln (“你尚未安装冲击波!”)
 
 
VAR myPlugin =航海家 。 插件[“QuickTime的”];
如果 (myPlugin)
文件 。 writeln (“你已经安装了QuickTime的!”)
其他
文件 。 writeln (“你尚未安装QuickTime的!”)
 
/ / Delphi的控件​​数组的简易实现
 
程序 TForm1 。 Edit1Enter(发件人:TObject的);
开始
 
(发件人 作为 。TEDIT)颜色:= ClInfo;
文件 : / /改变编辑获得焦点时的背景颜色为黄色
 
结束 ;
 
程序 TForm1 。 Edit1Exit(发件人:TObject的);
开始
 
(发件人 作为 。TEDIT)颜色:= ClWhite;
文件 : / /改变编辑失去焦点时的背景颜色为白色
 
结束 ;
 
文件 : / /设置窗体中所有的编辑背景颜色为ClLime
程序 TForm1 。 Button1的(发件人:TObject的);
VAR
指数: 整数 ;
开始
 
对于 指数:= 至 ControlCount - 
开始
 
如果 组件[索引] 是 TEDIT 然后
开始
(组件[索引] 作为 。TEDIT)颜色:= ClLime;
年底

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用 Delphi 开发程序时,界面卡顿是一个很常见的问题。尤其在界面中需要大量的计算和操作时,程序的卡顿程度会更加明显。下面是几个可以用来优化 Delphi 界面的不卡顿技巧: 1. 开启多线程 - 如果你需要大量计算,可以使用多线程来分担计算的工作量。这样可以让你的程序更加流畅,并且可以缩短程序执行的时间。 2. 使用异步操作 - 异步操作可以让程序不会阻塞主线程。比如,当你在加载远程数据时,在数据加载的同时,可以让用户继续操作程序。 3. 避免使用太多图形控件 - 过多的图形控件会加重 CPU 的压力,导致程序卡顿。所以,在设计界面时,最好简洁明了。 4. 使用合适的缓存机制 - 缓存可以减少大量计算的重复性,通过缓存数据,可以大大降低程序时延。 5. 优化数据库操作 - 避免频繁的数据库查询操作,可以使用内存表或其他缓存机制来减少数据库操作的次数。 总之,在设计程序时,可以结合具体的需求和情况,打造一个优秀的 Delphi 界面,减少卡顿现象的出现。 ### 回答2: Delphi是一款功能强大的开发工具,但有时可能会遇到界面卡顿的情况。为了解决这个问题,以下是一些技巧: 1. 避免阻塞主线程:对于耗时的操作,如读取和处理大量数据,不应该在主线程中进行,因为这会导致界面冻结。相反,您可以在另一个线程中执行这些任务,从而避免阻塞主线程。 2. 使用虚拟列表:如果您需要在列表中显示大量数据,使用虚拟列表可以避免界面卡顿。虚拟列表只会在需要时加载并显示数据,而不是像普通列表那样显示所有数据。 3. 避免频繁的绘图:频繁的绘图操作会导致界面卡顿,因此您应该避免在短时间内执行大量的绘图操作。相反,可以将它们合并到一个操作中,或者在绘图之前检查是否需要重新绘图。 4. 使用异步调用:如果您需要执行一些需要较长时间的操作,如网络请求,使用异步调用可以避免界面卡顿。在异步调用完成后,主线程将收到通知,并可以更新界面。 5. 清理无用的对象:Delphi在某些情况下可能会导致内存泄漏。为了避免这种情况,您可以在不需要对象时调用Free函数来释放它们,从而释放内存。 总而言之,要避免Delphi界面卡顿,您应该避免阻塞主线程,使用虚拟列表,避免频繁的绘图操作,使用异步调用,以及清理无用的对象。这些技巧将有助于提高Delphi应用程序的性能和稳定性。 ### 回答3: Delphi是一种应用程序开发工具,其界面的卡顿问题可能对用户的使用体验产生负面影响。以下是几种可以优化Delphi界面以减少卡顿的技巧: 1. 使用异步编程技术 - 异步编程能够以一种非阻塞的方式处理任务,从而减少卡顿。使用异步技术可以让程序在处理数据或执行一些操作时不会挂起,在后台处理完成后通知主线程更新UI界面。 2. 使用定时器 - 定时器是一种可以定期执行特定任务的机制。在Delphi中,可以将定时器用于定时刷新界面或更新UI控件的状态,从而优化程序的运行效率。 3. 释放资源 - 资源管理是程序开发过程中的一个重要考虑因素。使用Delphi开发程序时,应该合理地释放资源,包括内存、文件句柄和数据库连接等等。及时地释放这些资源可以确保程序的运行效率和稳定性。 4. 使用多线程 - 多线程技术可以将一些耗时的操作放到后台线程中处理,从而保持程序的响应速度。同时,在主线程中处理UI的更新操作可以提高程序的稳定性和运行效率。 5. 优化代码 - 优化代码的质量可以为程序的运行速度提供保障。开发者应该针对性地优化代码,减少冗余的操作,减少UI线程的压力。例如,减少不必要的重绘UI操作,或者缓存计算后的结果来减少不必要的计算操作。 总之,优化Delphi界面的关键在于减少不必要的操作,提高程序的响应速度和稳定性。以上的优化技巧是提高Delphi程序性能的主要方式,但是具体的优化方式还需要根据实际应用场景来选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值