Поместить список контролов и пунктов меню в TTreeView
Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch
uses
ComCtrls, Menus, Classes, Forms, Controls, Windows, Messages;
function GetControlCaption(Control: TWinControl): ShortString;
// Slightly modified version of Twister's Tip
//
// function GetCaptionAtPoint(pt: TPoint): string;
//
var
TextLength: Integer;
Text: PChar;
begin
if not Boolean(Control.Handle) then Exit;
Result := Control.Name; // if Control doesn't have Caption
// Control.Name is returned
TextLength := SendMessage(Control.Handle, WM_GETTEXTLENGTH, 0, 0);
if TextLength 0 then
begin
GetMem(Text, TextLength + 1);
SendMessage(Control.Handle, WM_GETTEXT, TextLength + 1, Integer(Text));
Result := Text;
FreeMem(Text);
end;
end;
// function GetCaptionAtPoint(pt: TPoint): ShortString;
// begin
// Result:= GetControlCaption(FindVCLWindow(pt));
// end;
procedure FindAllMenuItems(AppTree: TTreeView; MenuItem: TMenuItem; Parent: TTreeNode);
var
loop: Integer;
Node: TTreeNode;
mItem: TMenuItem;
Name: ShortString;
begin
for loop := 0 to MenuItem.Count - 1 do
begin
mItem := MenuItem.Items[loop];
Name := mItem.Caption;
Node := AppTree.Items.AddChildObject(Parent, Name, mItem);
if mItem.Count 0 then findAllMenuItems(AppTree, mItem, Node);
end;
end;
procedure FindAllControls(AppTree: TTreeView; Comp: TComponent; Parent: TTreeNode);
var
Child: TComponent;
loop, start, Index: Integer;
Name: ShortString;
Node, Mnode: TTreeNode;
begin
start := 0;
if Comp is TApplication then
begin
// Parent:= AppTree.Items.AddObjectFirst(Parent, 'Application', nil);
// if you want to see the root ('Application') uncomment
start := 1;
end;
for loop := start to Comp.ComponentCount - 1 do
begin
Child := Comp.Components[loop];
Name := Child.Name;
if Child is TControl then
begin
if Child is TWinControl then
begin // does Child have Caption property??
Name := GetControlCaption(TWinControl(Child));
end;
Node := AppTree.Items.AddChildObject(Parent, Name, Child);
if Child.ComponentCount 0 then FindAllControls(AppTree, Child, Node);
end;
if Child is TMenu then
begin
Node := AppTree.Items.AddChildObject(Parent, Name, Child);
for Index := 0 to TMenu(Child).Items.Count - 1 do
begin
Mnode := AppTree.Items.AddChildObject(Node, TMenu(Child).Items[Index].Caption,
TMenu(Child).Items[Index]);
FindAllMenuItems(AppTree, TMenu(Child).Items[Index], Mnode);
end;
end;
end;
end;
|