delphi学习点滴(二)

本文介绍了Delphi编程中的关键知识点,包括PostMessage与SendMessage的区别及其应用,单例模式的实现,解决DBGrid鼠标滚轮响应问题的方法,ListView的属性和用法,以及调试中遇到的参数对象错误和ADOQuery中使用DELETE语句的问题。

1.PostMessage,SendMessage

        1>PostMessage函数是将一个消息放入到与指定窗口创建的线程相联系的消息队列里,不等待线程处理消息就返回。

函数原型为function PostMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;

其中参数:

        hWnd:其窗口程序接收消息的窗口的句柄;

        Msg:指定被寄送的消息

        wParam:指定附加的消息特定的信息

        IParam:指定附加的消息特定的信息。

返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。

       对于PostMessage的使用如下:

        ①定义一个消息

const
  WM_LOADCOM = WM_USER + $0001;

       ②定义发消息和收消息的过程

  procedure LoadComments;                                              //发消息过程
  procedure WM_LoadComment(var aMsg: TMessage); message WM_LOADCOM;    //收消息过程

         ③实现这两个过程

procedure TFormSpecificInformation.LoadComments;
begin
  PostMessage(Self.Handle, WM_LOADCOM, 0, 0);                          //发消息
end;
procedure TFormSpecificInformation.WM_LoadComment(var aMsg: TMessage); //收消息
begin
  //写些XXX代码
end;

        2>SendMessage函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消

息寄送到一个线程的消息队列后立即返回。

函数原型为function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;参数和Postmessage一样,

返回值:返回值指定消息处理的结果,依赖于所发送的消息。

        对于SendMessage的使用如下:比如控制鼠标滚轮

SendMessage(scrlbxComment.Handle, WM_VSCROLL, SB_BOTTOM, 0); //滚轮停留在最下面
SendMessage(scrlbxComment.Handle, WM_VSCROLL, SB_TOP, 0); //滚轮停留在最上面

2.单例模式

单例模式就是一个类只有一个实例,而且可以自行实例化并向整个系统提供这个实例,这样的类被称为“单例类”。单例模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问,可以用来划分命名空间以减少全局变量的泛滥。貌似在多线程中使用单例模式会出问题,待解。
例:

  function __PubToolSingleton: TPubTool;
implementation

var
  _PubTool: TPubTool;
function __PubToolSingleton: TPubTool;
begin
  if (not Assigned(_PubTool)) then
  begin
    _PubTool := TPubTool.Create;
  end;
  Result := _PubTool;
end;

3.DBgrid 响应鼠标滚轮

DBGrid中鼠标不能滚出所示范围并且光标不跟着移动,解决方法如下:

先定义一个私有变量和一个私有过程:

private
  FOldGridWnd: TWndMethod;
  procedure NewGridWnd(var Message: TMessage);

私有过程的具体实现:

procedure TFrameSearchResultShow.NewGridWnd(var Message: TMessage);
var
   bIsNeg: Boolean;
begin
   if Message.Msg = WM_MOUSEWHEEL then
   begin
      bIsNeg := Short(Message.WParamHi) > 0;
      if not dbgrd1.DataSource.DataSet.Active then Exit;
        if bIsNeg then
        begin
          dbgrd1.DataSource.DataSet.MoveBy(-1);
        end
        else
        begin
        dbgrd1.DataSource.DataSet.MoveBy(1);
        end;
     end
     else
     begin
     FOldGridWnd(Message);
     end;
end;

在Formshow或者FormCreate中做如下操作即可

  FOldGridWnd := dbgrd1.WindowProc;
  dbgrd1.WindowProc := NewGridWnd;

4.ListView的基本用法

     4.1Listview属性

      >>Items属性是真正保存TListview对象数据项的属性,Items属性是继承自TString对象。

      >>CheckBoxes属性用来决定在TListview对象中的每一个数据项前面是否出现一个CheckBox对象,供用户选取。

      >>ViewStyle属性用来决定TListview对象的显示方式,分别为大图标(vsIcon)、小图标(vsSmallIcon)、列表(vsList)、详细资料(vsReport)。

      >>Columns 字段属性,ColumnClick属性当设为True时,可以设置ColumnClick事件。

      >>Gridlines属性决定TListview对象是否显示网格线。

      >>IconOptions属性是复合属性,包括Arrangement(排列方式:iaTOP向上对齐,iaLeft向左对齐)、AutoArrange(自动排列)、WrapText(数据是否换行显示)

    4.2常用方法

        ①设置字段或者列

ListView1.Clear;
ListView1.Columns.Clear;
ListView1.Columns.Add;
ListView1.Columns.Add;
ListView1.Columns.Add;
ListView1.Columns.Items[0].Caption:='我';
ListView1.Columns.Items[1].Caption:='是';
ListView1.Columns.Items[2].Caption:='谁';

        ②增加数据

with listview1.items.add do 
begin 
caption:='你'; 
subitems.add('是'); 
subitems.add('谁'); 
end;

        ③删除一条

listview1.items.delete(0); 

        ④读取某行的某列的值

Edit1.Text := listview1.Items[i].Caption; //读第i行第1列 
Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列 
Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列

5."不正常地定义参数对象。提供了不一致或不完整的信息"

调试将Delphi中的SQL语句Copy到数据查询分析器中运行是可以的,但是在Delphi运行中报如下图所示的错误信息

解决方法为:将将TADOQuery.ParamCheck设置为False即可。

6.Adoquery  中  使用delete语句问题

代码如下:

with adoquery do
begin
     Delete(v_Str ,1,2);//在这里是会报错的 因为Adoquery中也有个Delete方法。
end;
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值