新手的簡單問題(20分)

  • 主题发起人 主题发起人 jsxs
  • 开始时间 开始时间
J

jsxs

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一本書上看到一句這樣的話---"重載TDBGrid的Wndproc函數"

我想聞各位:  什麼是重載?怎麼重載TDBGrid的Wndproc函數呢?
 
重载函数就是用子类的函数去替代父类的函数
 
樓主要的應該是這個吧,override
不是這個,overload
 
TO:lichdr
對,是這個!是什麼意思呢?怎麼做呢?怎麼重載呢?
procedure WndProc(var Msg: TMessage);override;
 
也就是为子对象写一个这样的函数,
只是函数后要加上override而已:
eg:
TParent=class(TObject)
procedure WndProc(var Msg:TMessage);virtual;
end;
TChild=class(TParent)
procedure WndProc(var Msg:TMessage);override
end;
 
實際上就是截獲系統的消息處理。

為了實現些特殊的功能,你在這個方法中對特定的消息自己作處理,

 
Overriding a method means extending or refining it, rather than replacing it. A descendant class can override any of its inherited virtual methods.

父类中的动态方法和虚方法可以被子类的同名方法重载,加上OverRide表示重载,如果不加则子类的同名方法覆盖父类方法。
重载之后,你可以在这个方法中写上子类特有的处理,可以用inherited来继承父类的方法,这样在调用子类时Delphi可以使用子类的重载的方法。

 
TO: SuperSoft
我按書上說,創建了一屬於TDBGrid的組件。然後他叫我再重載TDBGrid的Wndproc函數
怎麼重載TDBGrid的Wndproc函數呢?我把procedure WndProc(var Msg:TMessage);override;加了進去不行呀!
 
让我们新建一个应用,就叫MyDBGrid吧,选择菜单File-New Application,然后再选择菜单File-New-Component

因为我们的新组件是从DBGrid继承的,所以,Ancestor Type选择 TDBGrid,Class Name就填我们的组件名称TmyDbGrid,生成的组件放在Samples页,点击OK,则组件的框架就生成了。

  现在我们开始做最关键的部分。当鼠标轮上下滚动时,发出了WM_MOUSEWHEEL消息,MOUSEWHEEL消息有几个参数,
 Delphi已经定义了两个和鼠标轮相关的事件,叫TmouseWheelEvent, TmouseWheelUpDownEvent,分别代表鼠标轮事件和鼠标轮上,下滚动事件。因此,我们先在TmyDbGrid中定义三个私有的事件变量:

fMouseWheel:TMouseWheelEvent;

fMouseWheelUp:TMouseWheelUpDownEvent
//鼠标轮上滚事件

fMouseWheelDown: TMouseWheelUpDownEvent
//鼠标轮下滚事件

  然后定义publised中定义事件属性:

property OnMouseWheel:TMouseWheelEvent read fMouseWheel write fMouseWheel;

property OnMouseWheelUp:TMouseWheelUpDownEvent read fMouseWheelUp write fMouseWheelUp;

property OnMouseWheelDown:TMouseWheelUpDownEvent read fMouseWheelDown write fMouseWheelDown


  然后重载TDBGrid的WndProc函数,

procedure WndProc(var Msg: TMessage);override


  我们在WndProc中捕获鼠标轮的消息,如下:

var

MousePoint:TPoint;

Handled:Boolean;

shift:TShiftState;

begin

if(Msg.Msg=WM_MOUSEWHEEL) then //捕获鼠标轮事件

begin

MousePoint.X:=LOWORD(Msg.lParam);

MousePoint.Y:=HIWORD(Msg.lParam);

Handled:=false;

if(Msg.wParam>0) then //上滚

fMouseWheelUp(self,shift,MousePoint,Handled)

else //下滚

fMouseWheelDown(self,shift,MousePoint,Handled);

fMouseWheel(self,shift,HIWORD(Msg.wParam),MousePoint,Handled);

if Handled then exit;

end;

inherited;

