⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eerplacemodel.pas

📁 功能强大的ER图建模工具的源代码。 可以代替ERWin了
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit EERPlaceModel;

interface

uses
  SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms, 
  QDialogs, QStdCtrls, QCheckLst, QExtCtrls, QButtons, EERModel, QMenus,
  QComCtrls, QImgList;

type
  TEERPlaceModelForm = class(TForm)
    PlaceMainMenu: TMainMenu;
    PlaceOptions1: TMenuItem;
    LoadModelfromFileMI: TMenuItem;
    LoadModelfromDatabase1: TMenuItem;
    Selection1: TMenuItem;
    SelectAllMI: TMenuItem;
    N3: TMenuItem;
    RegionsMI: TMenuItem;
    DeselectAllMI: TMenuItem;
    PlaceMI: TMenuItem;
    N2: TMenuItem;
    AbortMI: TMenuItem;
    AddModelMI: TMenuItem;
    LinkModelMI: TMenuItem;
    LMPnl: TPanel;
    PageControlTitleShape: TShape;
    PageControlTitlePnl: TPanel;
    PageControlTitleLbl: TLabel;
    LMTreeView: TTreeView;
    SettingsGroupBox: TGroupBox;
    FNameLbl: TLabel;
    FilenameEd: TEdit;
    LMImgList: TImageList;
    LinkedFromFileRBtn: TRadioButton;
    LinkedFromDBRBtn: TRadioButton;
    Bevel1: TBevel;
    DBConnLbl: TLabel;
    DBConnEd: TEdit;
    DriverLbl: TLabel;
    DriverNameCBox: TComboBox;
    HostLbl: TLabel;
    HostEd: TEdit;
    IPEd: TEdit;
    IPLbl: TLabel;
    DBLbl: TLabel;
    DBEd: TEdit;
    Label1: TLabel;
    ModelIDEd: TEdit;
    UserLbl: TLabel;
    UserEd: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure FormShow(Sender: TObject);

    function SetData(EERModel: TEERModel; P: TPoint; PlaceFrom: integer): Boolean;

    function GetFileNameByOpenDialog: string;
    function LoadModelfromFile: Boolean;
    procedure LoadModelfromFileMIClick(Sender: TObject);
    function LoadModelfromDB: Boolean;
    function LoadModelfromLibrary: Boolean;

    procedure RefreshModel;

    procedure RegionsMIShow(Sender: TObject);
    procedure SelectAllMIClick(Sender: TObject);
    procedure SelectAllMIShow(Sender: TObject);
    procedure AbortMIClick(Sender: TObject);

    procedure AddModelMIClick(Sender: TObject);
    procedure LinkModelMIClick(Sender: TObject);

    procedure AddLinkModel(Link: Boolean);

    procedure DisplayLinkedModels(EERModel: TEERModel);
    procedure RefreshLinkedModelSettings;
    procedure ApplyLinkedModelSettings;
    procedure LMTreeViewChange(Sender: TObject; Node: TTreeNode);
    procedure LinkedFromFileRBtnClick(Sender: TObject);
    procedure LMTreeViewChanging(Sender: TObject; Node: TTreeNode;
      var AllowChange: Boolean);

    procedure RefreshLinkedModel(EERModel: TEERModel; IDLinkedModel: integer = -1);
    procedure RefreshLinkedModelByID(IDLinkedModel: integer);
  private
    { Private declarations }
    EERModel, Model2Place: TEERModel;
    PlacePos: TPoint;

    IsStoredInDB: Boolean;
  public
    { Public declarations }
  end;

const
  PlaceFromFile=1;
  PlaceFromDB=1;
  PlaceFromLibrary=1;

var
  EERPlaceModelForm: TEERPlaceModelForm;

implementation

uses MainDM, GUIDM, DBDM, EERStoreInDatabase;

{$R *.xfm}

