unit bufdatasetdsgn; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DB, bufdataset, ComponentEditors, FieldsEditor, ObjInspStrConsts; Type { TBufDatasetDesignEditor } TBufDatasetDesignEditor = Class(TFieldsComponentEditor) FOffset : Integer; FDatasetNames: TStrings; private procedure GetDatasetNames(const S: string); Protected function GetProjectDir: String; virtual; Procedure CreateDataset(aBufDS : TCustomBufDataset); virtual; Procedure LoadDataFromFile(aBufDS : TCustomBufDataset); virtual; Procedure SaveDataToFile(aBufDS : TCustomBufDataset); virtual; procedure CopyFromDataset(aBufDS: TCustomBufDataset); virtual; Public constructor Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner); override; Destructor Destroy; override; function GetVerbCount: Integer; override; function GetVerb(Index: Integer): string; override; procedure ExecuteVerb(Index: Integer); override; end; implementation Uses TypInfo, Forms, Dialogs, LazIDEintf, selectdatasetdlg; { TBufDatasetDesignEditor } procedure TBufDatasetDesignEditor.CreateDataset(aBufDS: TCustomBufDataset); begin if aBufDs.Active then ShowMessage(lrsDatasetActive) else aBufDS.CreateDataset; Modified; end; procedure TBufDatasetDesignEditor.GetDatasetNames(const S: string); begin FDatasetNames.Add(S); end; function TBufDatasetDesignEditor.GetProjectDir: String; begin If Assigned(LazarusIDE) and Assigned(LazarusIDE.ActiveProject) then Result:= LazarusIDE.ActiveProject.Directory else Result:=GetUserDir; end; procedure TBufDatasetDesignEditor.LoadDataFromFile(aBufDS: TCustomBufDataset); Var Dlg : TOpenDialog; begin Dlg:=TOpenDialog.Create(Application); try Dlg.InitialDir:=GetProjectDir; Dlg.Title:=lrsSelectDataFileName; Dlg.Filter:=lrsBufDSFilters; Dlg.Options:=Dlg.Options+[ofFileMustExist]; if Dlg.Execute then begin aBufDS.LoadFromFile(Dlg.FileName); Modified; end; finally Dlg.Free; end; end; procedure TBufDatasetDesignEditor.SaveDataToFile(aBufDS: TCustomBufDataset); Var Dlg : TOpenDialog; begin Dlg:=TSaveDialog.Create(Application); try Dlg.InitialDir:=GetProjectDir; Dlg.Title:=lrsProvideDataFileName; Dlg.Filter:=lrsBufDSFilters; Dlg.Options:=Dlg.Options+[ofPathMustExist]; if Dlg.Execute then begin aBufDS.LoadFromFile(Dlg.FileName); Modified; end; finally Dlg.Free; end; end; procedure TBufDatasetDesignEditor.CopyFromDataset(aBufDS : TCustomBufDataset); Var Idx : Integer; aDatasetName : string; aSrc : TDataset; begin if not Assigned(Designer.PropertyEditorHook) then exit; FreeAndNil(FDatasetNames); // Free previous instance if any FDatasetNames:=TStringList.Create; Designer.PropertyEditorHook.GetComponentNames(GetTypeData(TypeInfo(TDataset)),@GetDatasetNames); Idx:=FDatasetNames.IndexOf(aBufDS.Name); if Idx<>-1 then FDatasetNames.Delete(Idx); if FDatasetNames.Count=0 then begin ShowMessage(lrsNoDatasetsAvailableForCopy); exit; end; aDatasetName:=SelectDataset(FDatasetNames); if aDatasetName='' then exit; aSrc:=TDataset(Designer.PropertyEditorHook.GetComponent(aDatasetName)); if not assigned(aSrc) then exit; aSrc.Active:=True; aBufDS.CopyFromDataset(aSrc,True); Modified; end; constructor TBufDatasetDesignEditor.Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner); begin inherited Create(AComponent, ADesigner); FOffset:=Inherited GetVerbCount; end; destructor TBufDatasetDesignEditor.Destroy; begin FreeAndNil(FDatasetNames); inherited Destroy; end; function TBufDatasetDesignEditor.GetVerbCount: Integer; begin Result:=FOffset+4; end; function TBufDatasetDesignEditor.GetVerb(Index: Integer): string; begin if Index