历史上最全的Delphi技巧1

字体大小: 中小 标准 ->行高大小: 标准
------------------------------------------------ 
删除dbgrid中选定数据的方法: 
begin 
adotable1.Delete; 
adotable1.first; 
若要追加和修改信息:adotable1.Append;adotable1.post; 
------------------------------------------------ 
将数据写入库: 
procedure Tclassmanageform.SaveToTable; 
begin 
ClassmanageForm.adotable1.edit; 
ClassmanageForm.adotable1.FieldByName('班级名').asstring:=edit1.text; 
ClassmanageForm.adotable1.FieldByName('入学时间').asdatetime:=StrToDate(edit9.text); 
ClassmanageForm.adotable1.FieldByName('所在院系').AsString:=edit3.text; 
ClassmanageForm.adotable1.FieldByName('班长').asstring:=edit4.text; 
ClassmanageForm.adotable1.fieldbyname('班长联系电话').asstring:=edit5.text; 
//ClassmanageForm.adotable1.FieldByName('班主任').asstring:=edit6.text; 
//ClassmanageForm.adotable1.FieldByName('班主任联系电话').asstring:=edit7.text; 
ClassmanageForm.adotable1.FieldByName('操作员').asstring:=mainform.username; 
ClassmanageForm.adotable1.FieldByName('最后修改时间').asdatetime:=date(); 
ClassmanageForm.adotable1.FieldByName('所学专业').asstring:=edit2.text; 
ClassmanageForm.adotable1.FieldByName('班级人数').asinteger:=StrToInt(edit8.text); 
ClassmanageForm.adotable1.Post; 
end; 
------------------------------------------------ 
显示一个提示对话框: 
application.MessageBox('提示','您确定要删除该班级吗?',mb_iconinformation+mb_yesno); 
如要点‘是’的话,可以写为: 
if (application.MessageBox('提示','您确定要删除该班级吗?',mb_iconinformation+mb_yesno)) 
=IdYes then 
…… 
mb_iconinformation:提示图标 mb_iconwarning:警告图标 
------------------------------------------------ 
判断一个内容框中的值是否为空,为空时‘确定’按纽不可用: 
if (length(edit1.Text)>1) and (length(edit2.Text)>1) and (length(edit3.Text)>1) and 
(length(edit4.Text)>1) and (length(edit5.Text)>1) and (length(edit8.Text)>1) then 
bitbtn1.Enabled:=true 
else 
bitbtn1.Enabled:=false; 
------------------------------------------------ 
进入一开始就读出数据库的信息并显示到EDIT中(写一个函数): 
procedure Tclassmanageform.LoadFromTable; 
begin 
ClassmanageForm.edit1.text:=adotable1.FieldByName('班级名').asstring; 
ClassmanageForm.edit9.text:=DatetoStr(adotable1.FieldByName('入学时间').asdatetime); 
ClassmanageForm.edit3.text:=adotable1.FieldByName('所在院系').AsString; 
ClassmanageForm.edit4.text:=adotable1.FieldByName('班长').asstring; 
ClassmanageForm.edit5.Text:=adotable1.fieldbyname('班长联系电话').asstring; 
//ClassmanageForm.edit6.text:=adotable1.FieldByName('班主任').asstring; 
//ClassmanageForm.edit7.Text:=adotable1.FieldByName('班主任联系电话').asstring; 
ClassmanageForm.edit2.text:=adotable1.FieldByName('所学专业').asstring; 
ClassmanageForm.edit8.text:=IntToStr(adotable1.FieldByName('班级人数').asinteger); 
end; 
------------------------------------------------ 
如何实现数据库的备份与恢复: 
备份: 
procedure TBackupFrm.BitBtn2Click(Sender: TObject); 
begin 
if Edit1.Text= ' then 
begin 
Showmessage('无选择要保存的文件名'); 
exit; 
end; 
try 
try 
dmData.adoQryTmp.Active:= false; 
dmData.adoQryTmp.SQL.Clear; 
dmData.adoQryTmp.SQL.Add('BACKUP DATABASE [dzyl] TO DISK = ''+edit1.text+'' WITH INIT'); 
dmData.adoQryTmp.ExecSQL; 
finally 
begin 
dmData.adoQryTmp.Active:= false; 
Showmessage('数据库备份成功!'); 
end; 
end; 
except 
on e:exception do 
begin 
ShowMessage('数据库备份失败!'); 
end; 
end; 
end; 
--------------------------- 
恢复 
procedure TBackupFrm.BitBtn4Click(Sender: TObject); 
begin 
if Edit2.Text = ' then 
begin 
showmessage('未选择要恢复的数据库文件!'); 
exit; 
end; 
with dmData do 
begin 
try 
adocmmd.CommandText:='use master'; 
adocmmd.Execute; 
adocmmd.CommandText:='alter database dzyl set offline with rollback immediate'; 
adocmmd.Execute; 
adocmmd.CommandText:='restore database dzyl from disk= ''+edit2.Text+'' with 
recovery '; 
adocmmd.Execute; 
adocmmd.CommandText:=' alter database dzyl set online with rollback immediate'; 
adocmmd.Execute; 
showmessage('数据库恢复成功!'); 
application.Terminate; 
except 
on e:exception do 
begin 
showmessage('数据库恢复失败!'+e.Message); 
end; 
end; 
end; 
其中dmData.adoQryTmp连接的是系统MASTER数据库,备份还原之前应该关闭要备份还原的AdoConn数据库 
连接AdoConn.Connected:=False; 
------------------------------------------------ 
另一方法: 
备份如下: 
try 
backupString := 'BACKUP DATABASE [Paper] TODISK = N''+edit1.Text+'' WITH 
INIT ,NOUNLOAD ,NAME = N'Paper 备份',NOSKIP ,STATS = 10,NOFORMAT'; 
adoquery1.Close; 
adoquery1.SQL.Clear; 
adoquery1.SQL.Add(backupString); 
ADOQuery1.Prepared; 
adoquery1.ExecSQL; 
application.MessageBox('备份成功。','提示',0); 
except 
application.MessageBox('备份出错!请重新备份数据。','出错',0); 
end; 
--------------------------- 
还原如下: 
if opendialog1.Execute then 
begin 
try 
adoquery1.Close(); 
adoquery1.SQL.Clear; 
adoquery1.SQL.Add('use master'); 
adoquery1.Prepared; 
adoquery1.ExecSQL; 
restorestring := 'RESTORE DATABASE [Paper] FROMDISK = 
N''+opendialog1.FileName+'' WITHFILE = 1,NOUNLOAD ,STATS = 10,REPLACE,RECOVERY'; 
self.ADOCommand1.CommandText := restoreString; 
adocommand1.Execute; 
application.MessageBox('还原数据成功','提示',0); 
adoquery1.Close(); 
adoquery1.SQL.Clear; 
adoquery1.SQL.Add('use paper'); 
adoquery1.Prepared; 
adoquery1.ExecSQL; 
except 
application.MessageBox('还原数据出错!请重新还原,并停止一切的数据操作! 
','提示',0); 
end; 
end; 
------------------------------------------------ 
判断一个输入框中字符的合法性: 
在keypress事件中写入: 
if not(key in ['0'..'9',#8,#13]) then 
begin 
key:=#0; 
showmessage('请您正确填写电话号码!'); 
end; 
------------------------------------------------ 
使用combobox时,让拉动菜单不可修改: 
将style属性设为csdropdownlist。 
------------------------------------------------ 
如何使得在使用pagecontrol组件时,按快捷键就会跳到相应Tabsheet中去? 
首先,把form窗体的keypreview设为true,然后在form的onkeydown事件中写: 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; 
Shift: TShiftState); 
begin 
case key of 
VK_F1agecontrol1.Pages[0].Show; 
VK_F2agecontrol1.Pages[1].show; 
VK_F3agecontrol1.Pages[2].Show; 
end; 
end; 
------------------------------------------------ 
给应用程序设置全局快捷键,本程序设置了 2 个快捷键,无论现在的焦点在哪个控件上,按 Ctrl+R 和 
Ctrl+Q 都会调用对应的过程。 

unit Unit1; 
interface 
uses 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; 
type 
TForm1 = class(TForm) 
procedure FormCreate(Sender: TObject); 
procedure FormDestroy(Sender: TObject); 
protected 
procedure hotykey(var msg: TMessage); message WM_HOTKEY; 
end; 
var 
Form1: TForm1; 
id, id2: Integer; 
implementation 
{$R *.DFM} 

procedure TForm1.hotykey(var msg: TMessage); 
begin 
if (msg.LParamLo=MOD_CONTROL) and (msg.LParamHi=81) then 
begin 
ShowMessage(’Ctrl + Q ’); 
end; 
if (msg.LParamLo=MOD_CONTROL) and (msg.LParamHi=82) then 
begin 
ShowMessage(’Ctrl + R ’); 
end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
id :=GlobalAddAtom(’hotkey’); 
RegisterHotKey(handle, id, mod_control, 81); 
id2 :=GlobalAddAtom(’hotkey2’); 
RegisterHotKey(handle, id2, mod_control, 82); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
UnRegisterHotKey(handle,id); 
UnRegisterHotKey(handle,id2); 
end; 
------------------------------------------------ 
怎样实现在使用treeview时,当点击一个分支时,从数据库中读出相应数据: 
if xsda_form.TreeView1.Items[1].Selected then 
begin 
xsda_form.Caption:='学生档案'; 
xsda_form.Caption:=xsda_form.Caption+'('+xsda_form.TreeView1.Items[0].Text+' 
'+xsda_form.TreeView1.Items[xi_shuxue].Text+xsda_form.TreeView1.Items[ji_02].Text+'级)'; 
xsda_form.Query1.SQL.Clear; 
xsda_form.Query1.SQL.Add('select *'); 
xsda_form.Query1.SQL.Add('from shuxuexi_xsda.db'); 
xsda_form.Query1.SQL.Add('where Rxsj=''+xsda_form.TreeView1.Items[ji_02].Text+''); 
xsda_form.Query1.Active; 
xsda_form.Query1.Open; 
end; 
------------------------------------------------ 
如何在面板上判断所指对象为某控件时,都会统一做出响应: 
procedure TMainForm.Button1Click(Sender: TObject); 
begin 
if Sender = Button1 then //此处也可以看是否为edit1啊,其他一些控件 
AboutBox.Caption := 'About ' + Application.Title 
else 
AboutBox.Caption := '; 
AboutBox.ShowModal; 
end; 
------------------------------------------------ 
如何把鼠标的移动区域限制在(100,100,200,200) 
var rect:TRect; 
begin 
rect.Left:=100; 
rect.Top:=100; 
rect.Bottom:=200; 
rect.Right:=200; 
windows.ClipCursor(@rect); 
下面恢复鼠标的移动区域 
windows.ClipCursor(0); 
------------------------------------------------ 
1、怎么样在delphi中调动其它*.exe文件? 
例如:winexec('d:\郑洽\Project1.exe',sw_show); 
============================================================================== 
2、如何让工程运行时主窗体就是最大化的? 
答:设置主窗体的WindowsState属性为wsMaximized就可以了! 
wsNormal 窗体以普通状态显示 
wsMinimized 窗体以最小化状态显示。 
wsMaximized 窗体以最大化状态显示。 
============================================================================== 
3、我想先->闪现窗体->主窗体->登录窗体,工程源文件怎么设置? 
答: 
⒈开始一个新工程。给表格起名为MainForm,MainForm的单元起名为Main, 工程文 件起名为Test。 
⒉在MainForm中插入一个Button部件,将其Caption属性设为“关闭”,为该部件 的onClick事件创建一 
个过程,并在过程的begin和end之间插入Close语句。 
⒊在应用程序添加一个表格,将这个表格起名为MoveForm,MoveForm 的单元起名 为Move。 
⒋为便于演示,在MoveForm中插入一个Label部件,设置其Caption 属性为“欢迎 进入本系统”。 
5.下一步修改工程的源代码。选择View/Project Source,修改begin和end之间的 语句如下: 
程序清单Test.Dpr 
program Test 
uses 
forms, 
Main in 'MAIN.PAS'{MainForm}, 
Move in 'Move.PAS'{MoveForm} 
{$R *.RES} 
begin 
MoveForm:=TMoveForm.Create(Application);{Create创建闪现窗口对象} 
MoveForm.Show; 
MoveForm.Update; 
Application.CreateForm(TMainForm,MainForm); 
MoveForm.Hide; 
MoveForm.Free;{Free从内存中释放对象} 
Application.Run; 
end. 
  第一条语句创建了对象,该对象存在内存中,但还不能看见, 为了让它出现并更 新它的内容,调用 
对象的Show和Update成员函数:Show和Update。 当闪现窗口使 用完后,用Hide函数将它隐藏起来,然后 
用Free函数释放它所占据的内存。 
6.如果此刻你编译和运行程序,MoveForm窗口一闪而过, 你可能未来得及看 清。为使MoveForm窗口显示 
几秒种,我们可为MainForm的OnCreate 事件创建一个 处理程序,延迟MoveForm窗口的显现时间。 
program TMainForm.FormCreate(sender:Tobject); 
var 
currentTime:LongInt; 
begin 
currentTime:=GetTickCount div 1000; 
while ((GetTickCount div 1000)<(currentTime+3) do 
{不做任何事); 
end; 
end. 
  GetTickCount函数返回窗口启动后过去的毫秒数,这个值除以1000 转化为秒数。 此时你编译运行程 
序,就能得到一个延迟3秒多的闪现窗口。 
为闪现窗口添加上Image部件,再对字体及窗口进行修饰,我们就能为应用程 序,创建一个精美的封面或 
在程序启动时显示重要提示。 
制作登录窗体一个很方便的方法就是主窗体作为主窗体,登录成功Hide掉就行了。 
如果登录窗体不可以作为主窗体,那么和闪现窗体一样的方法创建登录窗体,加在Application.Run;之前 
,MoveForm.Free;之后, 
用showmodal显示登录窗体 
============================================================================== 
4、button上面的文字怎么样换行? 
答: 
button控件不行 
bitbtn控件可以。 
bitbtn1.caption:='aaaa'#13'bbbbb' 
============================================================================== 
5、怎么样判别焦点是否在某个控件上? 
答: 
if Tobject.focused then 
//焦点在某某控件上 
else 
============================================================================== 
6、怎么样在程序中使一个节点的子节点展开及收闭? 
答: 
treeview1.selected.Expanded; //判断节点的子节点是否展开True展开,否则闭拢 
treeview1.selected.Expand(True);//子节点展开 
treeview1.selected.collapse(True)://子节点闭拢 
树节点全部展开: 
procedure TForm1.Button1Click(Sender: TObject); 
var node:TTreeNode; 
begin 
if treeview1.Items[0]<>nil then 
begin 
node:=treeview1.Items[0]; 
node.Expand(true); 
while node.getNextSibling<>nil do 
begin 
node:=node.getNextSibling; 
node.Expand(true); 
end; 
end; 
end; 

树节点全部收缩: 
procedure TForm1.Button2Click(Sender: TObject); 
var node:TTreeNode; 
begin 
if treeview1.Items[0]<>nil then 
begin 
node:=treeview1.Items[0]; 
node.Collapse(true); 
while node.getNextSibling<>nil do 
begin 
node:=node.getNextSibling; 
node.Collapse(true); 
end; 
end; 
end; 
============================================================================== 
7、如何用delphi编程实现给access数据库加密码? 
答:1,新建Project。 
  2,在FORM中放入ADOConnection控件。 
  3,双击ADOConnection控件,然后点击Build...按钮,在“提供者”页中选择“Microsoft Jet 4.0 
OLE DB   Provider”,然后点击“下一步”按钮,在“连接”页中选择要连接的Access数据库的路径 
和数据库的文件名,这时如果点“测试连接”按钮时,出现“初始化提供者时发生错误,测试连接失败, 
密码无效”的错误提示。 
  4,这时点“所有”页,然后双击“Jet OLEDBatabase Password”,出现对话框,添入密码后,选 
择“连接”页中的“测试连接”按钮,出现“测试连接成功”的对话框。把ADOConnection控件的 
LoginPromtp设为false. 
  5,设置连接完成。 
============================================================================== 
8、如何判断Treeview中我选中的节点是否有子节点?如果没有给出提示啊? 
答: 
if Treeview.Selected.HasChildren then 
//有 
else 
//无 
var 
Node :TTreeNode; 
begin 
Node :=TreeView1.Selected; 
if Node.HasChildren then 
.... 
对复杂的程序最好用Node过渡 
============================================================================== 
9、能否解释一下try...except...end及try...finally...end;? 
1.(1)是用于扑捉异常,(2)是用于保证代码执行的完整性 
2.(1)中finally处的代码不管什么情况都会被执行,(2)中except处的代码仅在发生异常时才会执行 
3.try finally之间的代码虽可保证finally 和 end之间的程序能执行,但不能保证程序不崩溃, 
而try except就不会使程序崩溃 
============================================================================== 
10、怎么样在主程序控制器中加入音乐? 
在implementation下加入 mmsystem單元(windows多媒體函數動態聯結庫)。然後在的onShow,onCreate 
事件中編寫代碼:sndplaysound('sound.wav',snd_async) 
============================================================================== 
11、我在form1上有四个edit,输完后我想用下上箭头键进行上移下移?怎么办? 
答: 
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; 
Shift: TShiftState); 
begin 
if key=vk_down then perform(WM_NEXTDLGCTL,0,0) else 
if key=vk_up then perform(WM_NEXTDLGCTL,1,0); 
end; 
============================================================================== 
12、如何用delphi5实现读文本文件指定的一行,并得到文本文件的总行数?谢谢! 
答: 
Delphi读文件文件一般使用Readln过程,如要读第3行可以这样: 
var 
i : Integer; 
F: TextFile; 
S: string; 
begin 
if OpenDialog1.Execute then { Display Open dialog box } 
begin 
AssignFile(F, OpenDialog1.FileName); { File selected in dialog } 
Reset(F); 
For i = 1 To 3 Do 
Readln(F, S); 
Edit1.Text := S; { Put string in a TEdit control } 
CloseFile(F); 
. 
end; 
要统计总行数,只能从头逐行读,直到文件尾(Eof函数为True),每读一行计数器加1。 
不过由于文本文件的每行长度不相等,它不能象数据库文件那样想读那行就读哪行,只能顺序读。 
上面的方法容易理解,也容易实现。如果希望提高速度,编程上要麻烦一些,可以以二进制方式打开文件 
,将所有内容读入一个内存变量,然后使用Pos函数查找其中的回车(#13)个数,这样可以快速地统计总 
行数并能快速地找到指定行。 
============================================================================== 
13、制作主窗口显示前的版权窗口 
答: 
在工程文件中选File->New Form新建一个窗口,设计好窗口的外观。给窗口起名为AboutBox,选Project- 
>Options,将新建的窗口从自动建立中去掉。 选View->Project Source,打开工程文件的源文件,在下 
面加入红色的句子。 
Uses AboutBox 
Var 
lTime :TDateTime; 
Begin 
Application.Initialize(); 
AboutBox=TAboutBox.Create(AboutBox); 
AboutBox.Show; 
AboutBox.Update; 
lTime=GetTickCount; 
Application.CreateForm(TMainForm,MainForm); 
while((GetTickCount-lTime) / 1000 <3) do; 
AboutBox.Hide; 
AboutBox.Free; 
Application.Run; 
end; 
============================================================================== 
14、Delphi中RichEdit的奥妙 
  一、如何得知当前行号    
  用RichEdit(或者memo)控件制作文本编辑器时,通过访问lines?count属性可以得到总行数,但是 
若想知道光标当前所在行的行号就麻烦了,因为delphi没有提供这个属性。要实现这个编辑器必备功能, 
就须调用em_ LineFromChar。 
  请试试下面的程序。 
  先在窗口中布置一个RichEdit或者memo(命名为editor),以及一个button。在button的onclick事 
件中写入下列代码。 
   var 
   CurrentLine:Integer; 
   begin 
     CurrentLine:=Editor.Perform(em_ LineFromChar,SFFFF,0);    
     Application.MessageBox(PChar(′当前行号是′+IntToStr(CurrentLine)),′消息′,mb_ 
iconinformation);    
   end; 
  需要注意的是,第一行的行号为零。 
  二、如何撤消操作(undo) 
  对于memo来说,实现undo是不需编程的,只要让popupmenu属性为空,运行时就能用鼠标右键激活一 
个常用操作菜单,其中包括撤消、剪切、复制、粘贴、删除和全选六项。   但可惜的是,这一招对于 
功能强大的RichEdit控件居然行不通,害得我们还要自己设计一个popupmemu。当你用CutToClipBoard等 
语句轻松而顺利地完成了“剪切”等功能,接着便会无奈地发现,竟找不到undo或cancel之类的语句来执 
行“撤消”。   这时你需要这样处理: 
    RichEdit1?Perform(EM_UNDO,0,0); 
  另外还应检查是否允许撤消,从而开启或关闭弹出菜单中的“撤消”项: 
    Undo1?Enabled:=RichEdit? 
    Perform(EM_CANUNDO,0,0)<>0;    
以上程序在Delphi3中调试通过。   

============================================================================== 
15、在主窗口中打开另一个独立的窗口,而这个被打开的窗口固定显示在..? 
答: 
procedure TForm2.FormCreate(Sender: TObject); 
begin 
form2.Hide; 
self.Parent:=form1.Panel1; 
end;

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/70030.html