home *** CD-ROM | disk | FTP | other *** search
/ PC Format Collection 48 / SENT14D.ISO / tech / delphi / disk12 / lib.pak / DBREG.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-08-24  |  15.3 KB  |  585 lines

  1. unit DBReg;
  2.  
  3. interface
  4.  
  5. uses Classes, DsgnIntf;
  6.  
  7. procedure Register;
  8.  
  9. implementation
  10.  
  11. uses DB, DBTables, DBCtrls, DBGrids, Report, Controls, MaskProp, MaskText,
  12.   Mask, DBConsts, SysUtils, DBLookup, DSDesign, DBEdit, FldLinks, TypInfo,
  13.   LibConst, QBE, QBindDlg, ProcDlg;
  14.  
  15. { TDataSetEditor }
  16.  
  17. type
  18.   TDataSetEditor = class(TComponentEditor)
  19.     procedure ExecuteVerb(Index: Integer); override;
  20.     function GetVerb(Index: Integer): string; override;
  21.     function GetVerbCount: Integer; override;
  22.   end;
  23.  
  24. procedure TDataSetEditor.ExecuteVerb(Index: Integer);
  25. begin
  26.   ShowDatasetDesigner(Designer, TTable(Component));
  27. end;
  28.  
  29. function TDataSetEditor.GetVerb(Index: Integer): string;
  30. begin
  31.   Result := LoadStr(SDatasetDesigner);
  32. end;
  33.  
  34. function TDataSetEditor.GetVerbCount: Integer;
  35. begin
  36.   Result := 1;
  37. end;
  38.  
  39. { TDatabaseEditor }
  40.  
  41. type
  42.   TDatabaseEditor = class(TComponentEditor)
  43.     procedure ExecuteVerb(Index: Integer); override;
  44.     function GetVerb(Index: Integer): string; override;
  45.     function GetVerbCount: Integer; override;
  46.   end;
  47.  
  48. procedure TDatabaseEditor.ExecuteVerb(Index: Integer);
  49. begin
  50.   if EditDatabase(TDatabase(Component)) then Designer.Modified;
  51. end;
  52.  
  53. function TDatabaseEditor.GetVerb(Index: Integer): string;
  54. begin
  55.   Result := LoadStr(SDatabaseEditor);
  56. end;
  57.  
  58. function TDatabaseEditor.GetVerbCount: Integer;
  59. begin
  60.   Result := 1;
  61. end;
  62.  
  63. { TBatchMoveEditor }
  64.  
  65. type
  66.   TBatchMoveEditor = class(TComponentEditor)
  67.     procedure ExecuteVerb(Index: Integer); override;
  68.     function GetVerb(Index: Integer): string; override;
  69.     function GetVerbCount: Integer; override;
  70.   end;
  71.  
  72. procedure TBatchMoveEditor.ExecuteVerb(Index: Integer);
  73. begin
  74.   TBatchMove(Component).Execute;
  75. end;
  76.  
  77. function TBatchMoveEditor.GetVerb(Index: Integer): string;
  78. begin
  79.   Result := LoadStr(SBatchExecute);
  80. end;
  81.  
  82. function TBatchMoveEditor.GetVerbCount: Integer;
  83. begin
  84.   Result := 1;
  85. end;
  86.  
  87. { TDataSetProperty }
  88.  
  89. type
  90.   TDataSetProperty = class(TComponentProperty)
  91.   public
  92.     procedure GetValues(Proc: TGetStrProc); override;
  93.   end;
  94.  
  95. procedure TDataSetProperty.GetValues(Proc: TGetStrProc);
  96. var
  97.   Linked: Boolean;
  98.   I, J: Integer;
  99.   Component: TComponent;
  100. begin
  101.   for I := 0 to Designer.Form.ComponentCount - 1 do
  102.   begin
  103.     Component := Designer.Form.Components[I];
  104.     if (Component is TDataSet) and (Component.Name <> '') then
  105.     begin
  106.       Linked := False;
  107.       for J := 0 to PropCount - 1 do
  108.         Linked := Linked or
  109.           TDataSource(GetComponent(J)).IsLinkedTo(TDataSet(Component));
  110.       if not Linked then Proc(Component.Name);
  111.     end;
  112.   end;
  113. end;
  114.  
  115. { TDataSourceProperty }
  116.  
  117. type
  118.   TDataSourceProperty = class(TComponentProperty)
  119.   public
  120.     procedure GetValues(Proc: TGetStrProc); override;
  121.   end;
  122.  
  123. procedure TDataSourceProperty.GetValues(Proc: TGetStrProc);
  124. var
  125.   Linked: Boolean;
  126.   I, J: Integer;
  127.   Component: TComponent;
  128. begin
  129.   for I := 0 to Designer.Form.ComponentCount - 1 do
  130.   begin
  131.     Component := Designer.Form.Components[I];
  132.     if (Component is TDataSource) and (Component.Name <> '') then
  133.     begin
  134.       Linked := False;
  135.       for J := 0 to PropCount - 1 do
  136.         Linked := Linked or
  137.           TDataSet(GetComponent(J)).IsLinkedTo(TDataSource(Component));
  138.       if not Linked then Proc(Component.Name);
  139.     end;
  140.   end;
  141. end;
  142.  
  143. { TDBStringProperty }
  144.  
  145. type
  146.   TDBStringProperty = class(TStringProperty)
  147.   public
  148.     function GetAttributes: TPropertyAttributes; override;
  149.     procedure GetValueList(List: TStrings); virtual; abstract;
  150.     procedure GetValues(Proc: TGetStrProc); override;
  151.   end;
  152.  
  153. function TDBStringProperty.GetAttributes: TPropertyAttributes;
  154. begin
  155.   Result := [paValueList, paSortList, paMultiSelect];
  156. end;
  157.  
  158. procedure TDBStringProperty.GetValues(Proc: TGetStrProc);
  159. var
  160.   I: Integer;
  161.   Values: TStringList;
  162. begin
  163.   Values := TStringList.Create;
  164.   try
  165.     GetValueList(Values);
  166.     for I := 0 to Values.Count - 1 do Proc(Values[I]);
  167.   finally
  168.     Values.Free;
  169.   end;
  170. end;
  171.  
  172. { TDatabaseNameProperty }
  173.  
  174. type
  175.   TDatabaseNameProperty = class(TDBStringProperty)
  176.   public
  177.     procedure GetValueList(List: TStrings); override;
  178.   end;
  179.  
  180. procedure TDatabaseNameProperty.GetValueList(List: TStrings);
  181. begin
  182.   Session.GetDatabaseNames(List);
  183. end;
  184.  
  185. { TAliasNameProperty }
  186.  
  187. type
  188.   TAliasNameProperty = class(TDBStringProperty)
  189.   public
  190.     procedure GetValueList(List: TStrings); override;
  191.   end;
  192.  
  193. procedure TAliasNameProperty.GetValueList(List: TStrings);
  194. begin
  195.   Session.GetAliasNames(List);
  196. end;
  197.  
  198. { TDriverNameProperty }
  199.  
  200. type
  201.   TDriverNameProperty = class(TDBStringProperty)
  202.   public
  203.     procedure GetValueList(List: TStrings); override;
  204.   end;
  205.  
  206. procedure TDriverNameProperty.GetValueList(List: TStrings);
  207. begin
  208.   Session.GetDriverNames(List);
  209. end;
  210.  
  211. { TTableNameProperty }
  212.  
  213. type
  214.   TTableNameProperty = class(TDBStringProperty)
  215.   public
  216.     procedure GetValueList(List: TStrings); override;
  217.   end;
  218.  
  219. procedure TTableNameProperty.GetValueList(List: TStrings);
  220. const
  221.   Masks: array[TTableType] of string[5] = ('', '*.DB', '*.DBF', '*.TXT');
  222. var
  223.   Table: TTable;
  224. begin
  225.   Table := GetComponent(0) as TTable;
  226.   Session.GetTableNames(Table.DatabaseName, Masks[Table.TableType],
  227.     Table.TableType = ttDefault, False, List);
  228. end;
  229.  
  230. { TIndexNameProperty }
  231.  
  232. type
  233.   TIndexNameProperty = class(TDBStringProperty)
  234.   public
  235.     procedure GetValueList(List: TStrings); override;
  236.   end;
  237.  
  238. procedure TIndexNameProperty.GetValueList(List: TStrings);
  239. begin
  240.   (GetComponent(0) as TTable).GetIndexNames(List);
  241. end;
  242.  
  243. { TProcedureNameProperty }
  244.  
  245. type
  246.   TProcedureNameProperty = class(TDBStringProperty)
  247.   public
  248.     procedure GetValueList(List: TStrings); override;
  249.   end;
  250.  
  251. procedure TProcedureNameProperty.GetValueList(List: TStrings);
  252. begin
  253.   Session.GetStoredProcNames((GetComponent(0) as TDBDataSet).DatabaseName, List);
  254. end;
  255.  
  256. { TIndexFieldNamesProperty }
  257.  
  258. type
  259.   TIndexFieldNamesProperty = class(TDBStringProperty)
  260.   public
  261.     procedure GetValueList(List: TStrings); override;
  262.   end;
  263.  
  264. procedure TIndexFieldNamesProperty.GetValueList(List: TStrings);
  265. var
  266.   I: Integer;
  267. begin
  268.   with GetComponent(0) as TTable do
  269.   begin
  270.     IndexDefs.Update;
  271.     for I := 0 to IndexDefs.Count - 1 do
  272.       with IndexDefs[I] do
  273.         if not (ixExpression in Options) then List.Add(Fields);
  274.   end;
  275. end;
  276.  
  277. { TDataFieldProperty }
  278.  
  279. type
  280.   TDataFieldProperty = class(TDBStringProperty)
  281.   public
  282.     function GetDataSourcePropName: string; virtual;
  283.     procedure GetValueList(List: TStrings); override;
  284.   end;
  285.  
  286. function TDataFieldProperty.GetDataSourcePropName: string;
  287. begin
  288.   Result := 'DataSource';
  289. end;
  290.  
  291. procedure TDataFieldProperty.GetValueList(List: TStrings);
  292. var
  293.   Instance: TComponent;
  294.   PropInfo: PPropInfo;
  295.   DataSource: TDataSource;
  296. begin
  297.   Instance := GetComponent(0);
  298.   PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, GetDataSourcePropName);
  299.   if (PropInfo <> nil) and (PropInfo^.PropType^.Kind = tkClass) then
  300.   begin
  301.     DataSource := TObject(GetOrdProp(Instance, PropInfo)) as TDataSource;
  302.     if (DataSource <> nil) and (DataSource.DataSet <> nil) then
  303.       DataSource.DataSet.GetFieldNames(List);
  304.   end;
  305. end;
  306.  
  307. { TLookupFieldProperty }
  308.  
  309. type
  310.   TLookupFieldProperty = class(TDataFieldProperty)
  311.   public
  312.     function GetDataSourcePropName: string; override;
  313.   end;
  314.  
  315. function TLookupFieldProperty.GetDataSourcePropName: string;
  316. begin
  317.   Result := 'LookupSource';
  318. end;
  319.  
  320. { TLookupIndexProperty }
  321.  
  322. type
  323.   TLookupIndexProperty = class(TLookupFieldProperty)
  324.   public
  325.     procedure GetValueList(List: TStrings); override;
  326.   end;
  327.  
  328. procedure TLookupIndexProperty.GetValueList(List: TStrings);
  329. var
  330.   Instance: TComponent;
  331.   PropInfo: PPropInfo;
  332.   DataSource: TDataSource;
  333. begin
  334.   Instance := GetComponent(0);
  335.   PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, GetDataSourcePropName);
  336.   if (PropInfo <> nil) and (PropInfo^.PropType^.Kind = tkClass) then
  337.   begin
  338.     DataSource := TObject(GetOrdProp(Instance, PropInfo)) as TDataSource;
  339.     if (DataSource <> nil) and (DataSource.DataSet <> nil) then
  340.     begin
  341.       if (DataSource.DataSet is TTable) and
  342.           (TTable(DataSource.DataSet).IndexFieldCount > 0) then
  343.         List.Add(TTable(DataSource.DataSet).IndexFields[0].FieldName)
  344.       else
  345.         DataSource.DataSet.GetFieldNames(List);
  346.     end;
  347.   end;
  348. end;
  349.  
  350. { TDBImageEditor }
  351.  
  352. type
  353.   TDBImageEditor = class(TDefaultEditor)
  354.   public
  355.     procedure Copy; override;
  356.   end;
  357.  
  358. procedure TDBImageEditor.Copy;
  359. begin
  360.   TDBImage(Component).CopyToClipboard;
  361. end;
  362.  
  363. { TQueryEditor }
  364.  
  365. type
  366.   TQueryEditor = class(TComponentEditor)
  367.   private
  368.     procedure ExecuteVerb(Index: Integer); override;
  369.     function GetVerb(Index: Integer): string; override;
  370.     function GetVerbCount: Integer; override;
  371.   end;
  372.  
  373. procedure TQueryEditor.ExecuteVerb(Index: Integer);
  374. var
  375.   Query: TQuery;
  376.   List: TParams;
  377. begin
  378.   Query := Component as TQuery;
  379.   case Index of
  380.     0: ShowDatasetDesigner(Designer, TTable(Component));
  381.     1:
  382.       begin
  383.         List := TParams.Create;
  384.         try
  385.           List.Assign(Query.Params);
  386.           if EditQueryParams(Query, List) then
  387.           begin
  388.             Query.Params := List;
  389.             if Designer <> nil then Designer.Modified;
  390.           end;
  391.         finally
  392.           List.Free;
  393.         end;
  394.      end;
  395.     2: ExecBuilder(Query);
  396.   end;
  397. end;
  398.  
  399. function TQueryEditor.GetVerb(Index: Integer): string;
  400. begin
  401.   case Index of
  402.     0: Result := LoadStr(SDatasetDesigner);
  403.     1: Result := LoadStr(SBindVerb);
  404.     2: Result := LoadStr(SQBEVerb);
  405.   end;
  406. end;
  407.  
  408. function TQueryEditor.GetVerbCount: Integer;
  409. begin
  410.   if not VQBLoadAttempted then InitVQB;
  411.   if VQBLoaded then Result := 3
  412.   else Result := 2;
  413. end;
  414.  
  415. { TStoredProcEditor }
  416.  
  417. type
  418.   TStoredProcEditor = class(TComponentEditor)
  419.   private
  420.     procedure Edit; override;
  421.     procedure ExecuteVerb(Index: Integer); override;
  422.     function GetVerb(Index: Integer): string; override;
  423.     function GetVerbCount: Integer; override;
  424.   end;
  425.  
  426. procedure TStoredProcEditor.Edit;
  427. begin
  428.   ShowDatasetDesigner(Designer, TTable(Component));
  429. end;
  430.  
  431. procedure TStoredProcEditor.ExecuteVerb(Index: Integer);
  432. var
  433.   StoredProc: TStoredProc;
  434.   List: TParams;
  435. begin
  436.   StoredProc := Component as TStoredProc;
  437.   case Index of
  438.     0: Edit;
  439.     1:
  440.       begin
  441.         List := TParams.Create;
  442.         try
  443.           StoredProc.CopyParams(List);
  444.           if EditProcParams(StoredProc, List) then
  445.           begin
  446.             StoredProc.UnPrepare;
  447.             StoredProc.Params := List;
  448.             if Designer <> nil then Designer.Modified;
  449.           end;
  450.         finally
  451.           List.Free;
  452.         end;
  453.       end;
  454.   end;
  455. end;
  456.  
  457. function TStoredProcEditor.GetVerb(Index: Integer): string;
  458. begin
  459.   case Index of
  460.     0: Result := LoadStr(SDatasetDesigner);
  461.     1: Result := LoadStr(SBindVerb);
  462.   end;
  463. end;
  464.  
  465. function TStoredProcEditor.GetVerbCount: Integer;
  466. begin
  467.   Result := 2;
  468. end;
  469.  
  470. { TParamsProperty }
  471.  
  472. type
  473.   TParamsProperty = class(TPropertyEditor)
  474.   public
  475.     function GetValue: string; override;
  476.     function GetAttributes: TPropertyAttributes; override;
  477.   end;
  478.  
  479. function TParamsProperty.GetValue: string;
  480. begin
  481.   Result := Format('(%s)', [TParams.ClassName]);
  482. end;
  483.  
  484. function TParamsProperty.GetAttributes: TPropertyAttributes;
  485. begin
  486.   Result := [paMultiSelect, paDialog];
  487. end;
  488.  
  489. { TStoredParamsProperty }
  490. type
  491.   TStoredParamsProperty = class(TParamsProperty)
  492.     procedure Edit; override;
  493.   end;
  494.  
  495. procedure TStoredParamsProperty.Edit;
  496. var
  497.   List: TParams;
  498.   StoredProc: TStoredProc;
  499. begin
  500.   StoredProc := GetComponent(0) as TStoredProc;
  501.   List := TParams.Create;
  502.   try
  503.     StoredProc.CopyParams(List);
  504.     if EditProcParams(StoredProc, List) then
  505.     begin
  506.       StoredProc.UnPrepare;
  507.       StoredProc.Params := List;
  508.       if Designer <> nil then Designer.Modified;
  509.     end;
  510.   finally
  511.     List.Free;
  512.   end;
  513. end;
  514.  
  515. { TQueryParamsProperty }
  516. type
  517.   TQueryParamsProperty = class(TParamsProperty)
  518.     procedure Edit; override;
  519.   end;
  520.  
  521. procedure TQueryParamsProperty.Edit;
  522. var
  523.   List: TParams;
  524.   Query: TQuery;
  525. begin
  526.   Query := GetComponent(0) as TQuery;
  527.   List := TParams.Create;
  528.   try
  529.     List.Assign(Query.Params);
  530.     if EditQueryParams(Query, List) then
  531.     begin
  532.       Query.Params := List;
  533.       if Designer <> nil then Designer.Modified;
  534.     end;
  535.   finally
  536.     List.Free;
  537.   end;
  538. end;
  539.  
  540. { Registration }
  541.  
  542. procedure Register;
  543. begin
  544.   RegisterComponents(LoadStr(srDAccess), [TDataSource, TTable, TQuery,
  545.     TStoredProc, TDatabase, TBatchMove, TReport]);
  546.   RegisterComponents(LoadStr(srDControls), [TDBGrid, TDBNavigator, TDBText,
  547.     TDBEdit, TDBMemo, TDBImage, TDBListBox, TDBComboBox,
  548.     TDBCheckBox, TDBRadioGroup, TDBLookupList, TDBLookupCombo]);
  549.   RegisterNoIcon([TField]);
  550.   RegisterFields([TStringField, TIntegerField, TSmallintField, TWordField,
  551.     TFloatField, TCurrencyField, TBCDField, TBooleanField, TDateField,
  552.     TVarBytesField, TBytesField, TTimeField, TDateTimeField,
  553.     TBlobField, TMemoField, TGraphicField]);
  554.   RegisterPropertyEditor(TypeInfo(TDataSet), TDataSource, 'DataSet', TDataSetProperty);
  555.   RegisterPropertyEditor(TypeInfo(TDataSource), TTable, 'MasterSource', TDataSourceProperty);
  556.   RegisterPropertyEditor(TypeInfo(TDataSource), TQuery, 'DataSource', TDataSourceProperty);
  557.   RegisterPropertyEditor(TypeInfo(TSymbolStr), TDatabase, 'AliasName', TAliasNameProperty);
  558.   RegisterPropertyEditor(TypeInfo(TSymbolStr), TDatabase, 'DriverName', TDriverNameProperty);
  559.   RegisterPropertyEditor(TypeInfo(TFileName), TDBDataSet, 'DatabaseName', TDatabaseNameProperty);
  560.   RegisterPropertyEditor(TypeInfo(TFileName), TTable, 'TableName', TTableNameProperty);
  561.   RegisterPropertyEditor(TypeInfo(string), TTable, 'IndexName', TIndexNameProperty);
  562.   RegisterPropertyEditor(TypeInfo(string), TTable, 'IndexFieldNames', TIndexFieldNamesProperty);
  563.   RegisterPropertyEditor(TypeInfo(string), TComponent, 'DataField', TDataFieldProperty);
  564.   RegisterPropertyEditor(TypeInfo(string), TWinControl, 'LookupField', TLookupIndexProperty);
  565.   RegisterPropertyEditor(TypeInfo(string), TWinControl, 'LookupDisplay', TLookupFieldProperty);
  566.   RegisterPropertyEditor(TypeInfo(string), TDBEdit, 'EditMask', TMaskProperty);
  567.   RegisterPropertyEditor(TypeInfo(string), TField, 'EditMask', TMaskProperty);
  568.   RegisterPropertyEditor(TypeInfo(string), TReport, 'ReportDir', TReportDirProperty);
  569.   RegisterPropertyEditor(TypeInfo(string), TReport, 'ReportName', TReportNameProperty);
  570.   RegisterPropertyEditor(TypeInfo(string), TTable, 'MasterFields', TFieldLinkProperty);
  571.   RegisterPropertyEditor(TypeInfo(string), TQuery, 'StoredProcName', TProcedureNameProperty);
  572.   RegisterPropertyEditor(TypeInfo(TParams), TQuery, 'Params', TQueryParamsProperty);
  573.   RegisterPropertyEditor(TypeInfo(string), TStoredProc, 'StoredProcName', TProcedureNameProperty);
  574.   RegisterPropertyEditor(TypeInfo(TParams), TStoredProc, 'Params', TStoredParamsProperty);
  575.   RegisterComponentEditor(TDataset, TDataSetEditor);
  576.   RegisterComponentEditor(TDatabase, TDatabaseEditor);
  577.   RegisterComponentEditor(TBatchMove, TBatchMoveEditor);
  578.   RegisterComponentEditor(TReport, TReportEditor);
  579.   RegisterComponentEditor(TDBImage, TDBImageEditor);
  580.   RegisterComponentEditor(TQuery, TQueryEditor);
  581.   RegisterComponentEditor(TStoredProc, TStoredProcEditor);
  582. end;
  583.  
  584. end.
  585.