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

📄 eer.pas

📁 功能强大的ER图建模工具的源代码。 可以代替ERWin了
💻 PAS
字号:
unit EER;

//----------------------------------------------------------------------------------------------------------------------
//
// This file is part of fabFORCE DBDesigner4.
// Copyright (C) 2002 Michael G. Zinner, www.fabFORCE.net
//
// DBDesigner4 is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// DBDesigner4 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with DBDesigner4; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
//----------------------------------------------------------------------------------------------------------------------
//
// Unit EER.pas
// ------------
// Version 1.1, 28.03.2003, Mike
// Description
//   Contains a MDI Child form which displays the EERModel
//
// Changes:
//   Version 1.1, 28.03.2003, Mike
//     Added QEventType_RefreshGridBtn in FormActivate
//   Version 1.0, 13.03.2003, Mike
//     initial version
//
//----------------------------------------------------------------------------------------------------------------------

interface

uses
  SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
  QStdCtrls, QExtCtrls, QImgList, QMenus, QTypes, EERModel, Qt, IniFiles;

type
  TEERForm = class(TForm)
    PopupMenu1: TPopupMenu;
    Zoom100MI: TMenuItem;
    NavPaletteTimer: TTimer;
    SelectAllMI: TMenuItem;
    N1: TMenuItem;
    Zoome50MI: TMenuItem;
    Zoom75MI: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Zoom100MIClick(Sender: TObject);
    procedure NavPaletteTimerTimer(Sender: TObject);
    procedure SelectAllMIClick(Sender: TObject);
    procedure Zoome50MIClick(Sender: TObject);
    procedure Zoom75MIClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

    function SaveAs: Boolean;
  private
    { Private declarations }
    PrevXPos, PrevYPos: integer;
    FormIsClosing: Boolean;
  public
    { Public declarations }

    EERModel: TEERModel;
    theFormMenuItem: TMenuItem;
  end;


var
  EERForm: TEERForm;

implementation

uses MainDM, EERDM;

{$R *.xfm}


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

  //OnKeyDown:=TForm(Sender).OnKeyDown;
  //OnKeyUp:=TForm(Sender).OnKeyUp;

  theFormMenuItem:=nil;
  FormIsClosing:=False;

  try
    EERModel:=TEERModel.Create(self);

    Font.Name:=EERModel.DefModelFont;
    Canvas.Font.Name:=EERModel.DefModelFont;
    
    EERModel.PopupMenu:=PopupMenu1;

    //Initial ModelName and Filename
    EERModel.SetModelName('Noname'+DMEER.GetNextNonameNumber);
    EERModel.ModelFilename:=EERModel.GetModelName+'.xml';

    //Caption:='DB Model | '+EERModel.GetModelName;
  except
    on x: Exception do
    begin
      MessageDlg(DMMain.GetTranslatedMessage('Not able to create EER Model:'#13#10#13#10+'%s',
        193, x.Message), mtError, [mbOK], 0);
      //Application.Terminate;
    end;
  end;

  //Use the Timer to track ScrollBar Action
  PrevXPos:=-1;
  PrevYPos:=-1;
  NavPaletteTimer.Enabled:=True;

  Cursor:=crArrow;
end;

procedure TEERForm.FormActivate(Sender: TObject);
var theEvent: QCustomEventH;
begin
  if(Not(FormIsClosing))then
  begin
    DMEER.UpdateStatusBar;

    //Show Datatypes in Palette
    theEvent := QCustomEvent_create(QEventType_RefreshDataTypesPalette, EERModel);
    sendCLXEvent(Application.MainForm.Handle, theEvent);

    //Show Tables in Palette
    theEvent := QCustomEvent_create(QEventType_RefreshModelPalette, EERModel);
    sendCLXEvent(Application.MainForm.Handle, theEvent);

    //Refresh Nav Img
    theEvent := QCustomEvent_create(QEventType_RefreshNavPalette, EERModel);
    sendCLXEvent(Application.MainForm.Handle, theEvent);

    //Refresh Grid Btn
    sendCLXEvent(Application.MainForm.Handle, QCustomEvent_create(QEventType_RefreshGridBtn, EERModel));

    if(theFormMenuItem<>nil)then
      theFormMenuItem.Checked:=True;

    theEvent := QCustomEvent_create(QEventType_SetSaveImgs, nil);
    sendCLXEvent(Application.MainForm.Handle, theEvent);
  end;
