我想建立一个基准窗口,把一些通用功能写在里面,其他窗口都继承这个窗口,现在我碰到个问题: ( 积分: 100 )

  • 主题发起人 主题发起人 唐佐平
  • 开始时间 开始时间

唐佐平

Unregistered / Unconfirmed
GUEST, unregistred user!
我想建立一个基准窗口,把一些通用功能写在里面,其他窗口都继承这个窗口,
比如说窗口的字体、回车切换控件焦点等,但现在我碰到个问题:
我想为窗口增加一个事件,继承后的窗口可以在这个事件中写程序代码,我不
知道怎样为窗口增加一个事件,请大家教教我,万分谢谢!
 
我想建立一个基准窗口,把一些通用功能写在里面,其他窗口都继承这个窗口,
比如说窗口的字体、回车切换控件焦点等,但现在我碰到个问题:
我想为窗口增加一个事件,继承后的窗口可以在这个事件中写程序代码,我不
知道怎样为窗口增加一个事件,请大家教教我,万分谢谢!
 
這樣吧.
你在標准窗口的public內定義一個過程或函數,寫相應的代碼。
然后在繼承窗口中的public也定義同樣的過程或函數,增加需要的代碼。
 
type
TmySaveClick = procedure (sender: TObject) of Object;
private
FmySaveClick: TmySaveClick;
public
property ONmySaveClick: TmySaveClick read FmySaveClick write FmySaveClick;
//这样你不就可以在继承的窗口定义一个相同的事件事件类型,并且实现他. 赋值给ONmySaveClick就能做到了
 
用 Frame 就可以简单搞定了。
 
用Frame建立一个通用框架,以后可以多次调用它.
方法是File-new-frame,应该是吧!
 
和为控件定义事件是一样的么。
定义事件类型,然后为窗体添加属性,在某个需要调用事件的过程中,写下亘古不变的
if assigned(EVENT) THEN
EVENT(........);
 
首先谢谢大家回复;
TO:kk2000
我想像窗口的Oncreate事件一样,在事件中双击写相应的代码即可,而不想再赋值,
每个窗口都要赋值太麻烦;
我也不想用Frame
我用普通控件增加事件的方法试了不行,达不到效果,我想要的效果是增加一个事件
在属性编辑器的事件页可以看到,并可以双击编写对应代码;
 
事实上这样是可以的,不过,跟普通控件的事件是不同的,
published
property ONmySaveClick: TmySaveClick read FmySaveClick write FmySaveClick;

上面是普通控件的事件;
但即使你在 TForm里面继承, 这个 ONmySaveClick 事件并不会出现在 object inspector中;
建议: 动态赋值代替;
如果让你的继承的Form可以在 object inspector 显示事件, 方法是有的,还是挺复杂,可能得不偿失。
 
TO: 唐佐平
那你只有写成一个控件了! 然后让别的技术员继承你这个
窗口就可以了.
 
可以用重载啦!
 
我早几年也考虑过这个问题,但一直没有很好的得到解决。后来写了一个IDE专家,用一个向导来生成派生类窗体单元,使用者可以选择是否要override基窗体的virtual方法(将一些要在某些时刻调用但不可预知调用行为的方法定义为虚方法)。
对于一个FORM来说,要从 object inspector 中就可以显示事件的话,有些难度。不知哪位高人有解。[:D]
个人觉得能高效地实现需求就行了,不必一条路走到黑,呵呵。
 
支持kk2000~~

写成一个窗口控件! 然后写出这个窗口控件的基准窗口 再让别的技术员继承你这个
基准窗口就可以了.
 
TO:kk2000
怎样把一个基准窗口做成一个控件?
怎么使用它?
控件一般是放到窗口上的,把一个窗口做成一个控件可以吗?
请给我个简单例子,谢谢!
 
不用那么麻烦。写一个TComponent就行了。事件是这个组件的。
然后在你的祖先类窗体上放上一个这个组件就行了。只要是由这个窗体派生的子类都有这个组件。让他们在组件的事件里写代码就可以了
 
把Form放到控件面板上是有点难的。这样的话即使你有published的属性也不会在object inspector 现实就比较难了。
 
