summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-02-20 16:04:51 +0000
committervincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-02-20 16:04:51 +0000
commit9fdd72a767f806fefe751dfb6a7208cac2030399 (patch)
treeaaec4c0406d446706c04e43b3800702eb3e4ebe2
parentefee8b7d09f1d0c1a0a93d4dc3b12b30396d3170 (diff)
downloadfpc-9fdd72a767f806fefe751dfb6a7208cac2030399.tar.gz
+ initial version of TReader.FindComponentClass, works with a simple LCL application
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/cleanroom@10369 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--rtl/objpas/classes/reader.inc44
1 files changed, 43 insertions, 1 deletions
diff --git a/rtl/objpas/classes/reader.inc b/rtl/objpas/classes/reader.inc
index 390111ece8..fc786a8a8a 100644
--- a/rtl/objpas/classes/reader.inc
+++ b/rtl/objpas/classes/reader.inc
@@ -1353,8 +1353,50 @@ begin
end;
function TReader.FindComponentClass(const AClassName: String): TComponentClass;
+
+var
+ PersistentClass: TPersistentClass;
+ UClassName: shortstring;
+
+ procedure FindInFieldTable(RootComponent: TComponent);
+ var
+ FieldClassTable: PFieldClassTable;
+ Entry: TPersistentClass;
+ i: Integer;
+ begin
+ FieldClassTable :=
+ PFieldTable((Pointer(RootComponent.ClassType)+vmtFieldTable)^)^.ClassTable;
+ if assigned(FieldClassTable) then begin
+ for i := 0 to FieldClassTable^.Count -1 do begin
+ Entry := FieldClassTable^.Entries[i];
+ if (UpperCase(Entry.ClassName)=UClassName) and
+ (Entry.InheritsFrom(TComponent)) then begin
+ Result := TComponentClass(Entry);
+ Break;
+ end;
+ end;
+ end;
+ end;
+
begin
- // Tainted
+ Result := nil;
+ UClassName:=UpperCase(AClassName);
+ FindInFieldTable(Root);
+
+ if (Result=nil) and assigned(LookupRoot) and (LookupRoot<>Root) then
+ FindInFieldTable(LookupRoot);
+
+ if (Result=nil) then begin
+ PersistentClass := GetClass(AClassName);
+ if PersistentClass.InheritsFrom(TComponent) then
+ Result := TComponentClass(PersistentClass);
+ end;
+
+ if (Result=nil) and assigned(OnFindComponentClass) then
+ OnFindComponentClass(Self, AClassName, Result);
+
+ if (Result=nil) or (not Result.InheritsFrom(TComponent)) then
+ raise EClassNotFound.CreateFmt(SClassNotFound, [AClassName]);
end;