组合控件问题(高手请进)(50分)

  • 主题发起人 主题发起人 lheast
  • 开始时间 开始时间
L

lheast

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己定义一个类TMyStringGrid,他继承 TAdvStringGrid,在其上上面放一个TflatEdit子控件,我想继承FlatEdit事件的onchange事件。可是始终达不到目的。
我已试过继承FlatEdit的onkeydown,onclik,onReadonly等均可以,唯独继承不了onchange,请高手指点.
 
看看这个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1982458
 
楼上的兄弟:
我用两种不同方法继承onclick,onkeydown,但用同样的方法继承onchange就是不行,
你说的那种方法我早就用过没用.你们回答之前最好试试一下。
 
捕捉它的消息,在这里面试试
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
begin
end
 
我干脆把我的两种方法给大家看,

法一: FEdit : TFlatUnit

property OnEditChange : TNotifyEvent read GetEditChange write SetEditChange;

function TMyStringGrid.GetEditChange: TNotifyEvent;
begin
result := FEdit.OnChange;
end;

procedure TMyStringGrid.SetEditChange(Value: TNotifyEvent);
begin
FEdit.OnChange := value;
end;

重载loaded过程中:FEdit.change :=
法二:
property OnEditChange : TNotifyEvent read FOnEditchange write FOnEditchange;

procedure EditChange
begin
.......
if assigned(FOnEditchange) then FOnEditchange(self);
.......
end;

请大家看了后回去试试

重载loaded过程中:FEdit.change := Editchange;
 
hds6400:
试过你说的消息,也没用。
 
老大,你把我给的链接看清楚了再说话!

再说你的FEdit.change是个什么玩意啊???
正确的应该是FEdit.OnChange := ???
 
thx1180 :
已经看清楚了。
FEdit.OnChange := 自定义过程
 
thx1180 :
你没试过就不要发表了,我说了用同样的方法可以继承其它事件和方法,比如:
继承子控件的Onclik,onkeydown,就是继承不了onchange事件。回答之前先自己试试。
 
兄弟,你搞搞清楚,看我在什么时候贴过没有经过测试的代码。
 
thx1180:
那你就和我一样定义一个新类,然后继承TAdvstringGrid,上面放个子控件TlatEdit,
新控件继承子控件的onchange事件,这样的成功的话我就服了你。
 

我想了种折中的办法:
根据FEdit的onchange发生在keydown 和keyup之间,在这之间如果FEdit的的文本发生变化的
就触发新定义的onchang。虽然这种方法可以啊。
但是我是希望那位高手能够继承子控件FEdit的onchange方法
 
to 楼主:是 TflatEdit的原因造成的吗,那普通TEdit可以吗,还有TAdvstringGrid,偶没有这两个控件可测试你的问题埃
 
baseyueliang:
使用了普通TEdit也不行。
 
行的啊,大概是你其他地方的代码影响了吧
 
baseyueliang,
那把你的那写的贴出来看看。
 
unit Unit2;

interface

uses
Classes,StdCtrls, ExtCtrls;

type
TExPanel = class(TPanel)
private
fEdit : TEdit;
function GetEditChange : TNotifyEvent;
procedure SetEditChange(AEditChange : TNotifyEvent);
public
constructor Create(AOwner: TComponent);
published
property OnEditChange : TNotifyEvent read GetEditChange write SetEditChange;
end;
implementation

{ TExPanel }

constructor TExPanel.Create(AOwner: TComponent);
begin
inherited;
fEdit := TEdit.Create(self);
fEdit.Parent := self;
end;

function TExPanel.GetEditChange: TNotifyEvent;
begin
Result := fEdit.OnChange;
end;

procedure TExPanel.SetEditChange(AEditChange: TNotifyEvent);
begin
if Assigned(AEditChange) then
fEdit.OnChange := AEditChange;
end;

end.
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2;

type
TForm1 = class(TForm)
procedure Edit1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
ShowMessage('这不是行的吗!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with TExPanel.Create(self) do
begin
Parent := self;
OnEditChange := Edit1Change;
end;
end;

end.
 
baseyueliang:
你有没有写过组件啊?我的意思是从StringGrid类继承,在上面放一个子控件Edit,然后生成新控件,
新控件要继承子控件的onchange事件。象你的那段代码啊大富翁上一大把。唉。
 
是啊,偶很少写组件的,从StringGrid继承还真不行,呵呵。试试下面的吧,
在你原先的代码基础上再截取WM_Command消息:
procedure TMyStringGrid.WMCommand(var Message: TWMCommand);
var
Msg : TMessage;
begin
Msg := TMessage(Message);
if (Message.Ctl = fEdit.Handle) then
Message.Result := SendMessage(fEdit.Handle, Msg.Msg, Msg.WParam, Msg.LParam)
else inherited;
end;
 
后退
顶部