谁能教教我怎么做控件? ( 积分: 100 )

  • 主题发起人 主题发起人 funxu
  • 开始时间 开始时间
F

funxu

Unregistered / Unconfirmed
GUEST, unregistred user!
1。最近看了delphi开发人员指南,似是而非的做了几个控件,不过有n多点不明白
假设我要做一个自定义label继承自tlabel,那么怎么深入vcl了解tlabel的内部变量,属性和方法光看stdctrl什么也看不到。
2。例如我想做个鼠标移动到上面就会改变颜色的label,感觉上是定义一个方法接受鼠标移动的消息重载onmouseleave事件取修改颜色,但是tlabel的procedure color还有mouseleave等等我却不知道怎么调用,谁能给个代详细说明的demo,就是怎么找到tlabel的相关事件然后重载给color赋值。
 
1。最近看了delphi开发人员指南,似是而非的做了几个控件,不过有n多点不明白
假设我要做一个自定义label继承自tlabel,那么怎么深入vcl了解tlabel的内部变量,属性和方法光看stdctrl什么也看不到。
2。例如我想做个鼠标移动到上面就会改变颜色的label,感觉上是定义一个方法接受鼠标移动的消息重载onmouseleave事件取修改颜色,但是tlabel的procedure color还有mouseleave等等我却不知道怎么调用,谁能给个代详细说明的demo,就是怎么找到tlabel的相关事件然后重载给color赋值。
 
下載delphi高手突破看看,很多地方有
 
说了=没说,唉~要是有时间看我也不会用100分来换知识了..
 
我花了10分钟写了个,看看!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, PanelEx, jpeg, StdCtrls;

type
Tmylabel = class(Tlabel)
private
{ Private declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);
procedure WndProc(var Message: TMessage); override;
end;


TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a: Tmylabel;

implementation

{$R *.dfm}

constructor Tmylabel.Create(AOwner: TComponent);
begin
inherited;
top := 100;
left := 100;
caption := 'adfas';
end;

procedure Tmylabel.WndProc(var Message: TMessage);
var
Form: TCustomForm;
begin
case Message.Msg of
CM_MOUSELEAVE:
begin
Self.Font.Color := clWindowText;
end;
CM_MOUSEENTER:
begin
Self.Font.Color := clRed;
end;
end;
inherited WndProc(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
a := Tmylabel.Create(Self);
a.Parent := Self;
a.Show;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
a.Free;
end;

end.
 
uses语句改为:

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
StdCtrls;
 
构造函数后面要加上override;
constructor Create(AOwner: TComponent); override;
 
hxb_leiyuan
你实际上是在重载消息处理哦。如果我要加10个LABEL你要怎么写呢
 
1.你应该看TCustomLabel的源码;
2.重载CMMouseEnter,CMMouseLeave这两个消息处理函数就可以实现了:

unit LabelEx;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics;

type
TLabelEx = class(TLabel)
private
{ Private declarations }
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;

procedure Register;

implementation

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

procedure TLabelEx.CMMouseEnter(var Message: TMessage);
begin
inherited;
Self.Font.Color := clBlue;
end;

procedure TLabelEx.CMMouseLeave(var Message: TMessage);
begin
inherited;
Self.Font.Color := clWindowText;
end;

end.
 
谢谢,我也在找。
 
严重感谢dreamisx,hxb_leiyuan几位大侠,代码是看懂了不过我想再问一下,当我想自定义控件时到哪里去找继承的vcl控件的源码delphi目录下vcl里么?TCustomLabel我在delphi里看到了可是只有简单的过程定义,至于内部变量函数等等没有啊,简单的说就是当打开.pas时可以看到控件的源码可是delphili里的控件源码哪里去找啊
 
你先了解一下VCL的层次关系吧。
控件的源码:
  比如说TLable,你按住Ctrl然点单元中的TLable就可以到TLable被申明的单元了。
 
to king.gray 那个我看过了一直跟到了tcustome....虽然可以看见声明,但是过程或者函数内容可是什么也看不到例如tlabel的procedure color
 
谁知道怎么在一个类的方法中调用另一个类的方法和属性啊?
 
多人接受答案了。
 
后退
顶部