类和代码重复利用问题, 请各位参与!! ( 积分: 200 )

  • 主题发起人 主题发起人 mchestnut
  • 开始时间 开始时间
M

mchestnut

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是我的主要Form代码
unit MainUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, Menus, ExtCtrls,jpeg, ImgList, WinSkinStore,
WinSkinData;

type
TMainForm = class(TForm)
MainImage: TImage;
MainMenu: TMainMenu;
MainToolBar: TToolBar;
MainStatusBar: TStatusBar;
ImageList1: TImageList;
procedure FormCreate(Sender: TObject);
procedure HClick(Sender: TObject);
procedure MenuMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
Height: Integer);
procedure MenuClick(Sender: TObject);
procedure MenuClickN(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

uses DtMduleUnit,PublicUnit, PastUnit, BFormaUnit, SettimeUnit,
SetMenuUnit;

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
var
NewItem:TMenuItem;
P:TMenuItem;
NewToolBtn: TToolButton;
pr_left:Integer;
begin

//-------------------------------------
ShortDateFormat:='yyyy-mm-dd';
MainForm.Align:=alClient;
//------------------------------注册窗口
RegisterClasses([TUbasForma]);//可以为form列表
//------------------------------------//主form背景图片
if FileExists(ExtractFilePath(Application.ExeName)+'my.jpg') then
begin
MainImage.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'my.jpg');
end
else if FileExists(ExtractFilePath(Application.ExeName)+'my.bmp') then
begin
MainImage.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'my.bmp');
end;
//------------------------------------ //打开数据库函数,在PublicUnit定义
if OpenTable(MainDtMdule.AQryMenu,
'select * from UserMenu WHERE UserNums like ''%'
+Pu_UserLst_UserNum+'%'''+' AND isnull(MenuFlag,0)=1'
+' ORDER BY MenuName' )>0 then

//Pu_UserLst_UserNum:用户编号,确定可否操作
begin
pr_left:=0;
while not MainDtMdule.AQryMenu.Eof do
begin
NewItem:=TMenuItem.Create(Self);
NewItem.Caption:=MainDtMdule.AQryMenu.FieldByName('MenuCaption').AsString;
NewItem.Name:='M'+MainDtMdule.AQryMenu.FieldByName('MenuName').AsString;
if MainDtMdule.AQryMenu.FieldByName('FatherMLen').AsInteger=0 then
begin
MainMenu.Items.Add(NewItem);
end
else
begin
p:=TMenuItem(FindComponent('M'+
copy(MainDtMdule.AQryMenu.FieldByName('MenuName').AsString,
1,MainDtMdule.AQryMenu.FieldByName('FatherMLen').AsInteger)));
p.Add(NewItem);
end;
NewItem.OnMeasureItem:=MenuMeasureItem;
// NewItem.Tag:=MainDtMdule.AQryMenu.FieldByName('MenuTage').AsInteger;
if MainDtMdule.AQryMenu.FieldByName('ChlidMlen').AsInteger=0 then
begin
NewItem.OnClick:=MenuClick;
end;
if MainDtMdule.AQryMenu.FieldByName('SpeedYN').AsInteger>0 THEN //判断是否有快捷按钮
begin
NewToolBtn:=TToolButton.Create(Self);
NewToolBtn.Caption:=MainDtMdule.AQryMenu.FieldByName('SpeeDCaption').AsString;
NewToolBtn.Name:='B'+MainDtMdule.AQryMenu.FieldByName('MenuName').AsString;
NewToolBtn.Parent:=MainToolBar;
NewToolBtn.ImageIndex:=MainDtMdule.AQryMenu.FieldByName('MenuIcoId').AsInteger;
NewToolBtn.Left:=pr_left;
NewToolBtn.ShowHint:=true;
NewToolBtn.Hint:=MainDtMdule.AQryMenu.FieldByName('MenuCaption').AsString;
pr_left:=pr_left+NewToolBtn.Width;
if Pu_UserLst_UserTag>=NewItem.Tag then
NewToolBtn.OnClick:=MenuClick
else NewToolBtn.OnClick:=MenuClickN;
end;
//操作权限 //根据你的权限等级决等你是否有权操作
if Pu_UserLst_UserTag>=MainDtMdule.AQryMenu.FieldByName('MenuTage').AsInteger then
NewItem.Enabled:=true
else NewItem.Enabled:=false;
MainDtMdule.AQryMenu.Next;
end;
MainDtMdule.AQryMenu.Close;
//CreatMenu(MainDtMdule.AQryMenu,MainMenu,MainToolBar);
end;
//------------------------------------
end;

