📄 eerplacemodel.pas
字号:
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 + -