end;

procedure TEERForm.FormPaint(Sender: TObject);
var p1, p2: TPoint;
begin
  with Canvas do
  begin
    if(EERModel.Width<Width)or(EERModel.Height<Height)then
    begin
      Pen.Color:=clGray;
      Brush.Color:=clBackground;

      p1:=Point((Width-EERModel.Width) div 2-1,
       (Height-EERModel.Height) div 2-1);

      p2:=Point((Width+EERModel.Width) div 2+1,
        (Height+EERModel.Height) div 2+1);

      FillRect(Rect(0, 0, width, p1.Y));
      FillRect(Rect(0, p1.Y, width, height));
      FillRect(Rect(0, p1.Y, p1.X, p2.Y));
      FillRect(Rect(p2.X, p1.Y, width, p2.Y));

      MoveTo(p1.X, p1.Y);
      LineTo(p1.X, P2.Y);
      LineTo(p2.X, P2.Y);
      LineTo(P2.X, P1.Y);
      LineTo(P1.X, P1.Y);
    end;
  end;
end;

procedure TEERForm.FormResize(Sender: TObject);
begin
  //ATTENTION!!!!
  //ADD CODE TO CAPTURE DISAPPEAR OF SCROLLBARS
  if(EERModel.Width<Width)then
    EERModel.Left:=(Width-EERModel.Width) div 2;

  if(EERModel.Height<Height)then
    EERModel.Top:=(Height-EERModel.Height) div 2;
end;

procedure TEERForm.FormClose(Sender: TObject; var Action: TCloseAction);
var theEvent: QCustomEventH;
begin
  FormIsClosing:=True;

  //Remove the ChildForms MenuItem from the Window Menu
  theEvent := QCustomEvent_create(QEventType_RemoveChildFormsMenuItem, theFormMenuItem);
  sendCLXEvent(Application.MainForm.Handle, theEvent);

  //Clear Datatypes in Palette
  theEvent := QCustomEvent_create(QEventType_RefreshDataTypesPalette, nil);
  sendCLXEvent(Application.MainForm.Handle, theEvent);

  //Clear Tables in Palette
  theEvent := QCustomEvent_create(QEventType_RefreshModelPalette, nil);
  sendCLXEvent(Application.MainForm.Handle, theEvent);

  //Clear Img in Nav
  theEvent := QCustomEvent_create(QEventType_ClearNavImg, nil);
  sendCLXEvent(Application.MainForm.Handle, theEvent);

  theEvent := QCustomEvent_create(QEventType_EnableMainFormRefreshTmr, nil);
  sendCLXEvent(Application.MainForm.Handle, theEvent);

  Action:=caFree;
end;


procedure TEERForm.NavPaletteTimerTimer(Sender: TObject);
begin
  if(Assigned(HorzScrollBar))then
  begin
    if(HorzScrollBar.Position<>PrevXPos)or
      (VertScrollBar.Position<>PrevYPos)then
    begin
      PrevXPos:=HorzScrollBar.Position;
      PrevYPos:=VertScrollBar.Position;

      DMEER.RefreshNavPalette;
    end;
  end;
end;

procedure TEERForm.SelectAllMIClick(Sender: TObject);
var i: integer;
begin
  with EERModel do
  begin
    //Set Font for all EER-Objects
    for i:=ComponentCount-1 downto 0 do
      if(Components[I].Classparent=TEERObj)then
        TEERObj(Components[I]).SetSelected(True);
  end;

  EERModel.Refresh;
end;

procedure TEERForm.Zoom100MIClick(Sender: TObject);
begin
  EERModel.SetZoomFac(100);

  //Scroll to left corner
  {if(Assigned(HorzScrollBar))then
    HorzScrollBar.Position:=0;

  if(Assigned(VertScrollBar))then
    VertScrollBar.Position:=0;}
end;

procedure TEERForm.Zoome50MIClick(Sender: TObject);
begin
  EERModel.SetZoomFac(50);

  //Scroll to left corner
  {if(Assigned(HorzScrollBar))then
    HorzScrollBar.Position:=0;

  if(Assigned(VertScrollBar))then
    VertScrollBar.Position:=0;}
