Delphi5数据控制组件——查询

效果图

在这里插入图片描述

参考

本文是在上一篇的基础上,将查询页面重新写一次。

在这里插入图片描述

查询

{点击查询}
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)。

完整代码

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值