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

📄 eerplacemodel.pas

📁 功能强大的ER图建模工具的源代码。 可以代替ERWin了
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      if(TObject(LMTreeView.Selected.Data) is TEERLinkedModel)then
        if(LinkedFromFileRBtn.Checked)and(FilenameEd.Enabled)then
        begin
          TEERLinkedModel(LMTreeView.Selected.Data).ModelFilename:=
            FilenameEd.Text;
        end
        else if(LinkedFromDBRBtn.Checked)and(DBConnEd.Enabled)then
        begin
          TEERLinkedModel(LMTreeView.Selected.Data).DBConnName:=DBConnEd.Text;
          if(DriverNameCBox.ItemIndex>-1)then
            TEERLinkedModel(LMTreeView.Selected.Data).DriverName:=DriverNameCBox.Items[DriverNameCBox.ItemIndex]
          else
            TEERLinkedModel(LMTreeView.Selected.Data).DriverName:='';
          TEERLinkedModel(LMTreeView.Selected.Data).HostCaption:=HostEd.Text;
          TEERLinkedModel(LMTreeView.Selected.Data).HostName:=IPEd.Text;
          TEERLinkedModel(LMTreeView.Selected.Data).Database:=DBEd.Text;
          TEERLinkedModel(LMTreeView.Selected.Data).IDModel:=StrToInt(ModelIDEd.Text);
          TEERLinkedModel(LMTreeView.Selected.Data).User:=UserEd.Text;
        end;
end;

procedure TEERPlaceModelForm.LMTreeViewChange(Sender: TObject;
  Node: TTreeNode);
begin
  RefreshLinkedModelSettings;
end;

procedure TEERPlaceModelForm.LinkedFromFileRBtnClick(Sender: TObject);
begin
  if(LMTreeView.Selected<>nil)then
    if(LMTreeView.Selected.Data<>nil)then
      if(TObject(LMTreeView.Selected.Data) is TEERLinkedModel)then
      begin
        TEERLinkedModel(LMTreeView.Selected.Data).IsStoredInDB:=
          LinkedFromDBRBtn.Checked;

        RefreshLinkedModelSettings;
      end;
end;

procedure TEERPlaceModelForm.LMTreeViewChanging(Sender: TObject;
  Node: TTreeNode; var AllowChange: Boolean);
begin
  ApplyLinkedModelSettings;
end;

procedure TEERPlaceModelForm.RefreshLinkedModel(EERModel: TEERModel; IDLinkedModel: integer = -1);
var i: integer;
begin
  self.EERModel:=EERModel;

  //Refresh Linked Model with given ID
  if(IDLinkedModel>-1)then
    RefreshLinkedModelByID(IDLinkedModel)
  else
    //Refresh all Linked Models
    for i:=0 to EERModel.LinkedModels.Count-1 do
      RefreshLinkedModelByID(TEERLinkedModel(EERModel.LinkedModels[i]).IDLinkedModel);
end;

procedure TEERPlaceModelForm.RefreshLinkedModelByID(IDLinkedModel: integer);
var theLinkedModel: TEERLinkedModel;
  s, fname: string;
  i, j, Obj_id: integer;
  x, y, w, h: integer;
  theObj, theLinkedObj: TEERObj;
  MessageResult: Integer;

  tmpRelStart, tmpRelEnd: TList;
  tmpRel: Array [1..4] of TList;

  theSrcTable, theDestTable: TEERTable;

  theDBConn: TDBConn;

  EERStoreInDatabaseForm: TEERStoreInDatabaseForm;
