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

被折叠的 条评论
为什么被折叠?