procedure TMainForm.HClick(Sender: TObject);
begin
Close;
end;

procedure TMainForm.MenuMeasureItem(Sender: TObject; ACanvas: TCanvas;
var Width, Height: Integer);
begin
Width:=Width+6;
Height:=Height+6;
end;


procedure TMainForm.MenuClickN(Sender: TObject);
begin
ShowMessage('对不起,你无权操作!');
end;

procedure TMainForm.MenuClick(Sender: TObject);

var
pr_OperForm:TForm;
pr_FindForm:TFormClass;
pr_FormName: String ;
begin
if OpenTable(MainDtMdule.AQryMenu,'select * from UserMenu WHERE MenuName='''
+copy(TMenuItem(Sender).Name,2,Length(TMenuItem(Sender).Name)-1)+'''' )>0 then
begin

// ShowMessage(copy(TMenuItem(Sender).Name,2,Length(TMenuItem(Sender).Name)-1));
if MainDtMdule.AQryMenu.FieldByName('ProcedNU').AsInteger>0 then
begin
if MainDtMdule.AQryMenu.FieldByName('ProcedNU').AsInteger=1 then
MainForm.Close;
if MainDtMdule.AQryMenu.FieldByName('ProcedNU').AsInteger=2 then
begin
SetMenuForm:=tSetMenuForm.CreatE(Application);
SetMenuForm.Show;
end;
end
else
begin
pr_FormName:=MainDtMdule.AQryMenu.FieldByName('ShowFRM').AsString;
if(trim(pr_FormName)<>'') THEN
begin
if MainDtMdule.AQryMenu.FieldByName('DateTime').AsInteger>0 then
//>0表示分期
begin
SetTimeForm:=TSetTimeForm.Create(Application);
SetTimeForm.ShowModal;
end;
Pu_UserMenu_MenuName:=MainDtMdule.AQryMenu.FieldByName('MenuName').AsString;
pu_UserMenu_CmenuChoi:=MainDtMdule.AQryMenu.FieldByName('CMenuChoi').AsInteger;
pr_FindForm :=TFormClass(findClass('T'+pr_FormName));
pr_OperForm :=pr_FindForm.create(self);
pr_OperForm.Width:=round(Screen.WorkAreaWidth*MainDtMdule.AQryMenu.FieldByName('ShowSizeW').AsFloat);
pr_OperForm.Height:=round(Screen.WorkAreaHeight*MainDtMdule.AQryMenu.FieldByName('ShowSizeH').AsFloat);
pr_OperForm.ShowModal;
end;
end;
//ShowMessage(copy(TMenuItem(Sender).Name,2,Length(TMenuItem(Sender).Name)-1));
end;
//ShowMessage('对不起,本功能正在完善之中!');
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
UnRegisterClasses([TUbasForma]);
end;

end.

问题:
我的构想是:我的系统中所有form中的菜单、工具栏按钮信息存放在数据库中,更具用户权限动态生成。
上述代码中建立菜单、工具栏的代码如何重复利用?通过公共函数还是通过类?
方案一、我尝试过使用函数,但存在两给问题:
1、菜单单击事件定义如何实现?
2、NewItem:=TMenuItem.Create(Self);NewToolBtn:=TToolButton.Create(Self)出错
改为NewItem:=TMenuItem.Create(Application.Owner);NewToolBtn:=TToolButton.Create(Application.Owner)编译通过运行出错
上述两个问题无法解决

方案二、设计一个类来实现上述功能,但我从来没有用过,不知如何实现?

请兄弟们给与指点,谢谢!!
 
下面是我的主要Form代码
unit MainUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, Menus, ExtCtrls,jpeg, ImgList, WinSkinStore,
WinSkinData;

type
TMainForm = class(TForm)
MainImage: TImage;
MainMenu: TMainMenu;
MainToolBar: TToolBar;
MainStatusBar: TStatusBar;
ImageList1: TImageList;
procedure FormCreate(Sender: TObject);
procedure HClick(Sender: TObject);
procedure MenuMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
Height: Integer);
procedure MenuClick(Sender: TObject);
procedure MenuClickN(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

uses DtMduleUnit,PublicUnit, PastUnit, BFormaUnit, SettimeUnit,
SetMenuUnit;

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
var
NewItem:TMenuItem;
P:TMenuItem;
NewToolBtn: TToolButton;
pr_left:Integer;
begin

//-------------------------------------
ShortDateFormat:='yyyy-mm-dd';
MainForm.Align:=alClient;
//------------------------------注册窗口
RegisterClasses([TUbasForma]);//可以为form列表
//------------------------------------//主form背景图片
if FileExists(ExtractFilePath(Application.ExeName)+'my.jpg') then
begin
MainImage.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'my.jpg');
end
else if FileExists(ExtractFilePath(Application.ExeName)+'my.bmp') then
begin
MainImage.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'my.bmp');
end;
//------------------------------------ //打开数据库函数,在PublicUnit定义
if OpenTable(MainDtMdule.AQryMenu,
'select * from UserMenu WHERE UserNums like ''%'
+Pu_UserLst_UserNum+'%'''+' AND isnull(MenuFlag,0)=1'
+' ORDER BY MenuName' )>0 then

//Pu_UserLst_UserNum:用户编号,确定可否操作
begin
pr_left:=0;
while not MainDtMdule.AQryMenu.Eof do
begin
NewItem:=TMenuItem.Create(Self);
NewItem.Caption:=MainDtMdule.AQryMenu.FieldByName('MenuCaption').AsString;
NewItem.Name:='M'+MainDtMdule.AQryMenu.FieldByName('MenuName').AsString;
if MainDtMdule.AQryMenu.FieldByName('FatherMLen').AsInteger=0 then
begin
MainMenu.Items.Add(NewItem);
end
else
begin
p:=TMenuItem(FindComponent('M'+
copy(MainDtMdule.AQryMenu.FieldByName('MenuName').AsString,
1,MainDtMdule.AQryMenu.FieldByName('FatherMLen').AsInteger)));
p.Add(NewItem);
end;
NewItem.OnMeasureItem:=MenuMeasureItem;
// NewItem.Tag:=MainDtMdule.AQryMenu.FieldByName('MenuTage').AsInteger;
if MainDtMdule.AQryMenu.FieldByName('ChlidMlen').AsInteger=0 then
begin
NewItem.OnClick:=MenuClick;
end;
if MainDtMdule.AQryMenu.FieldByName('SpeedYN').AsInteger>0 THEN //判断是否有快捷按钮
begin
NewToolBtn:=TToolButton.Create(Self);
NewToolBtn.Caption:=MainDtMdule.AQryMenu.FieldByName('SpeeDCaption').AsString;
NewToolBtn.Name:='B'+MainDtMdule.AQryMenu.FieldByName('MenuName').AsString;
NewToolBtn.Parent:=MainToolBar;
NewToolBtn.ImageIndex:=MainDtMdule.AQryMenu.FieldByName('MenuIcoId').AsInteger;
NewToolBtn.Left:=pr_left;
NewToolBtn.ShowHint:=true;
NewToolBtn.Hint:=MainDtMdule.AQryMenu.FieldByName('MenuCaption').AsString;
pr_left:=pr_left+NewToolBtn.Width;
if Pu_UserLst_UserTag>=NewItem.Tag then
NewToolBtn.OnClick:=MenuClick
else NewToolBtn.OnClick:=MenuClickN;
end;
//操作权限 //根据你的权限等级决等你是否有权操作
if Pu_UserLst_UserTag>=MainDtMdule.AQryMenu.FieldByName('MenuTage').AsInteger then
NewItem.Enabled:=true
else NewItem.Enabled:=false;
MainDtMdule.AQryMenu.Next;
end;
MainDtMdule.AQryMenu.Close;
//CreatMenu(MainDtMdule.AQryMenu,MainMenu,MainToolBar);
end;
//------------------------------------
end;

