Delphi之雕虫小技 设计Form时的快捷键 Del：删除所选组件； Esc：选择当前组件的容器（通常是Panel,Group或Form）； F11：在Form或Unit和对象检查器之间切换；
F12：在Form和代码编辑器间切换；
Ctrl＋F12：显示"查看Unit"对话框；
Shift＋F12：显示"查看Form"对话框；
TAB：下一个组件;
Shift＋TAB：上一个组件;
方向键：选中此方向上最近的组件;
Ctrl＋方向键：将所选组件移动一个点;
Shift＋方向键：将所选组件改变一个点的大小;
Ctrl＋Shift＋方向键：将所选组件移动一个格;
Shift＋click：按住Shift键再用鼠标点击组件，可以选择多个组件。
Ctrl＋drag：按住Ctrl键在一个容器组件（如Panel,QReport,Groupbox等）里拖动鼠标，可强制选择鼠标拖过的矩形框中的所有属于此容器的可视组件（不包括该容器组件）

提取图标的简便方法
有一个很简单的方法就可以取到在屏幕上显示的任何图标，此方法完全是所见及所得的，完全不必编程去提取。用专门的屏幕截图软件HyperSnap-DX等截取图标后，再将其文件后缀改名.ico即可。若没有这样的软件，就用Windows的"拷贝、粘贴、裁剪"法也可行：
当屏幕上显示包含自己感兴趣的图标的界面时，按Print Screen键，将屏幕保存。打开Windows中的"程序\附件\画图"程序(或者是Photoshop也行)，按Ctrl+V键，将画面贴入其中。用鼠标点击工具箱的"选定"按钮，拖动鼠标将感兴趣的图标"框选"，然后在菜单中选择"编辑\复制"，将所选内容保存在内存中。
调用任意图标编辑工具，本人用的是Delphi 4中的Image Editor，如采用其他软件操作方法类似。以下是在其上的操作步骤：选择其中的"File\New Icon file"，选择图标大小为16×16或32×32，而后按"OK"键。
选择"Edit\Paste"，即可将所选图标调出。
选择"File\Save"，就可将图标保存于用户自定义的文件中，以备程序调用。

让DBGrid输入更方便