end


  这样,我们就基本可以处理鼠标轮事件了,编译我们的组件,然后选择菜单Components-Inatll Component,将我们的组件安装在Samples页下。

  让我们来试验一下我们做的组件,新建一个应用,然后选择Samples下的MyDBGrid组件,其它的用法,和DBGRrid完全一样,但你可以看见,在你的MyDbGrid的事件中,已经有OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown的选项了。


各位怎麼做呢?
 
給你看一個HUBDOG的寶典上的例子。
那個TURLLabel 重載了WndProc截獲了鼠標的消息,實現那種在網頁上的指到鏈接時出現藍色+下劃線的效果。

unit Unit1


interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls


type

TURLLabel = class(TLabel)
procedure WndProc(var Message : TMessage)
override

end


type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject)

private
{ Private declarations }
public
{ Public declarations }
end


var
Form1: TForm1


implementation

{$R *.DFM}

{ TURLLabel }

procedure TURLLabel.WndProc(var Message: TMessage)

begin
if (Message.Msg = CM_MOUSELEAVE) then
begin
Font.Color := clWindowText

Font.Style := Font.Style - [fsUnderline]

end

if (Message.Msg = CM_MOUSEENTER) then
begin
Font.Color := clBlue

Font.Style := Font.Style + [fsUnderline]

end

inherited WndProc(Message)

end


procedure TForm1.FormCreate(Sender: TObject)

begin
with TURLLabel.Create(Self) do
begin
Parent := Self

Left := 10

Top := 10

caption := 'www.delphi3000.com'

Cursor := crHandPoint

end

end


end.

 
TO:lichdr
  下面的怎麼編譯不過呢?
unit MYDBGrid1;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, Grids, DBGrids;

type
TMYDBGrid1 = class(TDBGrid)
procedure WndProc(var Msg: TMessage);override;
private
{ Private declarations }
fMouseWheel:TMouseWheelEvent;

fMouseWheelUp:TMouseWheelUpDownEvent;

fMouseWheelDown: TMouseWheelUpDownEvent;
protected
{ Protected declarations }
public
{ Public declarations }
published
property OnMouseWheel:TMouseWheelEvent read fMouseWheel write fMouseWheel;

property OnMouseWheelUp:TMouseWheelUpDownEvent read fMouseWheelUp write fMouseWheelUp;

property OnMouseWheelDown:TMouseWheelUpDownEvent read fMouseWheelDown write fMouseWheelDown



{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TMYDBGrid1]);
end;

procedure WndProc(var Msg: TMessage);
var
MousePoint:TPoint;

Handled:Boolean;

shift:TShiftState;

begin

if(Msg.Msg=WM_MOUSEWHEEL) then

begin

MousePoint.X:=LOWORD(Msg.lParam);

MousePoint.Y:=HIWORD(Msg.lParam);

Handled:=false;

if(Msg.wParam>0) then

fMouseWheelUp(self,shift,MousePoint,Handled)

else

fMouseWheelDown(self,shift,MousePoint,Handled);

fMouseWheel(self,shift,HIWORD(Msg.wParam),MousePoint,Handled);

if Handled then exit;

end;

inherited;

end


end.
 
你沒有定義方法找指針類型。
它不認識TMouseWheelEvent,TMouseWheelUpDownEvent 這兩個東西。
在type下加
TMouseWheelEvent = procedure() of object;
TMouseWheelUpDownEvent = procedure() of object;
這種樣子的代碼,()裡要填入相應的參數。
 
TO:lichdr
  不對,我把下面的重載函數去掉就可以的!
procedure WndProc(var Msg: TMessage);override;

去看看,怎麼做?
http://www.yesky.com/SoftChannel/72342371928440832/20030619/1709082.shtml
 
沒有相應的事件方法。

聲明部分加上
procudre fMouseWheel();

實現部分
procudure TYMDBGRID1.fMouseWheel();
begin
。。。。。
if assigned(fmousewheel) then
begin
fmousewheel();
...
end;
。。。。。
end;

大概是這個意思,()內換上自己的參數,看看一些如何做構件的書吧,那上面都有說如何定義自己的事件。



 
后退
顶部