在控件里如何获取事件声明部份? 谁解决此问题再加200分。(50分)

  • 主题发起人 主题发起人 bbscom
  • 开始时间 开始时间
B

bbscom

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:在Edit的Events里OnKeyPress双击,这时Form里就会添加
procedure TForm1.Edit1KeyPress(Sender: TObject;
var Key: Char);
begin

end;
在Delphi里跟踪就发现是:TKeyPressEvent = procedure(Sender: TObject;
var Key: Char) of object;
现在需要解决的问题是,当程序运行时如何获取KeyPress(Sender: TObject;
var Key: Char);这一段代码?
 
使用as方法看看
(RegClass as TDBEdit).DataSource
 
运行时代码?
没明白你的意思
如果你想替换处理函数
直接当作指指针修改就行了
 
请Mike1234567890, 说明白一点好吗。
谁解决此问题再给你加200分。
 
看不明白你的说法?
运行时获取事件代码? 想获取什么代码? 
源代码? 没有
事件入口指针? 那不是代码
任何其他地方想引用,用 比如  TForm1.Edit1.KeyPress := Edit1KeyPress;
就可以了
 
bbscom侠!你的问题的详述是看不太懂!从标题获取事件的声明部分知道
savetime侠的这个函数GetMethodTypeInfo能完成你想要的功能!我的测试代码的结果
---------------------------------
Method Name: TKeyPressEvent
Method Kind: mkProcedure
Params Count: 2
Params List:
[] Sender: TObject
[ pfVar] Key: Char
能完成功能!!!!!
-----------------------------------------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,TypInfo;
type
TForm2 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Edit1KeyPress(Sender: TObject;
var Key: Char);
begin

end;
procedure GetMethodTypeInfo(ATypeInfo: PTypeInfo;
AStrings: TStrings);
type
PParamData = ^TParamData;
TParamData = record // 函数参数的数据结构
Flags: TParamFlags;
// 参数传递规则
ParamName: ShortString;
// 参数的名称
TypeName: ShortString;
// 参数的类型名称
end;
function GetParamFlagsName(AParamFlags: TParamFlags): string;
var
I: Integer;
begin
Result := '';
for I := Integer(pfVar) to Integer(pfOut)do
begin
if I = Integer(pfAddress) then
Continue;
if TParamFlag(I) in AParamFlags then
Result := Result + ' ' + GetEnumName(TypeInfo(TParamFlag), I);
end;
end;
var
MethodTypeData: PTypeData;
ParamData: PParamData;
TypeStr: PShortString;
I: Integer;
begin
MethodTypeData := GetTypeData(ATypeInfo);
AStrings.Add('---------------------------------');
AStrings.Add('Method Name: ' + ATypeInfo^.Name);
AStrings.Add('Method Kind: ' + GetEnumName(TypeInfo(TMethodKind),
Integer(MethodTypeData^.MethodKind)));
AStrings.Add('Params Count: '+ IntToStr(MethodTypeData^.ParamCount));
AStrings.Add('Params List:');
ParamData := PParamData(@MethodTypeData^.ParamList);
for I := 1 to MethodTypeData^.ParamCountdo
begin
TypeStr := Pointer(Integer(@ParamData^.ParamName) +
Length(ParamData^.ParamName) + 1);
AStrings.Add(Format(' [%s] %s: %s',[GetParamFlagsName(ParamData^.Flags),
ParamData^.ParamName, TypeStr^]));
ParamData := PParamData(Integer(ParamData) + SizeOf(TParamFlags) +
Length(ParamData^.ParamName) + Length(TypeStr^) + 2);
end;
if MethodTypeData^.MethodKind = mkFunction then
AStrings.Add('Result Value: ' + PShortString(ParamData)^);
end;

procedure TForm2.FormCreate(Sender: TObject);
var
M:TMethod;
pinfo:PPropInfo;
s:TStringList;
begin
s:=TStringList.Create;
GetMethodTypeInfo(TypeInfo(TKeyPressEvent),s);
s.SaveToFile('c:/a.txt');
end;

end.
 
如果是
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
在form2中,默认也是在published段,也是有rtti信息的!也可以得到参数信息的
 
newnewer,你好!
GetMethodTypeInfo(TypeInfo(TMouseEvent),s);//我用TMouseEvent这个事件类
输出列表是:
---------------------------------
Method Name: TMouseEvent
Method Kind: mkProcedure
Params Count: 5
Params List:
[] Sender: TObject
[] Button: TMouseButton
[] Shift: TShiftState
[] X: Integer
[] Y: Integer
怎么输出为:(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer)
 
GetMethodTypeInfo函数你看了吧,自己组织一下就是了吧?我只是贴了savetime的代码!
 
MyEdt:= TEdit.Create(self);
MyEdt.OnKeyPress := MyEdtKeyPress;
Procedure TFrm.MyEdtKeyPress(Sender: TObject;
var Key: Char);
begin
if not (key in['0'..'9',char(Vk_back),char(vk_delete)]) then
key:=#0;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部