在用DBGrid输入数据(大部分是数字)时，快一点也需要一只手输数，另一只手按Tab，左右开弓。但要是一只手不空呢？下面这段代码能使回车键也有Tab功能，这样一只手就能控制了。

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = ＃13 then
{ if it's an enter key }
with DBGrid1 do
if selectedindex < (fieldcount －1) then { increment the field }
selectedindex := selectedindex ＋1
else
selectedindex := 0;
end;

定制Speedbar

在Delphi的可视化设计界面中，使用最频繁的要数位于屏幕左上角的加速按钮栏(Speedbar)了，我们可以对其进行定制。
右键点击Speedbar，在弹出的快捷菜单中选"Properties"，出现"Speedbar Editor"对话框。假设想要增设一项"语法检查"的功能，可在左边的Categories(类别)列表框中选Project， 再把右侧的Syntax Check(语法检查)图标拖放到Speedbar的合适的位置上，这项功能就加上了。如果speedbar上没有足够的空间来安置新按钮，可将鼠标停在Speedbar右框处，当光标变为双向箭头时，向右拖动一段距离，就可腾出空间。如想删除speedbar上的某个按钮，可简单地把它拖出speedbar的范围，就能删除。操作十分方便。

命令行参数的使用

Delphi提供了访问命令行参数的简洁方式，即使用ParamStr和ParamCount函数。其中ParamStr(0)返回的是当前程序名，如C:\Program\MYPROG.EXE，ParamStr(1)返回第一个参数，以此类推；ParamCount则是参数个数。
var
I:Word;
Y:Integer;
begin
Y:=10;
for I:=1 to ParamCount do begin
Canvas.TextOut(5,Y,ParamStr(I));
Y:=Y＋Canvas.TextHeight(ParamStr(I))＋5;
end;
end;

Jpeg格式文件的处理

1. 在Uses中加入JPEG单元；
2. 定义一个全程变量,例如 var AJPEG:TJPEGImage；
3. 在Form的OnCreate事件中加入：
Canvas.Pen.Color:=clBlack;
Canvas.Pen.Style:=psSolid;
Canvas.Brush.color:=clBtnFace;
Canvas.Brush.Style:=bsSolid;
//此上是设置 Canvas 的一些属性,便于以后清除格式并重新载入新的JPEG图片;
AJpeg:=TJpegImage.Create;
//动态生成AJpeg;
AJpeg.LoadFromFile('D:\Temp.jpg')
//生成AJpeg后，调入JPEG文件 ;

4. 在Form的OnPain事件中加入
Canvas.Rectangle(2,2,560,430);
//画一个黑框的矩形将图片围住;
x:=10; y:=10;
Form1.Canvas.Draw(x,y,AJpeg);
//以(x,y)为左上角输出 JPEG 文件;
//实际上其作用是当图形被破坏是使图形恢复;
5. 在"Load"或"Browse"按钮的 OnClick 事件中加入：
begin
if OpenPictureDialog1.Execute then
begin
AJpeg.Free;
//释放旧AJpeg;
AJpeg:=TJpegImage.Create;
//产生一个新的AJpeg;
AJpeg.LoadFromFile(OpenPictureDialog1.Filename);
//载入JPEG文件;
end;
Canvas.Rectangle(2,2,560,430);
//将Form Clear;
x:=10;
y:=10;
Form1.Canvas.Draw(x,y,AJpeg);
//显示新的AJpeg;
end;

让图像旋转

Delphi中的Image控件可以显示位图，还可以用它完成位图的旋转。
把一个点绕原点旋转α角度后，新的坐标位置与原坐标位置的关系是：
X=xcosα－ysinα
Y= xsinα＋ycosα
例如要把位图顺时针旋转90度，坐标变换公式为：X=－y Y=x
把这个公式用到Image控件上，显示位图的主要问题是Image构件显示的位图只有一个象限，并且x、y坐标也是互相颠倒的。为了解决这个问题，必须在Image构件上建立一个新的坐标原点。
1. 新建一工程Project1, 在Form1上添加image1、 image2、 image3、image4，其Autosize属性设为True，image1用来显示原图，image2、image3、image4分别用来显示旋转90度、180度和270度后的图像。双击image1，选定一幅bmp图片。
2. 添加Button1、Button2、Button3和Button4按钮，其caption属性分别为"原图"、"旋转90度"、"旋转180度"、"旋转270度"。
3. 编写"旋转90度"按钮的On Click事件。
procedure TForm1. Button2Click (Sender: TObject);
var
i,j:integer;
begin
//确定旋转后位图的大小
image2.Picture.Bitmap.Height:=image1.picture.width;
image2.Picture.Bitmap.Width:=image1.picture.height;
for i:=0 to image1.Height do
for j:=0 to image1.Width do
image2.canvas.Pixels[(－i＋image1.Height),j]:=image1.canvas.Pixels[j,i];
end;
4. 编写"旋转180度"按钮的On Click事件。
procedure TForm1.Button3Click(Sender: TObject);
var
i,j:integer;
begin
//确定旋转后位图的大小
image3.Picture.Bitmap.Height:=image1.picture.Height;
image3.Picture.Bitmap.Width:=image1.picture.Width;
for i:=0 to image1.Height do
for j:=0 to image1.Width do
image3.canvas.Pixels[(image1.Width－j),(image1.Height－i)]:=image1.canvas.Pixels[j,i];
end;
5. 编写"旋转270度" 按钮的On Click事件。代码和步骤3相似，只需要用image4替换image2，然后用以下的语句替换步骤3 for循环中的原有的语句。
image4.canvas.Pixels[i,(image1.Width－j)]:=image1.canvas.Pixels[j,i];

检测CD－ROM或是其它磁盘是否有过变化

最简单的检查CD－ROM或是磁盘是否有过变化的方法是检查其volume号码。你可以简单地运用下面的函数来返回磁盘的volume系列号码GetDiskVolSerialID('E')， 函数代码如下：
FunctionGetDiskVolSerialID(cDriveName:char):DWord;
var
dwTemp1，dwTemp2：DWord；
begin
GetVolumeInformation(PChar(cDriveName＋':'),
Nil,
0,
NResult,
dwTemp2,
dwTemp2,
Nil,
0);
end;

巧用字符串资源

字符串资源需要先按格式编制一个文本文件，再用程序将其编译成资源文件，而不能直接编辑。首先用文本编辑器编一个文件zf.rc，其内容如下：
Stringtable
Begin
1,"开始"
2,"退出"
END
然后，找到Delphi的Bin子目录下的Brcc32.exe文件进行编译，命令格式为：brcc32 zf.rc，编译结束后即生成一个资源文件zf.res。要使用该资源文件，需要在单元文件implementation部分的开始处包括资源文件：{$R zf.res}。
方法一：
此处，上面的字符串用于给一个命令按钮更换Caption设置， 使用的函数是Windows API函数LoadString。
//在FormCreat过程中：
var
txtCaption:array [0..255] of char;
begin
if LoadString(HInstance,1,txtCaption,SizeOf(txtCaption))〉0 then btnStart.Caption:=StrPas(txtCaption);
end;
//在btnStartClick过程中：
var
txtCaption:array [0..255] of char;
begin
if LoadString(HInstance,2,txtCaption,
SizeOf(txtCaption))〉0 then
btnStart.Caption:=StrPas(txtCaption);
end;
这样就可以在程序运行时改变各种属性，而不需要在程序中出现字符串。
方法二：
使用Delphi函数LoadStr，会显得更加简单：
var
txtCaption:String;
begin
txtCaption:=LoadStr(2);
if txtCaption<>' ' then
btnStart.Caption:=txtCaption;
end;
可以从以上的过程中看出，使用123来标识一个字符串有些简陋，也很容易出错，那么怎么办呢?我们可以采取像C＋＋中使用字符串的方法，为每个字符串预定义一个ID，如：
const
IDC-START=1;
IDC-EXIT=2;
当然要把它放在一个unit里(类似于C＋＋的.h文件)，在使用的单元里再uses一下就可以了。
(曹　建)