不要用frame里,不爽
可以做成想quickreport那样,点新建按钮的时候可以新建form
unit单元:
type
TxxForm = class(TForm)

private
OldOnPaint:TNotifyEvent;
procedure FormOnPaint(sender:TObject);
protected
procedure CreateParams(var Params: TCreateParams);override;
public
constructor Create(AOwner:TComponent);override;
end;

implementation

{ TxxForm }

constructor TxxForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
OldOnPaint:=OnPaint;
OnPaint:=FormOnPaint;
Color:=$00F0F4F4;
BorderStyle:=bsNone;
end;

procedure TxxForm.CreateParams(var Params: TCreateParams);
var
PrevWindow:HWND;
begin
inherited CreateParams(Params);
PrevWindow:=FindWindow('TForm1','KKK');
Params.WndParent:=PrevWindow;
end;

procedure TxxForm.FormOnPaint(sender: TObject);
begin
if Assigned(OldOnPaint) then
OldOnPaint(self);
end;
end.

reg文件:
type
TIExxForm = class(TIExpert)
public
function GetPage: string; override;
function GetName: string; override;
function GetComment: string; override;
function GetGlyph: HICON; override;
function GetStyle: TExpertStyle; override;
function GetState: TExpertState; override;
function GetIDString: string; override;
function GetAuthor: string; override;
function GetMenuText: string; override;
procedure Execute; override;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterCustomModule(TxxForm, TCustomModule);
RegisterLibraryExpert(TIExxForm.Create);
end;

{ TIEWDTForm }

procedure TIExxForm.Execute;
begin
inherited;

end;

function TIExxForm.GetAuthor: string;
begin
Result:='';
end;

function TIExxForm.GetComment: string;
begin
Result:='';
end;

function TIExxForm.GetGlyph: HICON;
begin
Result := null;//LoadIcon(HInstance, 'IEMCFORM');
end;

function TIExxForm.GetIDString: string;
begin
Result:='';
end;

function TIExxForm.GetMenuText: string;
begin
Result:='';
end;

function TIExxForm.GetName: string;
begin
Result :='';
end;

function TIExxForm.GetPage: string;
begin
Result := 'Forms';
end;

function TIExxForm.GetState: TExpertState;
begin
Result := [esEnabled];
end;

function TIExxForm.GetStyle: TExpertStyle;
begin
Result := esForm;
end;

end.
 
以下是小弟子窗口的父类
TModelW = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
FSetStatus:TStatusEvent;
FPopedom:TPopedom;
FFindItemIndex:integer;
function GetTabStr:string;
procedure SetTabStr(Vtemp:string);
procedure SetADOC(VADO:TADOConnection);
procedure SetFFII(i:integer);
//procedure shearyw(s:string;);
public
FTabStr:string;
procedure saveX; virtual;
procedure SaveAsX; virtual;
procedure PrintX; virtual;
procedure Searchx; virtual;
procedure NewX; virtual;
procedure SearchNo(s:string); virtual;
procedure deletexX; virtual;
procedure SendEmail; virtual;
procedure UpdateList; virtual;
procedure ShowTloos; virtual; abstract;
procedure QuickSearch(const QuickSearch:TQSModel;WhereS:string); virtual;
constructor Create(AOwner: TComponent); override;
protected
FADOC:TADOConnection;
FQQSFType:TQuikSearchFieldType;
FCorplistSelf:Corplist;
FFormType:TFormType;
procedure SendMesToMain(s:string);
procedure SetFindIndex(i:integer);
property ADOC: TADOConnection read FADOC write SetADOC;
published
property TabStringx: string read GetTabStr write SetTabStr;
property OnShowStatu: TStatusEvent read FSetStatus write FSetStatus; //窗口提示
property QuickFindList: TQuikSearchFieldType read FQQSFType; //快速查找类型
property FindItemIndex:integer read FFindItemIndex write SetFFII; //主窗口快速查找的序号
property FormTYpe:TFormType read FFormType; //窗口类型
end;
 
多人接受答案了。
 
后退
顶部