end;

procedure TEERForm.Zoom75MIClick(Sender: TObject);
begin
  EERModel.SetZoomFac(75);

  //Scroll to left corner
  {if(Assigned(HorzScrollBar))then
    HorzScrollBar.Position:=0;

  if(Assigned(VertScrollBar))then
    VertScrollBar.Position:=0;}
end;

procedure TEERForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Res: TModalResult;
begin
  CanClose:=True;

  if(EERModel.IsChanged)then
  begin
    DMMain.NormalizeStayOnTopForms;

    Res:=MessageDlg(DMMain.GetTranslatedMessage('The model has not been saved. '+
      'Do you want to save the model before closing?', 194), mtConfirmation, [mbYes, mbNo, mbCancel], 0);

    DMMain.RestoreStayOnTopForms;

    if(Res=mrYes)then
    begin
      if(EERModel.ModelFilename='')or(CompareText(Copy(EERModel.ModelFilename, 1, Length('Noname')), 'Noname')=0)then
        CanClose:=SaveAs
      else
        EERModel.SaveToFile(EERModel.ModelFilename);
    end
    else if(Res=mrCancel)then
      CanClose:=False;
  end;
end;


function TEERForm.SaveAs: Boolean;
var theSaveDialog: TSaveDialog;
  RecentSaveFileAsDir: string;
  theFileName, s: string;
begin
  SaveAs:=False;

  theSaveDialog:=TSaveDialog.Create(nil);
  try
{$IFDEF MSWINDOWS}
    //On Windows use native Win32 Open Dlg
    theSaveDialog.UseNativeDialog:=True;
    theSaveDialog.OnShow:=DMMain.OnOpenSaveDlgShow;
{$ENDIF}

    theSaveDialog.Title:=DMMain.GetTranslatedMessage('Save Model As ...', 195);
    theSaveDialog.Width:=600;
    theSaveDialog.Height:=450;
    theSaveDialog.DefaultExt:='xml';

    RecentSaveFileAsDir:=DMMain.LoadValueFromSettingsIniFile('RecentDirectories', 'RecentSaveFileAsDir', '');
    if(Not(DirectoryExists(RecentSaveFileAsDir)))then
      RecentSaveFileAsDir:='';

    theSaveDialog.InitialDir:=RecentSaveFileAsDir;

    theSaveDialog.Filter:=DMMain.GetTranslatedMessage('DB-Model files', 196)+' (*.xml)|*.xml';

    if(theSaveDialog.Execute)then
    begin
      theFileName:=theSaveDialog.Filename;
      if(FileExists(theFileName))then
        if(MessageDlg(DMMain.GetTranslatedMessage(
          'The file [%s] already exists. '#13#10+
          'Do you want to overwrite this file?', 197, ExtractFileName(theFileName)),
          mtInformation, [mbYes, mbNo], 0)=mrNo)then
          Exit;

      //Set Model Name is it is Noname
      if(Copy(EERModel.GetModelName, 1, 6)='Noname')then
        EERModel.SetModelName(Copy(ExtractFileName(theFileName), 1, Length(ExtractFileName(theFileName))-Length(ExtractFileExt(theFileName))));

      EERModel.ModelFilename:=theFileName;
      EERModel.SaveToFile(theFileName);
      {Caption:='DB Model | '+ExtractFileName(theFileName);
      theFormMenuItem.Caption:=EERModel.GetModelName;}

      //Add file to recent file list
      sendCLXEvent(Application.MainForm.Handle, QCustomEvent_create(QEventType_AddToRecentFileList, PChar(theFileName)));

      RecentSaveFileAsDir:=ExtractFilePath(theSaveDialog.FileName);

      EERModel.IsChanged:=False;

      DMEER.RefreshSavedImg;

      SaveAs:=True;

      DMMain.SaveValueInSettingsIniFile('RecentDirectories', 'RecentSaveFileAsDir', RecentSaveFileAsDir);

      s:=DMMain.GetTranslatedMessage('The model was successfully saved to %s.', 198, theFileName);
      sendCLXEvent(Application.MainForm.Handle, QCustomEvent_create(QEventType_SetStatusCaption, PChar(s)));
    end;
  finally
    theSaveDialog.Free;
  end;
end;

end.

⌨️ 快捷键说明

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