免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
主控程序之主窗體

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

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

1.自動(dòng)識(shí)別并加載各個(gè)已經(jīng)注冊(cè)的插件;

2.自動(dòng)識(shí)別并加載各個(gè)已經(jīng)注冊(cè)的插件中的各個(gè)模塊(自動(dòng)生成系統(tǒng)的主菜單,自動(dòng)生成各菜單項(xiàng)的點(diǎn)擊事件);

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('沒有注冊(cè)任何插件');
  cdsMenu.IndexFieldNames := 'ModuleId';
  if cdsMenu.IsEmpty then raise Exception.Create('沒有注冊(cè)任何菜單項(xiàng)');

  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.

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
unigui的session【1】
數(shù)據(jù)類型
delphi增刪改查
在Delphi編程中利用Excel實(shí)現(xiàn)動(dòng)態(tài)報(bào)表
DBGrid內(nèi)使用CheckBox功能
cxgrid如何多選輸出記錄
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服