日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

主控程序之主窗体

發(fā)布時間:2025/7/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 主控程序之主窗体 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用TRzMenuController控件只是為了增加主菜單的皮膚效果,可清除此控件

主控程序的主窗口單元要實現(xiàn)的需求如下:

1.自動識別并加載各個已經(jīng)注冊的插件;

2.自動識別并加載各個已經(jīng)注冊的插件中的各個模塊(自動生成系統(tǒng)的主菜單,自動生成各菜單項的點擊事件);

unit uMainForm;

interface

uses
? Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
? Dialogs, StdCtrls, ComCtrls, Menus, Loader, Buttons, uInterface, DB
? ,Masks, ExtCtrls, ToolWin, ADODB, RzCommon;

type
? TMainForm = class(TForm)
??? mainmenu1: TMainMenu;
??? cdsLibrary: TADOTable;
??? cdsMenu: TADOTable;
??? N11: TMenuItem;
??? RzMenuController1: TRzMenuController;
??? procedure FormCreate(Sender: TObject);
??? procedure FormDestroy(Sender: TObject);
? private
??? { Private declarations }
??? FDllsPath: string;
??? FDllList: TStringList;
??? FLoaders: array of TLoader;
??? FLoadersContainer: TStringList;
??? procedure RunForm(DLLName, aClassName: string);
??? procedure CreateMenu(Dataset: TDataSet; Menu: TMainMenu);
??? procedure MenuItemClick(Sender: TObject);
? public
??? { Public declarations }
? end;

var
? MainForm: TMainForm;

implementation

uses uDM;

{$R *.dfm}

procedure TMainForm.MenuItemClick(Sender: TObject);
begin
? if cdsMenu.Locate('ModuleId', TMenuItem(Sender).Hint, []) then? // TMenuItem(Sender).Hint=ModuleId
??? RunForm(cdsMenu.FieldByName('DLL').AsString, cdsMenu.FieldByName('ClassName').AsString);
end;

procedure TMainForm.RunForm(DLLName, aClassName: string);
var
? i: Integer;
begin
? if DLLName = '' then Exit;
? if aClassName = '' then Exit;
? i := FLoadersContainer.IndexOf(DLLName);
? if i = -1 then Exit;
? TLoader(FLoadersContainer.Objects[i]).ModelServiceInts.Cmd(PChar(aClassName));
end;

procedure TMainForm.CreateMenu(Dataset: TDataSet; Menu: TMainMenu);
var
? p, m: TMenuItem;
begin
? if not Dataset.Active then Exit;
? if Dataset.IsEmpty then Exit;
? if Menu = nil then Exit;
? Menu.Items.Clear;
? p := nil;
? Dataset.First;
? while not Dataset.Eof do????????????????????? // 此算法要求MODULEID必須可以排序
? begin
??? m := TMenuItem.Create(self);
??? m.Hint := Dataset.FieldByName('ModuleId').AsString;
??? m.Caption := Dataset.FieldByName('ModuleName').AsString;
??? if (Dataset.FieldByName('ParentId').AsString = '') or?????????????? // one level's root node
????? (Dataset.FieldByName('ParentId').AsString = Dataset.FieldByName('ModuleId').AsString) then begin
????? p := m;
????? Menu.Items.Add(m);
??? end else if (Dataset.FieldByName('ParentId').AsString <> '') and?? // second level's root node
????? (Dataset.FieldByName('ClassName').AsString = '') then begin
????? p.Add(m);
????? p := m;
??? end else begin??????????????????????????????????????????????????? // son node
????? p.Add(m);
????? m.OnClick := MenuItemClick;
??? end;
??? Dataset.Next;
? end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
? i: Integer;
begin
? cdsLibrary.IndexFieldNames := 'DLL';
? if cdsLibrary.IsEmpty then raise Exception.Create('沒有注冊任何插件');
? cdsMenu.IndexFieldNames := 'ModuleId';
? if cdsMenu.IsEmpty then raise Exception.Create('沒有注冊任何菜單項');

? FDllsPath := ExtractFilePath(Application.ExeName);?????? // load plugins
? FDllList := TStringList.Create;
? FLoadersContainer := TStringList.Create;
? SetLength(FLoaders, cdsLibrary.RecordCount);
? i := 0;
? cdsLibrary.First;
? while not cdsLibrary.Eof do begin
??? FLoaders[i] := TLoader.Create(FDllsPath + cdsLibrary.FieldByName('DLL').AsString);
??? FLoadersContainer.AddObject(ExtractFileName(FDllsPath + cdsLibrary.FieldByName('DLL').AsString), FLoaders[i]);
??? cdsLibrary.Next;
??? i := i + 1;
? end;

? CreateMenu(cdsMenu, mainmenu1);??????????????????????? // load menu items
end;

procedure TMainForm.FormDestroy(Sender: TObject);
var
? i: Integer;
begin
? for I := Low(FLoaders) to High(FLoaders) do
? begin
??? if Assigned(FLoaders[i]) then
????? FLoaders[i].Free;
? end;
? FreeAndNil(FDllList);
? FreeAndNil(FLoadersContainer);
end;

end.

轉(zhuǎn)載于:https://www.cnblogs.com/hnxxcxg/archive/2012/02/19/2358370.html

總結(jié)

以上是生活随笔為你收集整理的主控程序之主窗体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。