procedure TEERPlaceModelForm.FormCreate(Sender: TObject);
begin
  DMMain.InitForm(self);

  Model2Place:=nil;
  IsStoredInDB:=False;

  Width:=700;
  Height:=550;
end;

procedure TEERPlaceModelForm.FormDestroy(Sender: TObject);
begin
  {if(Model2Place<>nil)then
    Model2Place.Free;}
end;

procedure TEERPlaceModelForm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  //Action:=caFree;
  
  ApplyLinkedModelSettings;
end;

procedure TEERPlaceModelForm.FormShow(Sender: TObject);
begin
  //Because of CLX Bug
  AutoScroll:=True;
end;

function TEERPlaceModelForm.SetData(EERModel: TEERModel; P: TPoint; PlaceFrom: integer): Boolean;
begin
  SetData:=True;

  self.EERModel:=EERModel;
  self.PlacePos:=P;

  if(PlaceFrom=PlaceFromFile)then
  begin
    if(Not(LoadModelfromFile))then
      SetData:=False;
  end
  else if(PlaceFrom=PlaceFromDB)then
  begin
    if(Not(LoadModelfromDB))then
      SetData:=False;
  end
  else if(PlaceFrom=PlaceFromLibrary)then
  begin
    if(Not(LoadModelfromLibrary))then
      SetData:=False;  
  end;
end;

function TEERPlaceModelForm.GetFileNameByOpenDialog: string;
var theOpenDialog: TOpenDialog;
begin
  theOpenDialog:=TOpenDialog.Create(nil);
  try
{$IFDEF MSWINDOWS}
    //On Windows use native Win32 Open Dlg
    theOpenDialog.UseNativeDialog:=True;
    theOpenDialog.OnShow:=DMMain.OnOpenSaveDlgShow;
{$ENDIF}

    theOpenDialog.Title:=DMMain.GetTranslatedMessage('Open a Model ...', 9);
    theOpenDialog.DefaultExt:='xml';
    theOpenDialog.Filter:=DMMain.GetTranslatedMessage('DB-Model files (*.xml)|*.xml', 10);
    theOpenDialog.Width:=600;
    theOpenDialog.Height:=450;

    if(DirectoryExists(DMGUI.RecentOpenFileDir))then
      theOpenDialog.InitialDir:=DMGUI.RecentOpenFileDir
    else
      theOpenDialog.InitialDir:='';

    if(theOpenDialog.Execute)then
      GetFileNameByOpenDialog:=theOpenDialog.FileName
    else
      GetFileNameByOpenDialog:='';

  finally
    theOpenDialog.Free;
  end;
end;

function TEERPlaceModelForm.LoadModelfromFile: Boolean;
var fname: string;
begin
  LoadModelfromFile:=False;

  fname:=GetFileNameByOpenDialog;

  if(fname<>'')then
  begin
    if(Model2Place<>nil)then
      Model2Place.Free;

    Model2Place:=TEERModel.Create(self);
    Model2Place.LoadFromFile2(fname);

    Model2Place.ReadOnly:=True;

    //One must not add a model to itself
    if(Model2Place.ModelFilename=EERModel.ModelFilename)then
    begin
      MessageDlg('You must not place a Model on itself.',
        mtError, [mbOK], 0);

      Model2Place.Free;
      Model2Place:=nil;
    end
    else
    begin
      IsStoredInDB:=False;

      RefreshModel;

      DMGUI.RecentOpenFileDir:=ExtractFilePath(fname);
    end;

    if(Visible)then
      SetFocus;

    LoadModelfromFile:=True;
  end;
end;