begin
  theLinkedModel:=EERModel.GetPlacedModelByID(IDLinkedModel);
  if(theLinkedModel<>nil)then
  begin
    // ---------------------------------------------
    // Load the Linked Model

    if(theLinkedModel.IsStoredInDB)then
      s:=theLinkedModel.Database+'@'+theLinkedModel.HostCaption
    else
      s:=theLinkedModel.ModelFilename;

    DMGUI.SetStatusCaption(DMMain.GetTranslatedMessage(
      'Refresh Linked Objects from Model [%s] stored in [%s].', 249,
      theLinkedModel.ModelName, s));

    if(Model2Place<>nil)then
      Model2Place.Free;

    Model2Place:=TEERModel.Create(self);

    //Load Linked Model from File
    if(Not(theLinkedModel.IsStoredInDB))then
    begin
      ChDir(ExtractFilePath(Application.ExeName));
      fname:=ExpandFileName(theLinkedModel.ModelFilename);

      if(Not(FileExists(fname)))then
      begin
        if(MessageDlg(DMMain.GetTranslatedMessage('The Linked Model %s could not be found at the stored position.\n'+
          'Filename: %s\n\n'+
          'Do you want to select the file manually?', 246, theLinkedModel.Modelname, fname), mtError, [mbYes, mbNo], 0)=mrYes)then
        begin
          fname:=GetFileNameByOpenDialog;

          theLinkedModel.ModelFilename:=
            ExtractRelativePath(ExtractFilePath(Application.ExeName),
              fname);
        end
        else
          Exit;
      end;

      Model2Place.LoadFromFile2(fname);
    end
    else
    begin
      //Load Linked Model from DB

      //Check DBConn by Name
      theDBConn:=nil;
      for i:=0 to DMDB.DBConnections.Count-1 do
        if(CompareText(theLinkedModel.DBConnName,
            TDBConn(DMDB.DBConnections[i]).Name)=0)and
          (CompareText(theLinkedModel.DriverName,
            TDBConn(DMDB.DBConnections[i]).DriverName)=0)and
          (CompareText(theLinkedModel.HostName,
            TDBConn(DMDB.DBConnections[i]).Params.Values['HostName'])=0)and
          (CompareText(theLinkedModel.Database,
            TDBConn(DMDB.DBConnections[i]).Params.Values['Database'])=0)then
        begin
          theDBConn:=TDBConn(DMDB.DBConnections[i]);
          break;
        end;

      //If DBConn is not found, check for DBConn to same DB
      // with different DBConn Name
      if(theDBConn=nil)then
        for i:=0 to DMDB.DBConnections.Count-1 do
          if(CompareText(theLinkedModel.DriverName,
              TDBConn(DMDB.DBConnections[i]).DriverName)=0)and
            (CompareText(theLinkedModel.HostName,
            TDBConn(DMDB.DBConnections[i]).Params.Values['HostName'])=0)and
          (CompareText(theLinkedModel.Database,
            TDBConn(DMDB.DBConnections[i]).Params.Values['Database'])=0)then
          begin
            theDBConn:=TDBConn(DMDB.DBConnections[i]);
            break;
          end;

      EERStoreInDatabaseForm:=TEERStoreInDatabaseForm.Create(self);
      try
        if(EERStoreInDatabaseForm.SetData(Model2Place, False, theDBConn))then
        begin
          //Select Model in Database by ID
          for i:=0 to EERStoreInDatabaseForm.SavedModelsTV.Items.Count-1 do
            if(EERStoreInDatabaseForm.SavedModelsTV.Items[i].SubItems[3]=IntToStr(theLinkedModel.IDModel))then
            begin
              EERStoreInDatabaseForm.SavedModelsTV.Selected:=EERStoreInDatabaseForm.SavedModelsTV.Items[i];
              break;
            end;

          //If the model is found by ID, open it
          if(EERStoreInDatabaseForm.SavedModelsTV.Selected.SubItems[3]=IntToStr(theLinkedModel.IDModel))then
            EERStoreInDatabaseForm.SubmitBtnClick(self)
          else
            //Let the user choose the model
            if(EERStoreInDatabaseForm.ShowModal<>mrOK)then
              Exit;
        end
        else
          Exit;
      finally
        EERStoreInDatabaseForm.Free;
      end;
    end;

    Model2Place.ReadOnly:=True;

    // ---------------------------------------------
    //Refresh Objects

    tmpRelStart:=TList.Create;
    tmpRelEnd:=TList.Create;
    for j:=1 to 4 do
      tmpRel[j]:=TList.Create;

    try
      //All Objects except Relations
      i:=0;
      while(i<=EERModel.ComponentCount-1)do
      begin
        if(EERModel.Components[i].ClassParent=TEERObj)then
          if(TEERObj(EERModel.Components[i]).IsLinkedObject)and
            (TEERObj(EERModel.Components[i]).IDLinkedModel=theLinkedModel.IDLinkedModel)and
            (Not(TEERObj(EERModel.Components[i]) is TEERRel))then
          begin
            theObj:=TEERObj(EERModel.Components[i]);
            theLinkedObj:=Model2Place.GetEERObjectByID(TEERObj(EERModel.Components[i]).Obj_id_Linked);

            if(theLinkedObj<>nil)then
            begin
              //Store general Obj settings
              if(theObj.Classname=theLinkedObj.Classname)then
              begin
                Obj_id:=theObj.Obj_id;
                x:=theObj.Obj_X;
                y:=theObj.Obj_Y;
                w:=theObj.Obj_W;
                h:=theObj.Obj_H;

                if(theObj is TEERTable)then
                begin
                  //Store Relations Lists
                  tmpRelStart.Assign(TEERTable(theObj).RelStart);
                  tmpRelEnd.Assign(TEERTable(theObj).RelEnd);
                  for j:=1 to 4 do
                    tmpRel[j].Assign(TEERTable(theObj).Rel[j]);

                  TEERTable(theObj).Assign(TEERTable(theLinkedObj));

                  //Re-Store Relations Lists
                  TEERTable(theObj).RelStart.Assign(tmpRelStart);
                  TEERTable(theObj).RelEnd.Assign(tmpRelEnd);
                  for j:=1 to 4 do
                    TEERTable(theObj).Rel[j].Assign(tmpRel[j]);
                end
                else if(theObj is TEERRegion)then
                begin
                  TEERRegion(theObj).Assign(TEERRegion(theLinkedObj));
                end
                else if(theObj is TEERImage)then
                begin
                  TEERImage(theObj).Assign(TEERImage(theLinkedObj));
                end
                else if(theObj is TEERNote)then
                begin
                  TEERNote(theObj).Assign(TEERNote(theLinkedObj));
                end;

                //ReStore general Obj settings
                theObj.ParentEERModel:=EERModel;
                theObj.Parent:=EERModel;
                theObj.Obj_id:=Obj_id;
                theObj.Obj_X:=x;
                theObj.Obj_Y:=y;
                theObj.Obj_W:=w;
                theObj.Obj_H:=h;
                theObj.IsLinkedObject:=True;
                theObj.IDLinkedModel:=theLinkedModel.IDLinkedModel;
                theObj.Obj_id_Linked:=TEERObj(theLinkedObj).Obj_id;

                theObj.RefreshObj;
              end
              else
              begin
                //Object Type has wrong type, so ask for delete
                MessageResult:=MessageDlg(DMMain.GetTranslatedMessage(
                  'The Object %s has a different Type in the Linked Model\n'+
                  'Do you want to delete the Object or abort the Refresh?',
                  247, theObj.ObjName), mtConfirmation,
                  [mbYes, mbNo, mbAbort], 0);

                if(MessageResult=mrYes)then
                begin
                  TEERObj(EERModel.Components[i]).DeleteObj;

                  continue;
                end
                else if(MessageResult=mrAbort)then
                  Exit;
              end;
            end
            else
            begin
              //Object has been deleted
              TEERObj(EERModel.Components[i]).DeleteObj;
              continue;
            end;
          end;

        inc(i);
      end;

      //All Relations
      i:=0;
      while(i<=EERModel.ComponentCount-1)do
      begin
        if(EERModel.Components[i].ClassParent=TEERObj)then
          if(TEERObj(EERModel.Components[i]).IsLinkedObject)and
            (TEERObj(EERModel.Components[i]).IDLinkedModel=theLinkedModel.IDLinkedModel)and
            (TEERObj(EERModel.Components[i]) is TEERRel)then
          begin
            theObj:=TEERObj(EERModel.Components[i]);
            theLinkedObj:=Model2Place.GetEERObjectByID(TEERObj(EERModel.Components[i]).Obj_id_Linked);

            if(theLinkedObj<>nil)then
            begin
              theSrcTable:=EERModel.GetEERObjectByLinkedID(
                TEERRel(theLinkedObj).SrcTbl.Obj_id);
              theDestTable:=EERModel.GetEERObjectByLinkedID(
                TEERRel(theLinkedObj).DestTbl.Obj_id);

              //Only add Relation if source and dest table are in the model
              if(theSrcTable<>nil)and(theDestTable<>nil)then
              begin
                Obj_id:=theObj.Obj_id;
                x:=theObj.Obj_X;
                y:=theObj.Obj_Y;
                w:=theObj.Obj_W;
                h:=theObj.Obj_H;

                TEERRel(theObj).SrcTbl:=theSrcTable;
                TEERRel(theObj).DestTbl:=theDestTable;

                //ReStore general Obj settings
                theObj.ParentEERModel:=EERModel;
                theObj.Parent:=EERModel;
                theObj.Obj_id:=Obj_id;
                theObj.Obj_X:=x;
                theObj.Obj_Y:=y;
                theObj.Obj_W:=w;
                theObj.Obj_H:=h;
                theObj.IsLinkedObject:=True;
                theObj.IDLinkedModel:=theLinkedModel.IDLinkedModel;
                theObj.Obj_id_Linked:=TEERObj(theLinkedObj).Obj_id;

                theObj.RefreshObj;
              end
              else
              begin
                TEERObj(EERModel.Components[i]).DeleteObj;
                continue;
              end;
            end
            else
            begin
              //Object has been deleted
              TEERObj(EERModel.Components[i]).DeleteObj;
              continue;
            end;
          end;

        inc(i);
      end;
    finally
      tmpRelStart.Free;
      tmpRelEnd.Free;

      for j:=1 to 4 do
        tmpRel[j].Free;
    end;

    EERModel.ModelHasChanged;

    EERModel.Refresh;
  end;

  DMGUI.SetStatusCaption(DMMain.GetTranslatedMessage(
    'Linked Objects have been refreshed.', 250));
end;

end.

⌨️ 快捷键说明

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