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

📄 eermodel.pas

📁 DBDesigner 4 is a database design system that integrates database design, modelling, creation and ma
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit EERModel;

//----------------------------------------------------------------------------------------------------------------------
//
// This file is part of fabFORCE DBDesigner4.
// Copyright (C) 2002, 2003 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 EERModel.pas
// -----------------
// Version 2.2, 01.08.2003, Mike
// Description
//   Contains all classes for the EERModel
//
// Changes:
//   Version 2.2, 01.08.2003, Mike
//     New XML Parser
//   Version 2.1, 03.05.2003, Mike
//     Constraint object mode when user holds shift
//     Apply datatype and Options to FK columns when Source Key was changed
//   Version 2.0, 18.04.2003, Mike
//     Changed all Records to TObjects.
//   Version 1.9, 15.04.2003, Mike
//     Included automatic fix of ENUM/SET datatype defs when loaded from model / inifile
//   Version 1.8, 11.04.2003, Mike
//     1.6 was buggy again, now FK References fixed for MySQL4.0 INNODB,
//     added FKPrefix, FKPostfix
//     added TEER_Datatype.EditParamsAsString to support ENUM and SET datatypes
//   Version 1.7, 08.04.2003, Mike
//     Changed initial RefDef to NoAction for OnDelete/OnUpdate
//   Version 1.6, 08.04.2003, Mike
//     Fixed bug in TEERTable.GetSQLCreateCode, FK References were created
//     using a wrong syntax
//   Version 1.5, 04.04.2003, Mike / Shannon Weyrick
//     Added TableNameInRefs param and functionality
//     Get default settings for PositionGrid and TableNameInRefs from DMEER
//   Version 1.4, 28.03.2003, Mike
//     Added PositionGrid Parameters to model and implemtented functionality
//     Store and Load PositionGrid Parameters
//   Version 1.3, 25.03.2003, Mike
//     Changes TEERImage.SetXML and TEERImage.GetXML to support new
//     Encoding/Decoding functions in DMMain using a memory stream
//   Version 1.2, 21.03.2003, Mike
//     EERModel.LoadFromFile: When getting MaxID of the model,
//       ColumnIDs and IndexIDs were ignored - fixed.
//   Version 1.1, 20.03.2003, Mike
//     added PrevTableName for DBSync (rename table cmds)
//     Indices now store the IndexColumn parmeter length (for blob fields)
//     Added AddToLog parameter for DeleteSelectedObjs and change call in
//       EERModel LoadFromFile
//   Version 1.0, 13.03.2003, Mike
//     initial version, Mike
//
//----------------------------------------------------------------------------------------------------------------------

{$I DBDesigner4.inc}

interface

uses
  SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
  QStdCtrls, QExtCtrls, QImgList, QMenus, QTypes, IniFiles, Math, StrUtils,
  QPrinters, QClipbrd, QComCtrls, Qt,
  {$IFDEF USE_IXMLDBMODELType}
  XMLDoc,
  EERModel_XML,
  {$ENDIF}
  Contnrs,
  LibXmlParser;