procedure TMainForm.HClick(Sender: TObject);
begin
Close;
end;

procedure TMainForm.MenuMeasureItem(Sender: TObject; ACanvas: TCanvas;
var Width, Height: Integer);
begin
Width:=Width+6;
Height:=Height+6;
end;


procedure TMainForm.MenuClickN(Sender: TObject);
begin
ShowMessage('对不起,你无权操作!');
end;

procedure TMainForm.MenuClick(Sender: TObject);

var
pr_OperForm:TForm;
pr_FindForm:TFormClass;
pr_FormName: String ;
begin
if OpenTable(MainDtMdule.AQryMenu,'select * from UserMenu WHERE MenuName='''
+copy(TMenuItem(Sender).Name,2,Length(TMenuItem(Sender).Name)-1)+'''' )>0 then
begin

// ShowMessage(copy(TMenuItem(Sender).Name,2,Length(TMenuItem(Sender).Name)-1));
if MainDtMdule.AQryMenu.FieldByName('ProcedNU').AsInteger>0 then
begin
if MainDtMdule.AQryMenu.FieldByName('ProcedNU').AsInteger=1 then
MainForm.Close;
if MainDtMdule.AQryMenu.FieldByName('ProcedNU').AsInteger=2 then
begin
SetMenuForm:=tSetMenuForm.CreatE(Application);
SetMenuForm.Show;
end;
end
else
begin
pr_FormName:=MainDtMdule.AQryMenu.FieldByName('ShowFRM').AsString;
if(trim(pr_FormName)<>'') THEN
begin
if MainDtMdule.AQryMenu.FieldByName('DateTime').AsInteger>0 then
//>0表示分期
begin
SetTimeForm:=TSetTimeForm.Create(Application);
SetTimeForm.ShowModal;
end;
Pu_UserMenu_MenuName:=MainDtMdule.AQryMenu.FieldByName('MenuName').AsString;
pu_UserMenu_CmenuChoi:=MainDtMdule.AQryMenu.FieldByName('CMenuChoi').AsInteger;
pr_FindForm :=TFormClass(findClass('T'+pr_FormName));
pr_OperForm :=pr_FindForm.create(self);
pr_OperForm.Width:=round(Screen.WorkAreaWidth*MainDtMdule.AQryMenu.FieldByName('ShowSizeW').AsFloat);
pr_OperForm.Height:=round(Screen.WorkAreaHeight*MainDtMdule.AQryMenu.FieldByName('ShowSizeH').AsFloat);
pr_OperForm.ShowModal;
end;
end;
//ShowMessage(copy(TMenuItem(Sender).Name,2,Length(TMenuItem(Sender).Name)-1));
end;
//ShowMessage('对不起,本功能正在完善之中!');
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
UnRegisterClasses([TUbasForma]);
end;

end.

问题:
我的构想是:我的系统中所有form中的菜单、工具栏按钮信息存放在数据库中,更具用户权限动态生成。
上述代码中建立菜单、工具栏的代码如何重复利用?通过公共函数还是通过类?
方案一、我尝试过使用函数,但存在两给问题:
1、菜单单击事件定义如何实现?
2、NewItem:=TMenuItem.Create(Self);NewToolBtn:=TToolButton.Create(Self)出错
改为NewItem:=TMenuItem.Create(Application.Owner);NewToolBtn:=TToolButton.Create(Application.Owner)编译通过运行出错
上述两个问题无法解决

方案二、设计一个类来实现上述功能,但我从来没有用过,不知如何实现?

请兄弟们给与指点,谢谢!!
 
用一个Config类根据用户权限从数据库或配置文件中读取设置,动态生成界面控件。把用户操作封装成方法,然后把方法赋值给界面控件
 
TO bluesaga

我是新手,希望能有代码
 
我也是新手,刚开始的时候也想这样弄,后来放弃了,几十个form,pas文件,发现基本就是近100行代码的重复.
 
后退
顶部