小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

主控程序之主窗體

 aaie_ 2013-04-29

使用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('沒(méi)有注冊(cè)任何插件');
  cdsMenu.IndexFieldNames := 'ModuleId';
  if cdsMenu.IsEmpty then raise Exception.Create('沒(méi)有注冊(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.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多