type
  TEERObject = (EERAllObjects, EERNote, EERRegion, EERRelation, EERTable, EERImage, EERStoredProc);
  TEERObjectSet = set of TEERObject;

  TEERObjectAlign = (EERObjAlignLeft, EERObjAlignRight, EERObjAlignTop, EERObjAlignBottom, EERObjAlignCenterH, EERObjAlignCenterV, EERObjAlignDistributeH, EERObjAlignDistributeV);

  //-----------------------------------------------
  TEERPluginData  = class(TPersistent)
    constructor Create(AOwner: TComponent); overload;
    destructor Destroy; override;
  public
    Owner: TComponent;

    PluginName: string;       // Name of the Plugin which stored the Data
    Obj_id: integer;          // ID of the Object the Data is related to, <0 if non
    Params: TStringList;      // Stringlist which stores the values
    Data: Pointer;            // Additional binary data (NOTE: the data is
                              // not stored, for temporary use only)
  end;

  TEERLinkedModel  = class(TPersistent)
    constructor Create(AOwner: TComponent); overload;
  public
    Owner: TComponent;

    IDLinkedModel: integer;

    ModelName: string;
    IDModel: integer;

    IsStoredInDB: Boolean;
    ModelFilename: string;
    DriverName, DBConnName, HostCaption,
    HostName, Database, User: string;
  end;

  // -----------------------------------------------
  // Declaration of the MAIN-Class

  TEERModel = class(TPanel)
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    //Load initial Datatypes from ini-file
    procedure LoadDataTypesFromIniFile;

    //Paint Model function
    procedure PaintModel(theCanvas: TCanvas; theZoomfac: double = -1;
      x: integer = 0; y: integer = 0; w: integer = 0; h: integer = 0;
      Objs2Paint: TEERObjectSet = [EERAllObjects];
      theDPI: integer = 72; doDrawText: Boolean = True);
    procedure PaintModelToImage(ModelBmp: TBitmap; PaintSelectedOnly: Boolean = False);
    procedure DrawRelIcon(theCanvas: TCanvas; theRect: TRect; theBmpNr: integer);

    //Place new Objects
    function NewTable(x, y: integer; LogTheAction: Boolean): Pointer;
    function NewRelation(RelationKind: integer;
      theSrcTable, theDestTable: Pointer; LogTheAction: Boolean; FKColumnName: string = ''): Pointer;
    function NewNote(x, y: integer; LogTheAction: Boolean): Pointer;
    function NewRegion(x, y, w, h: integer; LogTheAction: Boolean): Pointer;
    procedure SendRegionsToBack;
    function NewImage(x, y, w, h: integer; LogTheAction: Boolean): Pointer;

    //Set, Get ModelName
    procedure SetModelName(name: string);
    function GetModelName: string;


    //Set Model changed
    procedure ModelHasChanged;

    //Zoom Functions
    procedure SetZoomFac(NewZoomFac: double;  X: integer = -1; Y: integer = -1);
    function GetZoomFac: double;
    procedure ZoomIn(x, y: integer);
    procedure ZoomOut(x, y: integer);
    //Calculate a value by the Zoom Factor
    function EvalZoomFac(thevalue: integer): integer;
    function ReEvalZoomFac(thevalue: integer): integer;
    //PositionMarker functions
    procedure SetPositionMarker(nr: integer);
    procedure GotoPositionMarker(nr: integer);

    //Font functions
    function GetFontHeight: integer;
    function GetTextExtent(s: string): TSize;

    //Load the reserved word list
    procedure LoadReservedWordsFromIniFile;
    //Check Functions
    function CheckReservedWord(s: string): Boolean;
    procedure CheckAllRelations;

    //Load and store functions
    procedure SaveToFile(fname: string; WriteSettings: Boolean = True;
      OnlySelected: Boolean = False; UpdateModelFileName: Boolean = True);
    procedure LoadFromFile(fname: string; ReadSettings: Boolean = True; SelectObjs: Boolean = False; MoveToSavedPosition: Boolean = True; AddDataToExistingModel: Boolean = True);
    procedure LoadFromFile2(fname: string; ReadSettings: Boolean = True; SelectObjs: Boolean = False; MoveToSavedPosition: Boolean = True; AddDataToExistingModel: Boolean = True);

    //Selection Functions
    function GetSelectedObjsCount: integer;
    function GetFirstSelectedObj: TObject;
    procedure SelectAllObjs;
    procedure DeSelectAllObjs(ExcludeObj: TObject);
    procedure DeleteSelectedObjs(AddToLog: Boolean = True);
    //Aligns Selected Objs
    procedure AlignSelectedObjs(alignPos: TEERObjectAlign);

    //Refresh Functions
    procedure Refresh;
    procedure RefreshFont;
    procedure RefreshTblImgs;

    //Action functions
    procedure LogAction(ActionType, Obj_id: integer; Params: String);
    procedure StartSubActionLog(ActionType: integer);
    procedure LogSubAction(ActionSubType, Obj_id: integer; Params: String);
    procedure EndSubAction;
    procedure DeleteAction(theActionPointer: Pointer);
    procedure DeleteOpenAction;
    procedure UndoActions(TillAction: integer);
    procedure RedoActions(TillAction: integer);
    function GetActionName(ActionType: integer): string;
    function GetSubActionOfObj(ActionIndex, Obj_id: integer): Pointer;

    //Datatype functions
    function GetDataTypeName(id: integer): string;
    function GetDataTypeGroup(id: integer): integer;
    function GetDataType(id: integer): Pointer;
    function GetDataTypeByName(name: string): Pointer;
    function GetDataTypeByNameSubst(DatatypeName: string; DatatypeSubstList: TStringList): Pointer;

    //MouseOverObj functions
    procedure SetMouseOverObj(Obj: TObject; SubObj: Pointer);
    procedure ClearMouseOverObj;
    function GetMouseOverObj: TObject;
    function GetMouseOverSubObj: Pointer;

    //Plugin functions
    function GetPluginDataCount(PluginName: string): integer;
    function GetPluginDataByIndex(PluginName: string; Index: integer): TEERPluginData;
    function GetPluginDataByID(PluginName: string; ID: integer): TEERPluginData;
    function AddPluginData(PluginName: string; ID: integer): TEERPluginData;

    //EERObj List functions
    function GetEERObjectCount(ObjType: TEERObjectSet): integer;
    procedure GetEERObjectNameList(ObjType: TEERObjectSet; ObjectnamesList: TStringList; OnlySelected: Boolean=False);
    procedure GetEERObjectList(ObjType: TEERObjectSet; ObjectList: TList; OnlySelected: Boolean=False);
    procedure SortEERObjectListByObjName(ObjectList: TList);
    procedure SortEERObjectListByOrderPos(ObjectList: TList);

    //EERObj functions
    function GetEERObjectByID(id: integer): Pointer;
    function GetEERObjectByLinkedID(id: integer): Pointer;
    function GetEERObjectByIndex(ObjType: TEERObject; Index: integer): Pointer;
    function GetEERObjectByName(ObjType: TEERObject; Name: string): Pointer;
    function GetEERObjectClassName(ObjType: TEERObject): string;

    //EERTable functions
    function GetEERTableByColumnID(id: integer): Pointer;
    function GetEERIndexByID(id: integer): Pointer;
    //sorts all tables in the given list by the FK Reference
    //so the tables can be created / dropped in the correct order
    procedure SortEERTableListByForeignKeyReferences(EERTableList: TList);

    //StoredSQLCmd functions
    function GetStoredSQLCmdIndex(SQLCmdType: integer; StoredPosition: string): integer;

    procedure MoveSelectedEERObjects(x, y: integer);

    function GetNextIDPlacedModel: integer;
    function GetPlacedModelByID(id: integer): TEERLinkedModel;
  protected
    //Handle to Mouse Events
    procedure DoMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure DoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure DoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

    procedure MouseEnter(AControl: TControl); override;
    procedure MouseLeave(AControl: TControl); override;

    //Load needed images
    procedure AddImgToPopupImgList(fname: string);
    procedure LoadModelBitmaps;

    //CheckHelp Function
    procedure CheckRelations(Tbl2Refresh: TList);

    //Selection Rect functions
    procedure DoSelectionRectPaint(Sender: TObject);
    procedure SetSelectionRectPos(l, t, w, h: integer);
    procedure GetSelectionRectPos(var selRect: TRect);
    function GetSelectionRectVisible: Boolean;
    procedure HideSelectionRect;
    procedure SelectObjsInSelectionRect;

    //Paint grid Box --> needs to be replaced
    procedure DoGridPaintBoxPaint(Sender: TObject);

    //Decode Datatypes ini-file data
    procedure DecodeDataTypes(s: string; p: Pointer);

    //Help function to move all selected objects
    procedure InitialMove4AllSelectedObjs(Obj: TObject);

    //Popup Menu functions
    procedure CreatePopupMenus(AOwner: TComponent);
    function GetGeneralObjPopupMenu(AOwner: TComponent; nr: integer): TPopupMenu;
    function GetThePopupComponent(Sender: TObject): TComponent;

    //Popup events
    procedure PopupMenuSelectObj(Sender: TObject);
    procedure PopupMenuEditObj(Sender: TObject);
    procedure PopupMenuRefreshObj(Sender: TObject);
    procedure PopupMenuDeleteObj(Sender: TObject);
    procedure PopupMenuAlignObjs(Sender: TObject);
    procedure PopupMenuCopyTableName(Sender: TObject);
    procedure PopupMenuCopyTableFieldName(Sender: TObject);
    procedure PopupMenuCopyTableFieldNameShow(Sender: TObject);
    procedure PopupMenuCopyTableFields(Sender: TObject);
    procedure PopupMenuCopyTableSQLCreate(Sender: TObject);
    procedure PopupMenuCopyTableSQLDrop(Sender: TObject);
    procedure PopupMenuCopyTableSQLInsert(Sender: TObject);
    procedure PopupMenuSelectRegion(Sender: TObject);
    procedure PopupMenuEditTable(Sender: TObject);
  private
    { Private declarations }
    ModelName: string;

    //The current Zoom factor of the EER Model (start @ 100%)
    ZoomFac: double;

    //Vars for MouseAction
    mouse_posx, mouse_posy, mouse_absx, mouse_absy: integer;
    MouseIsDown: Boolean;

    //Counter for new Tables (Table01)
    NewTableCounter, NewRelCounter,
    NewNoteCounter, NewRegionCounter,
    NewImageCounter,
    LastRegionColor: integer;

    TblHeaderBmp, TblHeaderRightBmp,
    TblHeaderLinkedBmp, TblHeaderRightLinkedBmp,
    FieldBmp, FieldKeyBmp,
    IndexBmp,
    Field_FKBmp,
    Index_FKBmp: TBitmap;

    //Rel_Bmp: Array[0..11] of TBitmap;
    PopUpMenuImgs: TImageList;

    RelIconSize, RelIconDSize: integer;

    //Selection PaintBox
    SelectionRect: TPaintBox;

    MouseOverObj: TObject;
    MouseOverSubObj: Pointer;

    DisableModelRefresh: Boolean;

    //Reserved Words
    ReservedWords: TStringList;
  public
    { Public declarations }

    //Name and comments
    ModelComments: string;

    //Model File Name
    ModelFilename: string;

    //Database type
    DatabaseType: string;

    //Model
    EERModel_Width: integer;
    EERModel_Height: integer;

    //Table Prefixes
    DefaultTablePrefix: integer;
    TablePrefix: TStringList;

    //Datatypes
    DatatypeGroups: TObjectList;
    Datatypes: TObjectList;
    DefaultDataType: integer;
    CommonDataType: TStringList;

    //Default Database-Connections for the diff. functions
    DefSyncDBConn,
    DefSaveDBConn,
    DefQueryDBConn: string;

    //Flags
    UseVersionHistroy,
    AutoIncVersion,
    IsChanged,
    Need2RefreshNavImg,
    LogActions: Boolean;

    //Model Version Control
    IDModel,
    IDVersion: integer;
    VersionStr: string;

    //Temporary store the two tables for a relation
    Rel_SrcTable, Rel_DestTable: TObject;

    //Grid PaintBox
    GridPaintBox: TPaintBox;

    //Size of a Page which will be printed on the printer's canvas
    ModelPrinter: string;
    PageSize: TSize;
    PageAspectRatio,
    HPageCount,
    VPageCount: double;
    PageOrientation: TPrinterOrientation;
    PageFormat: string;
    SelectedPages: Array[0..200] of Boolean;
    //DPI of the canvas to draw on
    DPI: integer;

    //Default Model font
    DefModelFont: string;

    //Indicates wether the Model is drawn to a special canvas

⌨️ 快捷键说明

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