function TEERPlaceModelForm.LoadModelfromDB: Boolean;
var EERStoreInDatabaseForm: TEERStoreInDatabaseForm;
begin
  LoadModelfromDB:=False;

  EERStoreInDatabaseForm:=TEERStoreInDatabaseForm.Create(self);
  try
    if(Model2Place<>nil)then
      Model2Place.Free;

    Model2Place:=TEERModel.Create(self);

    if(EERStoreInDatabaseForm.SetData(Model2Place, False))then
      if(EERStoreInDatabaseForm.ShowModal=mrOk)then
      begin
        IsStoredInDB:=True;

        RefreshModel;

        if(Visible)then
          SetFocus;

        LoadModelfromDB:=True;        
      end;

  finally
    EERStoreInDatabaseForm.Free;
  end;
end;

function TEERPlaceModelForm.LoadModelfromLibrary: Boolean;
begin
  LoadModelfromLibrary:=False;

  DMMain.LoadValueFromSettingsIniFile('OnlineLibrary', 'HostName', 'onlinelib.fabforce.com');
  DMMain.LoadValueFromSettingsIniFile('OnlineLibrary', 'Database', 'onlinelib');
  DMMain.LoadValueFromSettingsIniFile('OnlineLibrary', 'User_Name', 'onlinelib');
  DMMain.LoadValueFromSettingsIniFile('OnlineLibrary', 'Password', 'ol32!pw');
end;

procedure TEERPlaceModelForm.LoadModelfromFileMIClick(Sender: TObject);
begin
  LoadModelfromFile;
end;

procedure TEERPlaceModelForm.RefreshModel;
var theList: TList;
  i: integer;
  theMenuItem: TMenuItem;
begin
  if(Model2Place=nil)then
    Exit;

  theList:=TList.Create;
  try
    Model2Place.GetEERObjectList([EERRegion], theList, False);

    for i:=0 to RegionsMI.Count-1 do
    begin
      theMenuItem:=RegionsMI[i];
      RegionsMI.Delete(i);
      theMenuItem.Free;
    end;

    for i:=0 to theList.Count-1 do
    begin
      theMenuItem:=TMenuItem.Create(self);
      theMenuItem.Name:='RegionMI'+IntToStr(i);
      theMenuItem.Caption:=TEERRegion(theList[i]).ObjName;
      theMenuItem.OnClick:=RegionsMIShow;
      theMenuItem.Tag:=TEERRegion(theList[i]).Obj_id;
      RegionsMI.Add(theMenuItem);
    end;
  finally
    theList.Free;
  end;
end;

procedure TEERPlaceModelForm.RegionsMIShow(Sender: TObject);
var theEERRegion: TEERRegion;
  theList: TList;
  i: integer;
begin
  theList:=TList.Create;
  try
    theEERRegion:=Model2Place.GetEERObjectByID(TMenuItem(Sender).Tag);
    theEERRegion.GetEERObjsInRegion([EERNote, EERRegion, EERRelation, EERTable, EERImage], theList);

    for i:=0 to theList.Count-1 do
      TEERObj(theList[i]).SetSelected(True);

    theEERRegion.SetSelected(True);

    Model2Place.Refresh;
  finally
    theList.Free;
  end;
end;

procedure TEERPlaceModelForm.SelectAllMIClick(Sender: TObject);
var i: integer;
begin
  if(Model2Place<>nil)then
  begin
    for i:=0 to Model2Place.ComponentCount-1 do
      if(Model2Place.Components[i].ClassParent=TEERObj)then
        TEERObj(Model2Place.Components[i]).SetSelected(TMenuItem(Sender).Tag=1);

    Model2Place.Refresh;
  end;
end;

procedure TEERPlaceModelForm.SelectAllMIShow(Sender: TObject);
begin
  TMenuItem(Sender).Enabled:=(Model2Place<>nil);
end;

procedure TEERPlaceModelForm.AbortMIClick(Sender: TObject);
begin
  ModalResult:=mrAbort;
end;

procedure TEERPlaceModelForm.AddModelMIClick(Sender: TObject);
begin
  AddLinkModel(False);

  ModalResult:=mrOK;
end;

procedure TEERPlaceModelForm.LinkModelMIClick(Sender: TObject);
begin
  AddLinkModel(True);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -