unit FXQDManagerUnit; interface uses Classes, Windows, ScProjectManager, ConstVarUnit, FileOprUnit, ADODB, Provider, DBClient, CommonIntfUnit; type TConfigFileManager = class(TInterfacedObject, IFileManager) private FFileList : TStrings; { TODO : FFileFlag = 1: 表示分项清单, 2: 表示工程量清单 } FFileFlag : Integer; FFileDir : string; procedure LoadFromFile(const aFileName: string); procedure SaveToFile(const aFileName: string); public constructor Create; destructor Destroy; override; procedure AddFile(const aFileName: string); procedure DeleteFile(const aFileName: string); procedure RenameFile(const aOldFileName, aNewFileName: string); procedure AddLibsTo(aLibs, aLibFiles: TStrings; aFileFlag: Integer); property Libs: TStrings read FFileList; end; TFXQDManager = class(TInterfacedObject, IFileManager) private FFileDir : string; FFileOpr : TFileOpr; FConfigFileManager : TConfigFileManager; FProjectManager : TProjectManager; FConnection : TADOConnection; FBillsTable : TADOTable; FDrawTable : TADOTable; function GenerateTemplateName: string; { TODO : aLibName is a ShortFileName } function CreateNewLib(const aLibName: string): string; { TODO : aLibName is a FullFileName } procedure OpenLib(const aLibName: string); procedure WriteBills; procedure WriteDrawingQty; procedure Write; procedure Save; procedure Close; procedure LoadFromFile(const aFileName: string); procedure SaveToFile(const aFileName: string); function GetFileFlag: Integer; procedure SetFileFlag(const Value: Integer); public constructor Create(aProjectManager: TProjectManager); destructor Destroy; override; function CheckLibExists(const aShortName: string): Boolean; function GenerateLibName(const aShortName: string): string; { the Params are all shortNames } procedure AddFile(const aLibName: string); procedure DeleteFile(const aLibName: string); procedure RenameFile(const aOldLibName, aNewLibName: string); procedure ImportLib(const aOldLibName, aNewLibName: string); procedure ExportLib(const aOldLibName, aNewLibName: string); property FileFlag: Integer read GetFileFlag write SetFileFlag; property ConfigFileManager: TConfigFileManager read FConfigFileManager; end; implementation uses SysUtils, DataBase, DB; { TFXQDManager } procedure TConfigFileManager.AddFile(const aFileName: string); begin FFileList.Add(Format('%d.%s', [FFileFlag, aFileName])); end; procedure TConfigFileManager.AddLibsTo(aLibs, aLibFiles: TStrings; aFileFlag: Integer); var I: Integer; sLib: string; sHead: string; begin sHead := IntToStr(FFileFlag) + '.'; for I := 0 to FFileList.Count - 1 do begin sLib := FFileList[I]; if Pos(sHead, sLib) = 1 then begin sLib := Copy(sLib, Pos('.', sLib) + 1, Length(sLib)); aLibs.Add(sLib); sLib := Format('%sStdLibs\%s.dat', [FFileDir, sLib]); aLibFiles.Add(sLib); end; end; end; constructor TConfigFileManager.Create; begin FFileFlag := 1; FFileList := TStringList.Create; end; procedure TConfigFileManager.DeleteFile(const aFileName: string); var iIdx: Integer; begin iIdx := FFileList.IndexOf(Format('%d.%s', [FFileFlag, aFileName])); if iIdx > -1 then FFileList.Delete(iIdx); end; destructor TConfigFileManager.Destroy; begin FFileList.Free; inherited; end; procedure TConfigFileManager.LoadFromFile(const aFileName: string); begin if FileExists(aFileName) then FFileList.LoadFromFile(aFileName) else FFileList.Clear; end; procedure TConfigFileManager.RenameFile(const aOldFileName, aNewFileName: string); var iIdx: Integer; begin iIdx := FFileList.IndexOf(Format('%d.%s', [FFileFlag, aOldFileName])); if iIdx > -1 then FFileList[iIdx] := Format('%d.%s', [FFileFlag, aNewFileName]); end; procedure TConfigFileManager.SaveToFile(const aFileName: string); begin FFileList.SaveToFile(aFileName); end; procedure TFXQDManager.WriteBills; begin with FProjectManager.ActiveProject.BillsData do begin cdsBills.First; while not cdsBills.Eof do begin { Value 和 AsString 产生的结果不一样!!! } { 为安全起见,最好还是用 AsString 吧 } // slist.Add(cdsBillsCode.Value + ' <----> ' + cdsBillsB_Code.Value); // slist.Add(cdsBillsCode.AsString + ' <----> ' + cdsBillsB_Code.AsString); FBillsTable.Append; FBillsTable.FieldByName(SID).AsInteger := cdsBillsID.AsInteger; FBillsTable.FieldByName(sParentID).AsInteger := cdsBillsParentID.AsInteger; FBillsTable.FieldByName('NextID').AsInteger := cdsBillsNextSiblingID.AsInteger; FBillsTable.FieldByName(sCode).AsString := cdsBillsCode.AsString; FBillsTable.FieldByName(sB_Code).AsString := cdsBillsB_Code.AsString; FBillsTable.FieldByName(sName).AsString := cdsBillsName.AsString; FBillsTable.FieldByName('Unit').AsString := cdsBillsUnits.AsString; if cdsBillsID.Value < 100 then FBillsTable.FieldByName('StaticID').AsInteger := cdsBillsID.AsInteger; FBillsTable.FieldByName(sMemoStr).AsString := cdsBillsMemoStr.AsString; FBillsTable.Post; cdsBills.Next; end; end; end; procedure TFXQDManager.WriteDrawingQty; begin with FProjectManager.ActiveProject.BillsData do begin cdsDrawingQuantity.First; while not cdsDrawingQuantity.Eof do begin FDrawTable.Append; FDrawTable.FieldByName(SID).AsInteger := cdsDrawingQuantityID.AsInteger; FDrawTable.FieldByName(sName).AsString := cdsDrawingQuantityName.AsString; FDrawTable.FieldByName(sUnits).AsString := cdsDrawingQuantityUnits.AsString; FDrawTable.FieldByName(sDesignQuantity).AsFloat := cdsDrawingQuantityDQuantity1.AsFloat; FDrawTable.FieldByName(sDesignQuantity2).AsFloat := cdsDrawingQuantityDQuantity2.AsFloat; FDrawTable.FieldByName(sMemoStr).AsString := cdsDrawingQuantityMemoContext.AsString; FDrawTable.FieldByName(sBillsID).AsInteger := cdsDrawingQuantityBillsID.AsInteger; FDrawTable.Post; cdsDrawingQuantity.Next; end; end; end; { TFXQDManager } procedure TFXQDManager.AddFile(const aLibName: string); var sNewFileName: string; begin sNewFileName := CreateNewLib(aLibName); if sNewFileName = '' then Exit; FConfigFileManager.AddFile(aLibName); OpenLib(sNewFileName); Write; Save; Close; end; function TFXQDManager.CheckLibExists(const aShortName: string): Boolean; var sLibName: string; begin sLibName := GenerateLibName(aShortName); Result := FFileOpr.FileExists(sLibName); end; procedure TFXQDManager.Close; begin FConnection.Close; end; constructor TFXQDManager.Create(aProjectManager: TProjectManager); begin FFileOpr := TFileOpr.Create; FFileDir := FFileOpr.ExtractFilePath(ParamStr(0)); FProjectManager := aProjectManager; FConnection := TADOConnection.Create(nil); FConnection.LoginPrompt := False; FBillsTable := TADOTable.Create(nil); FDrawTable := TADOTable.Create(nil); FConfigFileManager := TConfigFileManager.Create; FConfigFileManager.FFileDir := FFileDir; LoadFromFile({$I StdLibs.inc}); end; function TFXQDManager.CreateNewLib(const aLibName: string): string; var sTemplateName: string; begin Result := GenerateLibName(aLibName); sTemplateName := GenerateTemplateName; if not FFileOpr.CopyFile(sTemplateName, Result) then Result := ''; end; procedure TFXQDManager.DeleteFile(const aLibName: string); var sLibName: string; begin sLibName := GenerateLibName(aLibName); FFileOpr.DeleteFile(sLibName); FConfigFileManager.DeleteFile(aLibName); Save; end; destructor TFXQDManager.Destroy; begin FConnection.Free; FBillsTable.Free; FDrawTable.Free; FFileOpr.Free; FConfigFileManager.Free; inherited; end; procedure TFXQDManager.ExportLib(const aOldLibName, aNewLibName: string); begin FFileOpr.CopyFile(aOldLibName, aNewLibName); Save; end; function TFXQDManager.GenerateLibName(const aShortName: string): string; begin Result := Format('%sStdLibs\%s.dat', [FFileDir, aShortName]); end; function TFXQDManager.GenerateTemplateName: string; begin if FileFlag = 1 then Result := Format('%sData\%s', [FFileDir, FXTemplateFile]) else Result := ''; end; function TFXQDManager.GetFileFlag: Integer; begin Result := FConfigFileManager.FFileFlag; end; procedure TFXQDManager.ImportLib(const aOldLibName, aNewLibName: string); var sNewLibName: string; begin sNewLibName := GenerateLibName(aNewLibName); FFileOpr.CopyFile(aOldLibName, sNewLibName); FConfigFileManager.AddFile(aNewLibName); Save; end; procedure TFXQDManager.LoadFromFile(const aFileName: string); begin FConfigFileManager.LoadFromFile(aFileName); end; procedure TFXQDManager.OpenLib(const aLibName: string); begin FConnection.ConnectionString := Format(SAdoConnectStr, [aLibName, 'Admin', '']); FConnection.Open; FBillsTable.Connection := FConnection; FDrawTable.Connection := FConnection; FBillsTable.TableName := 'BillsTree'; FDrawTable.TableName := 'DrawingQuantity'; FBillsTable.Active := True; if FileFlag = 1 then FDrawTable.Active := True; end; procedure TFXQDManager.RenameFile(const aOldLibName, aNewLibName: string); var sOldLibName: string; sNewLibName: string; begin sOldLibName := GenerateLibName(aOldLibName); sNewLibName := GenerateLibName(aNewLibName); FFileOpr.RenameFile(sOldLibName, sNewLibName); FConfigFileManager.RenameFile(aOldLibName, aNewLibName); Save; end; procedure TFXQDManager.Save; begin SaveToFile({$I StdLibs.inc}); end; procedure TFXQDManager.SaveToFile(const aFileName: string); begin FConfigFileManager.SaveToFile(aFileName); end; procedure TFXQDManager.SetFileFlag(const Value: Integer); begin FConfigFileManager.FFileFlag := Value; end; procedure TFXQDManager.Write; begin WriteBills; if FileFlag = 1 then WriteDrawingQty; end; end.