home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d6 / RX275D6.ZIP / Units / SelDSFrm.pas < prev    next >
Pascal/Delphi Source File  |  2001-06-24  |  6KB  |  234 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1998 Master-Bank                }
  6. {                                                       }
  7. {*******************************************************}
  8.  
  9. unit SelDSFrm;
  10.  
  11. {$I RX.INC}
  12.  
  13. interface
  14.  
  15. {$IFDEF DCS}
  16.  
  17. uses Windows, SysUtils, Messages, Classes, Graphics, Controls, Forms, Dialogs, DB, StdCtrls,
  18.   RTLConsts, DesignIntf, DesignEditors, VCLEditors, RxDsgn;
  19.  
  20. type
  21.  
  22. { TSelectDataSetForm }
  23.  
  24.   TSelectDataSetForm = class(TForm)
  25.     GroupBox: TGroupBox;
  26.     DataSetList: TListBox;
  27.     OkBtn: TButton;
  28.     CancelBtn: TButton;
  29.     procedure DataSetListDblClick(Sender: TObject);
  30.     procedure DataSetListKeyPress(Sender: TObject; var Key: Char);
  31.   private
  32.     { Private declarations }
  33.     FDesigner: IDesigner;
  34.     FExclude: string;
  35.     procedure FillDataSetList(ExcludeDataSet: TDataSet);
  36.     procedure AddDataSet(const S: string);
  37.   public
  38.     { Public declarations }
  39.   end;
  40.  
  41. { TMemDataSetEditor }
  42.  
  43.   TMemDataSetEditor = class(TComponentEditor)
  44.   private
  45.     function UniqueName(Field: TField): string;
  46.     procedure BorrowStructure;
  47.   protected
  48.     function CopyStructure(Source, Dest: TDataSet): Boolean; virtual; abstract;
  49.   public
  50.     procedure ExecuteVerb(Index: Integer); override;
  51.     function GetVerb(Index: Integer): string; override;
  52.     function GetVerbCount: Integer; override;
  53.   end;
  54.  
  55. function SelectDataSet(ADesigner: IDesigner; const ACaption: string; ExcludeDataSet: TDataSet): TDataSet;
  56.  
  57. {$ENDIF DCS}
  58.  
  59. implementation
  60.  
  61. {$IFDEF DCS}
  62.  
  63. uses DbConsts, TypInfo, VclUtils, rxStrUtils, RxLConst,
  64.   {$IFDEF RX_D3}{$IFDEF RX_D5} DsnDbCst, {$ELSE} BdeConst, {$ENDIF}{$ENDIF}
  65.   DSDesign;
  66.  
  67. {$R *.DFM}
  68.  
  69. function SelectDataSet(ADesigner: IDesigner; const ACaption: string;
  70.   ExcludeDataSet: TDataSet): TDataSet;
  71. begin
  72.   Result := nil;
  73.   with TSelectDataSetForm.Create(Application) do
  74.   try
  75.     if ACaption <> '' then Caption := ACaption;
  76.     FDesigner := ADesigner;
  77.     FillDataSetList(ExcludeDataSet);
  78.     if ShowModal = mrOk then
  79.       if DataSetList.ItemIndex >= 0 then begin
  80.         with DataSetList do  
  81. {$IFDEF WIN32}
  82.           Result := FDesigner.GetComponent(Items[ItemIndex]) as TDataSet;
  83. {$ELSE}
  84.           Result := FDesigner.Form.FindComponent(Items[ItemIndex]) as TDataSet;
  85. {$ENDIF}
  86.       end;
  87.   finally
  88.     Free;
  89.   end;
  90. end;
  91.  
  92. { TMemDataSetEditor }
  93.  
  94. procedure TMemDataSetEditor.BorrowStructure;
  95. var
  96.   DataSet: TDataSet;
  97.   I: Integer;
  98.   Caption: string;
  99. begin
  100.   Caption := Component.Name;
  101.   if (Component.Owner <> nil) and (Component.Owner.Name <> '') then
  102.     Caption := Format({$IFDEF CBUILDER} '%s->%s' {$ELSE} '%s.%s' {$ENDIF},
  103.       [Component.Owner.Name, Caption]);
  104.   DataSet := SelectDataSet(Designer, Caption, TDataSet(Component));
  105.   if DataSet <> nil then begin
  106.     StartWait;
  107.     try
  108.       if not CopyStructure(DataSet, Component as TDataSet) then Exit;
  109.       with TDataSet(Component) do begin
  110.         for I := 0 to FieldCount - 1 do
  111.           if Fields[I].Name = '' then 
  112.             Fields[I].Name := UniqueName(Fields[I]);
  113.       end;
  114.     finally
  115.       StopWait;
  116.     end;
  117.     Designer.Modified;
  118.   end;
  119. end;
  120.  
  121. function TMemDataSetEditor.UniqueName(Field: TField): string;
  122. const
  123.   AlphaNumeric = ['A'..'Z', 'a'..'z', '_'] + ['0'..'9'];
  124. var
  125.   Temp: string;
  126.   Comp: TComponent;
  127.   I: Integer;
  128. begin
  129.   Result := '';
  130.   if (Field <> nil) then begin
  131.     Temp := Field.FieldName;
  132.     for I := Length(Temp) downto 1 do
  133.       if not (Temp[I] in AlphaNumeric) then System.Delete(Temp, I, 1);
  134.     if (Temp = '') or not IsValidIdent(Temp) then begin
  135.       Temp := Field.ClassName;
  136.       if (UpCase(Temp[1]) = 'T') and (Length(Temp) > 1) then
  137.         System.Delete(Temp, 1, 1);
  138.     end;
  139.   end
  140.   else Exit;
  141.   Temp := Component.Name + Temp;
  142. {$IFDEF WIN32}
  143.   Comp := Designer.GetComponent(Temp);
  144.   if (Comp = nil) or (Comp = Field) then Result := Temp
  145.   else Result := Designer.UniqueName(Temp);
  146. {$ELSE}
  147.   I := 0;
  148.   repeat
  149.     Result := Temp;
  150.     if I > 0 then Result := Result + IntToStr(I);
  151.     Comp := Designer.Form.FindComponent(Result);
  152.     Inc(I);
  153.   until (Comp = nil) or (Comp = Field);
  154. {$ENDIF}
  155. end;
  156.  
  157. procedure TMemDataSetEditor.ExecuteVerb(Index: Integer);
  158. begin
  159.   case Index of
  160. {$IFDEF RX_D5}
  161.     0: ShowFieldsEditor(Designer, TDataSet(Component), TDSDesigner);
  162. {$ELSE}
  163.     0: ShowDatasetDesigner(Designer, TDataSet(Component));
  164. {$ENDIF}
  165.     1: BorrowStructure;
  166.   end;
  167. end;
  168.  
  169. function TMemDataSetEditor.GetVerb(Index: Integer): string;
  170. begin
  171.   case Index of
  172.     0: Result := ResStr(SDatasetDesigner);
  173.     1: Result := LoadStr(srBorrowStructure);
  174.   end;
  175. end;
  176.  
  177. function TMemDataSetEditor.GetVerbCount: Integer;
  178. begin
  179.   Result := 2;
  180. end;
  181.  
  182. { TSelectDataSetForm }
  183.  
  184. procedure TSelectDataSetForm.AddDataSet(const S: string);
  185. begin
  186.   if (S <> '') and (S <> FExclude) then DataSetList.Items.Add(S);
  187. end;
  188.  
  189. procedure TSelectDataSetForm.FillDataSetList(ExcludeDataSet: TDataSet);
  190. {$IFNDEF WIN32}
  191. var
  192.   I: Integer;
  193.   Component: TComponent;
  194. {$ENDIF}
  195. begin
  196.   DataSetList.Items.BeginUpdate;
  197.   try
  198.     DataSetList.Clear;
  199.     FExclude := '';
  200.     if ExcludeDataSet <> nil then FExclude := ExcludeDataSet.Name;
  201. {$IFDEF WIN32}
  202.     FDesigner.GetComponentNames(GetTypeData(TypeInfo(TDataSet)), AddDataSet);
  203. {$ELSE}
  204.     for I := 0 to FDesigner.Form.ComponentCount - 1 do begin
  205.       Component := FDesigner.Form.Components[I];
  206.       if (Component is TDataSet) and (Component <> ExcludeDataSet) then
  207.         AddDataSet(Component.Name);
  208.     end;
  209. {$ENDIF}
  210.     with DataSetList do begin
  211.       if Items.Count > 0 then ItemIndex := 0;
  212.       Enabled := Items.Count > 0;
  213.       OkBtn.Enabled := (ItemIndex >= 0);
  214.     end;
  215.   finally
  216.     DataSetList.Items.EndUpdate;
  217.   end;
  218. end;
  219.  
  220. procedure TSelectDataSetForm.DataSetListDblClick(Sender: TObject);
  221. begin
  222.   if DataSetList.ItemIndex >= 0 then ModalResult := mrOk;
  223. end;
  224.  
  225. procedure TSelectDataSetForm.DataSetListKeyPress(Sender: TObject;
  226.   var Key: Char);
  227. begin
  228.   if (Key = #13) and (DataSetList.ItemIndex >= 0) then
  229.     ModalResult := mrOk;
  230. end;
  231.  
  232. {$ENDIF DCS}
  233.  
  234. end.