SelDSFrm.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

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