您的位置:首页 > 编程语言 > Delphi

delphi学习点滴(三)

2012-12-19 13:37 302 查看

1.virtual、dynamic、abstract关键字

          virtual 表示是虚拟方法; dynamic 表示是动态方法, 这两类方法的共同点是都可以被覆盖(override)。

        在代码中调用一个指定的虚拟方法时编译器并不知道它的地址,编译器通过建立虚拟方法表(VMT)来查找在运行时的函数地址。所有的虚拟方法在运行时通过VMT来调度,一个对象的VMT表中除了自己定义的虚拟方法外,还有它的祖先的所有的虚拟方法,因此虚拟方法比动态方法用的内存要多,但它执行得比较快。

        编译器为每一个动态方法指定一个独一无二的数字,用这个数字和动态方法的地址构造一个动态方法表(DMT)。不像VMT表,在DMT表中仅有它声明的动态方法,并且这个方法需要祖先的DMT表来访问它其余的动态方法。正因为这样,动态方法比虚拟方法用的内存要少,但执行起来较慢,因为有可能要到祖先对象的DMT中查找动态方法。

       abstract 表示是抽象方法;是没有实现的方法,并且必须是virtual或dynamic方法,即在abstract前面必须有virtual或dynamic关键字,其实现部分在派生类中。

2.注册热键Ctrl+Enter

定义一个全局变量f_HotKey,一个过程procedure hotykey(var msg:TMessage); message WM_HOTKEY;

过程定义为:

procedure TFormNewComment.Hotykey(var msg: TMessage);
begin
if (msg.LParamLo = MOD_CONTROL) and (msg.LParamHi = 13) then
begin
//写自己要执行的代码;
end;
end;

 

然后在窗体OnCreate里写代码:

procedure TFormNewComment.FormCreate(Sender: TObject);
begin
f_HotKey:=GlobalAddAtom('HotKey');
RegisterHotKey(handle,f_HotKey,mod_control,13);               //注册热键
end;

 最后在窗体OnDestroy里写如下代码:

procedure TFormNewComment.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle, f_HotKey);                           //解注热键
end;

3.点击DBgird标题排序

        在显示数据的DBgrid的TitleClick事件中编写如下的代码,即可实现点击标题排序

procedure TFrameSearchResultShow.dbgrdSearchResultTitleClick(
Column: TColumn);
var
v_index: Integer;
v_ColumnStr: string;
v_Column: TColumn;
begin
inherited;
for v_index := 0 to TDBGrid(Column.Grid).Columns.Count - 1 do
begin
v_Column := TDBGrid(Column.Grid).Columns[v_index];
v_ColumnStr := v_Column.Title.Caption;
if (pos('▲', v_ColumnStr) = 1) or (pos('▼', v_ColumnStr) = 1) then
begin
Delete(v_ColumnStr, 1, 2);
v_Column.Title.Caption := v_ColumnStr;
end;
end;

if Column.FieldName = '浏览次数' then                     //这里是按标题“浏览次数”排序
begin
if qrySearchKnowledge.Sort <> (Column.FieldName + ' ASC') then
begin
qrySearchKnowledge.Sort := Column.FieldName + ' ASC';//给ADOQuery的Sort属性赋值
Column.Title.Caption := '▲' + Column.Title.Caption; //标题加上三角形表示当前排序方式为升序;
end else
begin
qrySearchKnowledge.Sort := Column.FieldName + ' DESC';
Column.Title.Caption := '▼' + Column.Title.Caption; //标题加上倒三角形表示当前排序方式为降序;
end;
end;
end; 

4.改变DBGrid线条、背景颜色等

在DBgrid的OnDrawColumnCell中编写如下代码,DBGrid即可出现比较炫的颜色,颜色可以根据自己需要修改。

procedure TFrameSearchResultShow.dbgrdSearchResultDrawColumnCell(
Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
v_Index: integer;
begin
inherited;
if gdSelected in State then
begin
Exit;
end;
{隔行改变网格背景色}
if qrySearchKnowledge.RecNo mod 2 = 0 then
begin
(Sender as TDBGrid).Canvas.Brush.Color := clInfoBk            // 定义背景颜色
end else
begin
(Sender as TDBGrid).Canvas.Brush.Color := RGB(191, 255, 223); // 定义背景颜色
end;
{定义网格线的颜色}
dbgrdSearchResult.DefaultDrawColumnCell(Rect, DataCol, Column, State);
with (Sender as TDBGrid).Canvas do                              // 画 cell 的边框
begin
Pen.Color := $00FF0000;                                       // 定义画笔颜色 ( 蓝色 )
MoveTo(Rect.Left, Rect.Bottom);                               // 画笔定位
LineTo(Rect.Right, Rect.Bottom);                              // 画蓝色的横线
Pen.Color := $0000FF00;                                       // 定义画笔颜色 ( 绿色 )
MoveTo(Rect.Right, Rect.Top);                                 // 画笔定位
LineTo(Rect.Right, Rect.Bottom);                              // 画绿色的竖线
end;
end;


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DELPHI