http://kingron.myetang.com/vcl_component.gifVCL的继承层次图,GIF图形,目前只画了可视组件的部分,本来WinControl也Draw完成了的但是他妈的M$的软件出现了错误,在我最后一次操作的时候,丢失了全部的数据,因此重新Draw的时候,就只有这一部分了,他妈的,害得我一个晚上白干了!我FUCK M$....赫赫,等下又要被人骂“端起碗来吃饭,放下筷子骂娘”了!
调试欢乐多
真是谢谢你了
csdn多点您这样的高手,我辈菜鸟就有幸了:)
楼上的,kingron大虾什么时候写书的?
不知道你将如何处理TBits等小类?
Thans a lot.
你描述的情况真令人同情...
哎,微软的这些破烂东西!华而不实!
太cool了谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢!期待下文
为何舍近求远。
太感谢kingron了:)
看不到呀!拜托贴到CSDN上吧!!!
不过如果是文本文件就好了,方便Ctrl+C,Ctrl+V
顯示vcl的極少部份呢.
Thanks a lot!
http://www.csdn.net/expert/topic/672/672817.xml?temp=.4878961
谢谢
Word文档?没有........
嘻嘻嘻我将用代码来实现VCL继承层次图嘻嘻嘻嘻
嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻Classes -> LineText -> TTreeView -> TreeText
你做我就不作了.......,我的思路还没有整理好,也是准备用TreeView来做....
做好了,通知我一下哦.......要不要数据文件?我有类层次数据文件.....,Excel的,你要Access的我也可以转换出来........
TPersistent
TComponent
TControl
TGraphicControl
TCustomLabel
TLabel
TSpeedButton
TBevel
TShape
TImage
TWinControl
TCustomTreeView
TTreeView
TCustomEdit
TCustomMemo
TMemo
TEdit
TCustomMaskEdit
TMaskEdit
TButtonControl
TButton
TBitBtn
TCustomCheckBox
TCheckBox
TRadioButton
TCustomListControl
TCustomMultiSelectListControl
TCustomListBox
TListBox
TCustomCombo
TCustomComboBox
TComboBox
TScrollBar
TCustomControl
TCustomGroupBox
TGroupBox
TCustomGrid
TCustomDrawGrid
TDrawGrid
TStringGrid
TCustomPanel
TPanel
TCommonCalendar
TDateTimePicker
TMonthCalendar
TCustomHotKey
THotKey
TAnimate
TMenu
TMainMenu
TPopupMenu
TCustomActionList
TActionList
TCustomImageList
TDragImageList
TImageList
begin
Result := '';
while Assigned(mClass) do begin
Result := mClass.ClassName + mDelimiter + Result;
mClass := mClass.ClassParent;
end;
Delete(Result, Length(Result) - Length(mDelimiter) + 1, MaxInt);
end; { ClassHierarchy }function StrLeft(const mStr: string; mDelimiter: string): string;
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function StrRight(const mStr: string; mDelimiter: string): string;
begin
if Pos(mDelimiter, mStr) <= 0 then
Result := ''
else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }function ListCount(mList: string; mDelimiter: string = ','): Integer;
var
I, L: Integer;
begin
Result := 0;
if mList = '' then Exit;
L := Length(mList);
I := Pos(mDelimiter, mList);
while I > 0 do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(Result);
end;
Inc(Result);
end; { ListCount }function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string;
var
I, L, K: Integer;
begin
L := Length(mList);
I := Pos(mDelimiter, mList);
K := 0;
Result := '';
while (I > 0) and (K <> mIndex) do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(K);
end;
if K = mIndex then Result := StrLeft(mList + mDelimiter, mDelimiter);
end; { ListValue }function TreeNodeString(mTreeNode: TTreeNode; mDelimiter: string = '\'): string;
begin
Result := '';
while Assigned(mTreeNode) do begin
Result := mTreeNode.Text + mDelimiter + Result;
mTreeNode := mTreeNode.Parent;
end;
Delete(Result, Length(Result) - Length(mDelimiter) + 1, MaxInt);
end; { TreeNodeString }function TreeViewToLineText(mTreeView: TTreeView; mStrings: TStrings;
mDelimiter: string = '\'): Boolean;
var
I: Integer;
begin
Result := False;
if not (Assigned(mTreeView) and Assigned(mStrings)) then Exit;
mStrings.Clear;
for I := 0 to mTreeView.Items.Count - 1 do
if mTreeView.Items[I].Count = 0 then
mStrings.Add(TreeNodeString(mTreeView.Items[I], mDelimiter));
Result := True;
end; { TreeViewToLineText }function LineTextToTreeView(mStrings: TStrings; mTreeView: TTreeView;
mDelimiter: string = '\'): Boolean;
var
I, J, K: Integer;
vStrPath: string;
vStrText: string;
vTreeNode: TTreeNode;
vBoolFind: Boolean;
begin
Result := False;
if not (Assigned(mTreeView) and Assigned(mStrings)) then Exit;
mTreeView.Items.Clear;
for I := 0 to mStrings.Count - 1 do begin
vStrPath := '';
vTreeNode := nil;
for J := 0 to ListCount(mStrings[I], mDelimiter) - 1 do begin
vStrText := ListValue(mStrings[I], J, mDelimiter);
vStrPath := vStrPath + mDelimiter + vStrText;
vBoolFind := False;
for K := 0 to mTreeView.Items.Count - 1 do
if mDelimiter + TreeNodeString(mTreeView.Items[K], mDelimiter) =
vStrPath then begin
vTreeNode := mTreeView.Items[K];
vBoolFind := True;
Break;
end;
if vBoolFind then Continue;
vTreeNode := mTreeView.Items.AddChild(vTreeNode, vStrText);
end;
end;
Result := True;
end; { LineTextToTreeView }procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
Memo1.WordWrap := False;
Memo1.Clear;
for I := 0 to ComponentCount - 1 do
Memo1.Lines.Add(ClassHierarchy(Components[I].ClassType));
LineTextToTreeView(Memo1.Lines, TreeView1);
TreeView1.SaveToFile('c:\temp.txt');
end;
Memo1.Lines.Add(ClassHierarchy(TMemoryStream));
.............................................
我已经想办法了,想利用单元名来取得
http://www.csdn.net/Expert/TopicView1.asp?id=683443
就只有手工一个个的加代码
“Memo1.Lines.Add(ClassHierarchy(????????????));”
嘻嘻嘻MyBase一样的功能!嘻嘻嘻嘻
数据域,方法就很难了。
前几天我琢磨想得到一个类的一个Published属性最初定义在哪个父类的
Protected部分,研究了一天没结果。:(
我做出个VCL完整类树,可以类继承方式/类层次两中方式查看整个VCL类信息。
有列出所有published属性,查找一个类,查找一个属性发布在哪个类等功能。
代码行数:400行。
使用控件:TreeView
使用函数:GetPropInfo,IsPublishedProp,TObject.ClassParent
E-mail: [email protected]
*******************************************************************
到这里下载我做的程序,按2种方式查看Delphi所有VCL类继承关系:
http://www.softreg.com.cn/shareware_view.asp?id={EEEF56C0-C9B8-4D72-90A6-5FF3C11813BE}
服务器有点慢,D5,D6,D7版程序做完了不过全部上传3M多,下载太慢,过两天
上传其他版的。