home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / delphi / kolekce / d6 / rxlibsetup.exe / {app} / units / SelDSFrm.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-02-19  |  6.3 KB  |  237 lines

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