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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {                                                       }
  7. {*******************************************************}
  8. unit PresrDsn;
  9. {$I RX.INC}
  10. interface
  11. uses
  12.   SysUtils, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, 
  13.   Buttons, ExtCtrls, RXCtrls, Placemnt, RXProps, Consts, RTLConsts, DesignIntf, DesignEditors, VCLEditors, VclUtils;
  14. type
  15. {$IFNDEF RX_D4}
  16.   IDesigner = TDesigner;
  17. {$ENDIF}
  18. { TFormPropsDlg }
  19.   TFormPropsDlg = class(TForm)
  20.     Bevel1: TBevel;
  21.     Label30: TLabel;
  22.     Label31: TLabel;
  23.     Label2: TLabel;
  24.     UpBtn: TSpeedButton;
  25.     DownBtn: TSpeedButton;
  26.     StoredList: TTextListBox;
  27.     PropertiesList: TTextListBox;
  28.     ComponentsList: TTextListBox;
  29.     FormBox: TGroupBox;
  30.     ActiveCtrlBox: TCheckBox;
  31.     PositionBox: TCheckBox;
  32.     StateBox: TCheckBox;
  33.     AddButton: TButton;
  34.     DeleteButton: TButton;
  35.     ClearButton: TButton;
  36.     OkBtn: TButton;
  37.     CancelBtn: TButton;
  38.     procedure AddButtonClick(Sender: TObject);
  39.     procedure ClearButtonClick(Sender: TObject);
  40.     procedure ListClick(Sender: TObject);
  41.     procedure FormDestroy(Sender: TObject);
  42.     procedure DeleteButtonClick(Sender: TObject);
  43.     procedure StoredListClick(Sender: TObject);
  44.     procedure UpBtnClick(Sender: TObject);
  45.     procedure DownBtnClick(Sender: TObject);
  46.     procedure StoredListDragOver(Sender, Source: TObject; X, Y: Integer;
  47.       State: TDragState; var Accept: Boolean);
  48.     procedure StoredListDragDrop(Sender, Source: TObject; X, Y: Integer);
  49.     procedure PropertiesListDblClick(Sender: TObject);
  50.   private
  51.     { Private declarations }
  52.     FCompOwner: TComponent;
  53.     FDesigner: IDesigner;
  54.     procedure ListToIndex(List: TCustomListBox; Idx: Integer);
  55.     procedure UpdateCurrent;
  56.     procedure DeleteProp(I: Integer);
  57.     function FindProp(const CompName, PropName: string; var IdxComp,
  58.       IdxProp: Integer): Boolean;
  59.     procedure ClearLists;
  60.     procedure CheckAddItem(const CompName, PropName: string);
  61.     procedure AddItem(IdxComp, IdxProp: Integer; AUpdate: Boolean);
  62.     procedure BuildLists(StoredProps: TStrings);
  63.     procedure CheckButtons;
  64.     procedure SetStoredList(AList: TStrings);
  65.   public
  66.     { Public declarations }
  67.   end;
  68. { TFormStorageEditor }
  69.   TFormStorageEditor = class(TComponentEditor)
  70.     procedure ExecuteVerb(Index: Integer); override;
  71.     function GetVerb(Index: Integer): string; override;
  72.     function GetVerbCount: Integer; override;
  73.   end;
  74. { TStoredPropsProperty }
  75.   TStoredPropsProperty = class(TClassProperty)
  76.   public
  77.     function GetAttributes: TPropertyAttributes; override;
  78.     function GetValue: string; override;
  79.     procedure Edit; override;
  80.   end;
  81. { Show component editor }
  82. function ShowStorageDesigner(ACompOwner: TComponent; ADesigner: IDesigner;
  83.   AStoredList: TStrings; var Options: TPlacementOptions): Boolean;
  84. implementation
  85. {$IFDEF WIN32}
  86. uses Windows, BoxProcs, TypInfo, RXLConst;
  87. {$ELSE}
  88. uses WinTypes, WinProcs, Str16, BoxProcs, TypInfo, RXLConst;
  89. {$ENDIF}
  90. {$R *.DFM}
  91. {$IFDEF WIN32}
  92.  {$D-}
  93. {$ENDIF}
  94. { TFormStorageEditor }
  95. procedure TFormStorageEditor.ExecuteVerb(Index: Integer);
  96. var
  97.   Storage: TFormStorage;
  98.   Opt: TPlacementOptions;
  99. begin
  100.   Storage := Component as TFormStorage;
  101.   if Index = 0 then begin
  102.     Opt := Storage.Options;
  103.     if ShowStorageDesigner(TComponent(Storage.Owner), Designer,
  104.       Storage.StoredProps, Opt) then
  105.     begin
  106.       Storage.Options := Opt;
  107. {$IFDEF WIN32}
  108.       Storage.SetNotification;
  109. {$ENDIF}
  110.     end;
  111.   end;
  112. end;
  113. function TFormStorageEditor.GetVerb(Index: Integer): string;
  114. begin
  115.   case Index of
  116.     0: Result := LoadStr(srStorageDesigner);
  117.     else Result := '';
  118.   end;
  119. end;
  120. function TFormStorageEditor.GetVerbCount: Integer;
  121. begin
  122.   Result := 1;
  123. end;
  124. { TStoredPropsProperty }
  125. function TStoredPropsProperty.GetAttributes: TPropertyAttributes;
  126. begin
  127.   Result := inherited GetAttributes + [paDialog] - [paSubProperties];
  128. end;
  129. function TStoredPropsProperty.GetValue: string;
  130. begin
  131.   if TStrings(GetOrdValue).Count > 0 then Result := inherited GetValue
  132.   else Result := ResStr(srNone);
  133. end;
  134. procedure TStoredPropsProperty.Edit;
  135. var
  136.   Storage: TFormStorage;
  137.   Opt: TPlacementOptions;
  138. begin
  139.   Storage := GetComponent(0) as TFormStorage;
  140.   Opt := Storage.Options;
  141.   if ShowStorageDesigner(Storage.Owner as TComponent, Designer,
  142.     Storage.StoredProps, Opt) then
  143.   begin
  144.     Storage.Options := Opt;
  145. {$IFDEF WIN32}
  146.     Storage.SetNotification;
  147. {$ENDIF}
  148.   end;
  149. end;
  150. { Show component editor }
  151. function ShowStorageDesigner(ACompOwner: TComponent; ADesigner: IDesigner;
  152.   AStoredList: TStrings; var Options: TPlacementOptions): Boolean;
  153. begin
  154.   with TFormPropsDlg.Create(Application) do
  155.   try
  156.     FCompOwner := ACompOwner;
  157.     FDesigner := ADesigner;
  158.     Screen.Cursor := crHourGlass;
  159.     try
  160.       UpdateStoredList(ACompOwner, AStoredList, False);
  161.       SetStoredList(AStoredList);
  162.       ActiveCtrlBox.Checked := fpActiveControl in Options;
  163.       PositionBox.Checked := fpPosition in Options;
  164.       StateBox.Checked := fpState in Options;
  165.     finally
  166.       Screen.Cursor := crDefault;
  167.     end;
  168.     Result := ShowModal = mrOk;
  169.     if Result then begin
  170.       AStoredList.Assign(StoredList.Items);
  171.       Options := [];
  172.       if ActiveCtrlBox.Checked then Include(Options, fpActiveControl);
  173.       if PositionBox.Checked then Include(Options, fpPosition);
  174.       if StateBox.Checked then Include(Options, fpState);
  175.     end;
  176.   finally
  177.     Free;
  178.   end;
  179. end;
  180. { TFormPropsDlg }
  181. procedure TFormPropsDlg.ListToIndex(List: TCustomListBox; Idx: Integer);
  182.   procedure SetItemIndex(Index: Integer);
  183.   begin
  184.     if TTextListBox(List).MultiSelect then
  185.       TTextListBox(List).Selected[Index] := True;
  186.     List.ItemIndex := Index;
  187.   end;
  188. begin
  189.   if Idx < List.Items.Count then
  190.     SetItemIndex(Idx)
  191.   else if Idx - 1 < List.Items.Count then
  192.     SetItemIndex(Idx - 1)
  193.   else if (List.Items.Count > 0) then
  194.     SetItemIndex(0);
  195. end;
  196. procedure TFormPropsDlg.UpdateCurrent;
  197. var
  198.   IdxProp: Integer;
  199.   List: TStrings;
  200. begin
  201.   IdxProp := PropertiesList.ItemIndex;
  202.   if IdxProp < 0 then IdxProp := 0;
  203.   if ComponentsList.Items.Count <= 0 then
  204.   begin
  205.     PropertiesList.Clear;
  206.     Exit;
  207.   end;
  208.   if (ComponentsList.ItemIndex < 0) then
  209.     ComponentsList.ItemIndex := 0;
  210.   List := TStrings(ComponentsList.Items.Objects[ComponentsList.ItemIndex]);
  211.   if List.Count > 0 then PropertiesList.Items := List
  212.   else PropertiesList.Clear;
  213.   ListToIndex(PropertiesList, IdxProp);
  214.   CheckButtons;
  215. end;
  216. procedure TFormPropsDlg.DeleteProp(I: Integer);
  217. var
  218.   CompName, PropName: string;
  219.   IdxComp, IdxProp, Idx: Integer;
  220.   StrList: TStringList;
  221. begin
  222.   Idx := StoredList.ItemIndex;
  223.   if ParseStoredItem(StoredList.Items[I], CompName, PropName) then begin
  224.     StoredList.Items.Delete(I);
  225.     if FDesigner <> nil then FDesigner.Modified;
  226.     ListToIndex(StoredList, Idx);
  227.     {I := ComponentsList.ItemIndex;}
  228.     if not FindProp(CompName, PropName, IdxComp, IdxProp) then begin
  229.       if IdxComp < 0 then begin
  230.         StrList := TStringList.Create;
  231.         try
  232.           StrList.Add(PropName);
  233.           ComponentsList.Items.AddObject(CompName, StrList);
  234.           ComponentsList.ItemIndex := ComponentsList.Items.IndexOf(CompName);
  235.         except
  236.           StrList.Free;
  237.           raise;
  238.         end;
  239.       end
  240.       else begin
  241.         TStrings(ComponentsList.Items.Objects[IdxComp]).Add(PropName);
  242.       end;
  243.       UpdateCurrent;
  244.     end;
  245.   end;
  246. end;
  247. function TFormPropsDlg.FindProp(const CompName, PropName: string; var IdxComp,
  248.   IdxProp: Integer): Boolean;
  249. begin
  250.   Result := False;
  251.   IdxComp := ComponentsList.Items.IndexOf(CompName);
  252.   if IdxComp >= 0 then begin
  253.     IdxProp := TStrings(ComponentsList.Items.Objects[IdxComp]).IndexOf(PropName);
  254.     if IdxProp >= 0 then Result := True;
  255.   end;
  256. end;
  257. procedure TFormPropsDlg.ClearLists;
  258. var
  259.   I: Integer;
  260. begin
  261.   for I := 0 to ComponentsList.Items.Count - 1 do begin
  262.     ComponentsList.Items.Objects[I].Free;
  263.   end;
  264.   ComponentsList.Items.Clear;
  265.   ComponentsList.Clear;
  266.   PropertiesList.Clear;
  267.   StoredList.Clear;
  268. end;
  269. procedure TFormPropsDlg.AddItem(IdxComp, IdxProp: Integer; AUpdate: Boolean);
  270. var
  271.   Idx: Integer;
  272.   StrList: TStringList;
  273.   CompName, PropName: string;
  274.   Component: TComponent;
  275. begin
  276.   CompName := ComponentsList.Items[IdxComp];
  277.   Component := FCompOwner.FindComponent(CompName);
  278.   if Component = nil then Exit;
  279.   StrList := TStringList(ComponentsList.Items.Objects[IdxComp]);
  280.   PropName := StrList[IdxProp];
  281.   StrList.Delete(IdxProp);
  282.   if StrList.Count = 0 then begin
  283.     Idx := ComponentsList.ItemIndex;
  284.     StrList.Free;
  285.     ComponentsList.Items.Delete(IdxComp);
  286.     ListToIndex(ComponentsList, Idx);
  287.   end;
  288.   StoredList.Items.AddObject(CreateStoredItem(CompName, PropName), Component);
  289.   if FDesigner <> nil then FDesigner.Modified;
  290.   StoredList.ItemIndex := StoredList.Items.Count - 1;
  291.   if AUpdate then UpdateCurrent;
  292. end;
  293. procedure TFormPropsDlg.CheckAddItem(const CompName, PropName: string);
  294. var
  295.   IdxComp, IdxProp: Integer;
  296. begin
  297.   if FindProp(CompName, PropName, IdxComp, IdxProp) then
  298.     AddItem(IdxComp, IdxProp, True);
  299. end;
  300. procedure TFormPropsDlg.BuildLists(StoredProps: TStrings);
  301. var
  302.   I, J: Integer;
  303.   C: TComponent;
  304.   List: TPropInfoList;
  305.   StrList: TStrings;
  306.   CompName, PropName: string;
  307. begin
  308.   ClearLists;
  309.   if FCompOwner <> nil then begin
  310.     for I := 0 to FCompOwner.ComponentCount - 1 do begin
  311.       C := FCompOwner.Components[I];
  312.       if (C is TFormPlacement) or (C.Name = '') then Continue;
  313.       List := TPropInfoList.Create(C, tkProperties);
  314.       try
  315.         StrList := TStringList.Create;
  316.         try
  317.           TStringList(StrList).Sorted := True;
  318.           for J := 0 to List.Count - 1 do
  319.             StrList.Add(List.Items[J]^.Name);
  320.           ComponentsList.Items.AddObject(C.Name, StrList);
  321.         except
  322.           StrList.Free;
  323.           raise;
  324.         end;
  325.       finally
  326.         List.Free;
  327.       end;
  328.     end;
  329.     if StoredProps <> nil then begin
  330.       for I := 0 to StoredProps.Count - 1 do begin
  331.         if ParseStoredItem(StoredProps[I], CompName, PropName) then
  332.           CheckAddItem(CompName, PropName);
  333.       end;
  334.       ListToIndex(StoredList, 0);
  335.     end;
  336.   end
  337.   else StoredList.Items.Clear;
  338.   UpdateCurrent;
  339. end;
  340. procedure TFormPropsDlg.SetStoredList(AList: TStrings);
  341. begin
  342.   BuildLists(AList);
  343.   if ComponentsList.Items.Count > 0 then
  344.     ComponentsList.ItemIndex := 0;
  345.   CheckButtons;
  346. end;
  347. procedure TFormPropsDlg.CheckButtons;
  348. var
  349.   Enable: Boolean;
  350. begin
  351.   AddButton.Enabled := (ComponentsList.ItemIndex >= 0) and
  352.     (PropertiesList.ItemIndex >= 0);
  353.   Enable := (StoredList.Items.Count > 0) and
  354.     (StoredList.ItemIndex >= 0);
  355.   DeleteButton.Enabled := Enable;
  356.   ClearButton.Enabled := Enable;
  357.   UpBtn.Enabled := Enable and (StoredList.ItemIndex > 0);
  358.   DownBtn.Enabled := Enable and (StoredList.ItemIndex < StoredList.Items.Count - 1);
  359. end;
  360. procedure TFormPropsDlg.AddButtonClick(Sender: TObject);
  361. var
  362.   I: Integer;
  363. begin
  364.   if PropertiesList.SelCount > 0 then begin
  365.     for I := PropertiesList.Items.Count - 1 downto 0 do begin
  366.       if PropertiesList.Selected[I] then
  367.         AddItem(ComponentsList.ItemIndex, I, False);
  368.     end;
  369.     UpdateCurrent;
  370.   end
  371.   else AddItem(ComponentsList.ItemIndex, PropertiesList.ItemIndex, True);
  372.   CheckButtons;
  373. end;
  374. procedure TFormPropsDlg.ClearButtonClick(Sender: TObject);
  375. begin
  376.   if StoredList.Items.Count > 0 then begin
  377.     SetStoredList(nil);
  378.     if FDesigner <> nil then FDesigner.Modified;
  379.   end;
  380. end;
  381. procedure TFormPropsDlg.DeleteButtonClick(Sender: TObject);
  382. begin
  383.   DeleteProp(StoredList.ItemIndex);
  384. end;
  385. procedure TFormPropsDlg.ListClick(Sender: TObject);
  386. begin
  387.   if Sender = ComponentsList then UpdateCurrent
  388.   else CheckButtons;
  389. end;
  390. procedure TFormPropsDlg.FormDestroy(Sender: TObject);
  391. begin
  392.   ClearLists;
  393. end;
  394. procedure TFormPropsDlg.StoredListClick(Sender: TObject);
  395. begin
  396.   CheckButtons;
  397. end;
  398. procedure TFormPropsDlg.UpBtnClick(Sender: TObject);
  399. begin
  400.   BoxMoveFocusedItem(StoredList, StoredList.ItemIndex - 1);
  401.   if FDesigner <> nil then FDesigner.Modified;
  402.   CheckButtons;
  403. end;
  404. procedure TFormPropsDlg.DownBtnClick(Sender: TObject);
  405. begin
  406.   BoxMoveFocusedItem(StoredList, StoredList.ItemIndex + 1);
  407.   if FDesigner <> nil then FDesigner.Modified;
  408.   CheckButtons;
  409. end;
  410. procedure TFormPropsDlg.StoredListDragOver(Sender, Source: TObject; X,
  411.   Y: Integer; State: TDragState; var Accept: Boolean);
  412. begin
  413.   BoxDragOver(StoredList, Source, X, Y, State, Accept, StoredList.Sorted);
  414.   CheckButtons;
  415. end;
  416. procedure TFormPropsDlg.StoredListDragDrop(Sender, Source: TObject; X,
  417.   Y: Integer);
  418. begin
  419.   BoxMoveFocusedItem(StoredList, StoredList.ItemAtPos(Point(X, Y), True));
  420.   if FDesigner <> nil then FDesigner.Modified;
  421.   CheckButtons;
  422. end;
  423. procedure TFormPropsDlg.PropertiesListDblClick(Sender: TObject);
  424. begin
  425.   if AddButton.Enabled then AddButtonClick(nil);
  426. end;
  427. end.