效果图
参考
本文是在上一篇的基础上,将查询页面重新写一次。
查询
{点击查询}
procedure TForm2.Button1Click(Sender: TObject);
var
tj,tj1,tj2,tj3,tj4,tj5,tj6,tj7:string;
begin
//按照工号查找
tj1:='1=1 ';
//select * from RenYuanDangAn where GH like '%95%';
//''表示'
if CheckBox1.Checked then
tj1:='GH like '''+'%'+Edit1.Text+'%'+'''';
//按照姓名查找
//select * from RenYuanDangAn where Xm like '%J%';
tj2:='1=1';
if CheckBox2.Checked then
tj2:='Xm like '''+'%'+edit2.Text+'%'+'''';
//按照性别查找
//select * from RenYuanDangAn where Xb like '女';
tj3:='1=1';
if CheckBox3.Checked then
begin
if RadioGroup1.ItemIndex=0 then
tj3:='Xb like '''+'%女%'+''''
else
tj3:='Xb like '''+'%男%'+'''';
end;
//按照生日查找
//select * from RenYuanDangAn where Csrq <='2024-1-1' and Csrq >= '1990-1-1';
tj4:='1=1';
if CheckBox4.Checked then
tj4:='Csrq >='''+datetostr(DateTimePicker1.Date)+ ''' and Csrq <='''+datetostr(DateTimePicker2.Date)+'''';
//按照婚否
tj5:='1=1';
if CheckBox5.Checked then
if CheckBox6.Checked then
tj5:=' Hf=1 '
else
tj5:=' Hf=0 ';
//按照职称
tj6:='1=1';
if CheckBox7.Checked then
tj6:=' Zc like '''+combobox1.Text+'''';
//按照工资
tj7:='1=1';
if CheckBox8.Checked then
tj7:=' Gz >='+edit3.Text+' and Gz<='+edit4.Text;
tj:='select * from RenYuanDangAn where ' + tj1 + ' and ' + tj2 + ' and ' + tj3 +' and ' + tj4 +' and ' + tj5 + ' and ' + tj6 + ' and ' + tj7;
// showmessage(tj);
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(tj);
Query1.Open;
end;
Free方法
- 作用:
Free
方法用于释放对象所占用的内存资源。在Delphi中,当你创建一个对象(如窗体、控件等)时,系统会在内存中为该对象分配一定的空间。当你不再需要这个对象时,应该调用Free
方法来释放它所占用的内存,以避免内存泄漏。 - 特点:
Free
方法通常与Destroy
方法结合使用。Destroy
是一个虚方法,负责执行对象销毁前的清理工作(如释放子对象、关闭文件句柄等)。Free
方法会检查对象是否为nil
,如果不是,则调用Destroy
方法来销毁对象。- 需要注意的是,
Free
方法只会释放对象所占用的内存,并不会将对象的引用(指针)设置为nil
。因此,在调用Free
后,如果还持有该对象的引用,可能会导致野指针问题。为了避免这种情况,Delphi 5及以后的版本提供了FreeAndNil
方法,该方法会先调用Free
,然后将对象的引用设置为nil
。
Close方法
- 作用:
Close
方法主要用于关闭窗体或数据流(如文件、数据库连接等)。对于窗体而言,Close
方法的行为类似于隐藏窗体(Hide
),但它还会触发窗体的Close
事件和OnClose
事件处理程序。这些事件处理程序可以执行额外的清理工作,如保存数据、询问用户是否真的要关闭窗体等。 - 特点:
Close
方法并不直接释放窗体所占用的内存。如果你只是想关闭窗体并希望稍后能够重新打开它,那么应该使用Close
方法而不是Free
方法。- 在
OnClose
事件处理程序中,你可以通过设置Action
参数来控制窗体的关闭行为。例如,你可以将Action
设置为caFree
来在关闭窗体后释放其内存。但是,这通常是在非模态窗体的上下文中进行的,因为模态窗体会在ShowModal
方法返回时自动处理资源释放。
总结
为什么会有这个思考呢?是因为我在主窗体新建了模态查询窗口,关闭查询窗口时选择free
掉而不是close
,因此再次使用查询窗口时,会出现内存错误的问题。
Free
方法用于释放对象所占用的内存资源,应与Destroy
方法结合使用,并注意处理对象的引用以避免野指针问题。Close
方法用于关闭窗体或数据流,并触发相应的事件处理程序以执行额外的清理工作。它并不直接释放窗体所占用的内存,而是依赖于OnClose
事件处理程序中的逻辑来决定是否释放。
通俗理解
想象你有一个装满书的书架(书架就是对象,书就是对象所占用的资源),书架旁边有一个便签(便签就是对象的引用或指针)。当你不再需要书架上的书时,你可以决定清空书架(这相当于调用Free
方法释放对象所占用的内存),但是你没有撕掉或丢弃旁边的便签(这相当于没有将对象的引用设置为nil
)。
现在,如果你还保留着那个便签(即持有对象的引用),并尝试根据便签上的信息去找书架上的书(即尝试访问对象),你会发现问题:书架已经空了,但便签还在,它指向的是一个已经不存在的书架(即野指针)。这种情况下,你可能会感到困惑、失望,甚至可能走入错误的房间(即程序崩溃或不稳定)。
为了避免这种情况,当你清空书架时,你也应该同时撕掉或丢弃那个便签,这样你就不会根据一个无效的信息去寻找东西了。在Delphi中,这相当于在调用Free
方法后立即将对象的引用设置为nil
,这通常是通过FreeAndNil
方法完成的,它会自动为你完成这两个步骤。
所以,简单来说,Free
方法只负责清空书架(释放内存),但不会自动撕掉便签(不设置引用为nil
),这可能导致你根据错误的便签信息去寻找东西(野指针问题)。为了避免这个问题,你应该确保在清空书架后也撕掉便签(即将引用设置为nil
)。
完整代码
在这。