home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 September / Chip_2002-09_cd1.bin / zkuste / delphi / kolekce / d56 / XMLCOMP.ZIP / DnXmlComponentChooserForm.pas < prev    next >
Pascal/Delphi Source File  |  2002-06-11  |  3KB  |  102 lines

  1. unit DnXmlComponentChooserForm;
  2.  
  3. interface
  4.  
  5. {$I DnXml.inc}
  6.  
  7. uses
  8.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  9.   ComCtrls, {$IFDEF DNXML_D6} DesignIntf {$ELSE} DsgnIntf {$ENDIF};
  10.  
  11. type
  12.   {$ifdef DNXML_D6}
  13.     IFormDesigner = IDesigner;
  14.   {$endif}
  15.  
  16.   TfmDnXmlComponentChooser = class(TForm)
  17.     TreeView1: TTreeView;
  18.     procedure FormShow(Sender: TObject);
  19.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  20.       Shift: TShiftState);
  21.     procedure TreeView1DblClick(Sender: TObject);
  22.   private
  23.     FDesigner: IFormDesigner;
  24.     FSelected: TComponent;
  25.     procedure GetStrProc(const S: String);
  26.   public
  27.     procedure UpdateContents;
  28.     property Designer: IFormDesigner read FDesigner write FDesigner;
  29.     property Selected: TComponent read FSelected write FSelected;
  30.   end;
  31.  
  32. implementation
  33.  
  34. {$R *.DFM}
  35.  
  36. uses
  37.   TypInfo;
  38.  
  39. procedure TfmDnXmlComponentChooser.FormShow(Sender: TObject);
  40. begin
  41.   UpdateContents;
  42. end;
  43.  
  44. procedure TfmDnXmlComponentChooser.GetStrProc(const S: String);
  45. var comp: TComponent;
  46.     node: TTreeNode;
  47.  
  48.   procedure _Recurse(aNode: TTreeNode; aComponent: TComponent);
  49.   var subnode: TTreeNode;
  50.       iComp: Integer;
  51.       subcomp: TComponent;
  52.   begin
  53.     for iComp := 0 to aComponent.ComponentCount - 1 do
  54.     begin
  55.       subcomp := aComponent.Components[iComp];
  56.       subnode := TreeView1.Items.AddChild(aNode, subcomp.ClassName);
  57.       subnode.Data := subcomp;
  58.       if Selected = subcomp then
  59.         subnode.Selected := True;
  60.       _Recurse(subnode, subcomp);
  61.     end;
  62.   end;
  63.  
  64. begin
  65.   comp := Designer.GetComponent(S);
  66.   node := TreeView1.Items.AddChild(nil, S + ': ' + comp.ClassName);
  67.   node.Data := comp;
  68.   if Selected = comp then
  69.     node.Selected := True;
  70.   _Recurse(node, comp);
  71. end;
  72.  
  73. procedure TfmDnXmlComponentChooser.UpdateContents;
  74. var typedata: PTypeData;
  75. begin
  76.   TreeView1.Items.BeginUpdate;
  77.   try
  78.     typedata := GetTypeData(TypeInfo(TComponent));
  79.     Designer.GetObjectNames(typedata, GetStrProc);
  80.   finally
  81.     TreeView1.Items.EndUpdate;
  82.   end;
  83. end;
  84.  
  85. procedure TfmDnXmlComponentChooser.FormKeyDown(Sender: TObject;
  86.   var Key: Word; Shift: TShiftState);
  87. begin
  88.   if Key = VK_ESCAPE then
  89.     ModalResult := mrCancel;
  90. end;
  91.  
  92. procedure TfmDnXmlComponentChooser.TreeView1DblClick(Sender: TObject);
  93. begin
  94.   if TreeView1.Selected <> nil then
  95.   begin
  96.     FSelected := TreeView1.Selected.Data;
  97.     ModalResult := mrOk;
  98.   end;
  99. end;
  100.  
  101. end.
  102.