home *** CD-ROM | disk | FTP | other *** search
- unit AddInFormU;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ComCtrls, ExtCtrls, Grids;
-
- type
- TObjectBrowserForm = class(TForm)
- Splitter1: TSplitter;
- Splitter2: TSplitter;
- TvOwnerHierarchy: TTreeView;
- Label1: TLabel;
- BtnUpdate: TButton;
- GrdProp: TStringGrid;
- TCPropType: TTabControl;
- Label2: TLabel;
- TvChildrenHierarchy: TTreeView;
- Splitter3: TSplitter;
- Label3: TLabel;
- TvClassHierarchy: TTreeView;
- procedure FormShow(Sender: TObject);
- procedure BtnUpdateClick(Sender: TObject);
- procedure TvOwnerHierarchyChange(Sender: TObject; Node: TTreeNode);
- procedure TCPropTypeChange(Sender: TObject);
- private
- { Private declarations }
- procedure ListComponents(Root: TComponent; RootNode: TTreeNode);
- procedure ListChildren(Control: TWinControl; RootNode: TTreeNode);
- procedure ListClasses(Comp: TComponent);
- public
- { Public declarations }
- procedure ShowChildrenHierarchy(Comp: TComponent);
- procedure ShowClassHierarchy(Comp: TComponent);
- procedure ShowProperties(Comp: TComponent);
- end;
-
- var
- ObjectBrowserForm: TObjectBrowserForm;
-
- implementation
-
- uses
- TypInfo, Menus;
-
- {$R *.DFM}
-
- procedure TObjectBrowserForm.FormShow(Sender: TObject);
- begin
- BtnUpdate.Click;
- end;
-
- procedure TObjectBrowserForm.ListComponents(Root: TComponent; RootNode: TTreeNode);
- var
- Loop: Integer;
- begin
- for Loop := 0 to Root.ComponentCount - 1 do
- ListComponents(
- Root.Components[Loop],
- TvOwnerHierarchy.Items.AddChildObject(
- RootNode,
- Format('%s (%s)',
- [Root.Components[Loop].Name,
- Root.Components[Loop].ClassName]),
- Root.Components[Loop]))
- end;
-
- procedure TObjectBrowserForm.BtnUpdateClick(Sender: TObject);
- begin
- TvOwnerHierarchy.Items.BeginUpdate;
- TvOwnerHierarchy.Items.Clear;
- ListComponents(
- Application,
- TvOwnerHierarchy.Items.AddObject(
- nil,
- 'Application (TApplication)',
- Pointer(Application)));
- TvOwnerHierarchy.FullExpand;
- TvOwnerHierarchy.TopItem := TvOwnerHierarchy.Items[0];
- TvOwnerHierarchy.Items.EndUpdate;
- end;
-
- procedure TObjectBrowserForm.TvOwnerHierarchyChange(Sender: TObject;
- Node: TTreeNode);
- begin
- ShowProperties(TComponent(Node.Data));
- ShowClassHierarchy(TComponent(Node.Data));
- ShowChildrenHierarchy(TComponent(Node.Data))
- end;
-
- procedure TObjectBrowserForm.ListChildren(Control: TWinControl; RootNode: TTreeNode);
- var
- Loop: Integer;
- NewNode: TTreeNode;
- begin
- for Loop := 0 to Control.ControlCount - 1 do
- begin
- NewNode := TvChildrenHierarchy.Items.AddChildObject(
- RootNode, Format('%s (%s)',
- [Control.Controls[Loop].Name,
- Control.Controls[Loop].ClassName]),
- Control.Controls[Loop]);
- if Control.Controls[Loop] is TWinControl then
- ListChildren(TWinControl(Control.Controls[Loop]), NewNode);
- end
- end;
-
- procedure TObjectBrowserForm.ShowChildrenHierarchy(Comp: TComponent);
- begin
- TvChildrenHierarchy.Items.BeginUpdate;
- TvChildrenHierarchy.Items.Clear;
- if Comp is TWinControl then
- ListChildren(
- TWinControl(Comp),
- TvChildrenHierarchy.Items.Add(
- nil,
- Format('%s (%s)', [Comp.Name, Comp.ClassName])));
- TvChildrenHierarchy.FullExpand;
- TvChildrenHierarchy.Items.EndUpdate;
- end;
-
- procedure TObjectBrowserForm.ListClasses(Comp: TComponent);
- var
- CurrentClass: TClass;
- OldNode: TTreeNode;
- begin
- CurrentClass := Comp.ClassType;
- OldNode := nil;
- while Assigned(CurrentClass) do
- begin
- OldNode := TvClassHierarchy.Items.AddChild(OldNode, CurrentClass.ClassName);
- CurrentClass := CurrentClass.ClassParent
- end
- end;
-
- procedure TObjectBrowserForm.ShowClassHierarchy(Comp: TComponent);
- begin
- TvClassHierarchy.Items.BeginUpdate;
- TvClassHierarchy.Items.Clear;
- ListClasses(Comp);
- TvClassHierarchy.FullExpand;
- TvClassHierarchy.Items.EndUpdate;
- end;
-
- procedure TObjectBrowserForm.TCPropTypeChange(Sender: TObject);
- begin
- ShowProperties(TComponent(TCPropType.Tag))
- end;
-
- procedure TObjectBrowserForm.ShowProperties(Comp: TComponent);
- const
- PropTypes: array[0..1] of TTypeKinds = (tkProperties, tkMethods);
- BitsInAnInteger = SizeOf(Integer) * 8;
- type
- TIntegerSet = set of 0..BitsInAnInteger - 1;
- var
- Loop: Integer;
- List: TPropList;
- Count: Integer;
- ASet: TIntegerSet;
- ASetMember: Integer;
- AMethod: TMethod;
- AnObject: TObject;
- S: String;
- begin
- TCPropType.Tag := Integer(Comp);
- FillChar(List, SizeOf(List), 0);
- Count := GetPropList(
- Comp.ClassInfo, PropTypes[TCPropType.TabIndex], @List);
- GrdProp.RowCount := Count;
- //If you set a grid's row count to 0, it sets it to 1
- if Count = 0 then
- begin
- GrdProp.Cells[0, 0] := '';
- GrdProp.Cells[1, 0] := '';
- end;
- //Loop through properties, getting a text version to display
- for Loop := 0 to Count - 1 do
- begin
- if List[Loop] <> nil then
- begin
- GrdProp.Cells[0, Loop] := List[Loop].Name;
- case List[Loop].PropType^.Kind of
- tkInteger:
- begin
- if List[Loop].Name = 'Color' then
- GrdProp.Cells[1, Loop] := ColorToString(TColor(GetOrdProp(Comp, List[Loop])))
- else
- if (List[Loop].Name = 'Cursor') or (List[Loop].Name = 'DragCursor') then
- GrdProp.Cells[1, Loop] := CursorToString(TCursor(GetOrdProp(Comp, List[Loop])))
- else
- if List[Loop].Name = 'ShortCut' then
- GrdProp.Cells[1, Loop] := ShortCutToText(GetOrdProp(Comp, List[Loop]))
- else
- GrdProp.Cells[1, Loop] := IntToStr(GetOrdProp(Comp, List[Loop]))
- end;
- tkChar, tkWChar:
- GrdProp.Cells[1, Loop] := Chr(GetOrdProp(Comp, List[Loop]));
- tkSet:
- begin
- Integer(ASet) := GetOrdProp(Comp, List[Loop]);
- S := '[';
- for ASetMember := 0 to BitsInAnInteger - 1 do
- if ASetMember in ASet then
- begin
- if Length(S) <> 1 then
- S := S + ',';
- S := S + GetEnumName(GetTypeData(List[Loop].PropType^)^.CompType^, ASetMember);
- end;
- GrdProp.Cells[1, Loop] := S + ']';
- end;
- tkClass:
- begin
- AnObject := TObject(GetOrdProp(Comp, List[Loop]));
- if Assigned(AnObject) and
- (AnObject is TComponent) and
- (TComponent(AnObject).Name <> '') then
- GrdProp.Cells[1, Loop] := TComponent(AnObject).Name
- else
- GrdProp.Cells[1, Loop] :=
- '(' + GetTypeData(List[Loop].PropType^)^.ClassType.ClassName + ')';
- end;
- tkEnumeration:
- GrdProp.Cells[1, Loop] :=
- GetEnumName(List[Loop].PropType^, GetOrdProp(Comp, List[Loop]));
- tkFloat:
- GrdProp.Cells[1, Loop] :=
- FloatToStr(GetFloatProp(Comp, List[Loop]));
- tkString, tkLString, tkWString:
- GrdProp.Cells[1, Loop] := GetStrProp(Comp, List[Loop]);
- tkMethod:
- begin
- AMethod := GetMethodProp(Comp, List[Loop]);
- if AMethod.Code = nil then
- GrdProp.Cells[1, Loop] := ''
- else
- //If the method was not published, it's name will
- //not be available, so get its address instead
- try
- GrdProp.Cells[1, Loop] :=
- (TObject(AMethod.Data) as TComponent).MethodName(AMethod.Code)
- except
- GrdProp.Cells[1, Loop] := Format('$%p', [AMethod.Code]);
- end
- end
- end
- end
- end
- end;
-
- initialization
- RegisterClass(TPanel)
- end.
-