Zitat von
negaH:
Korrekt, und mit System.EnumModules() kannst du über die geladenen Packages iterieren.
Danke, aber irgendwie funnktioniert das nicht richtig bei mir.
Dein hier geposteter Quellcode funktioniert bei mir so nicht.
Folgende Dinge musste ich ändern:
- Memo1.BeginUpdate und Memo1.EndUpdate gibts bei meinem Delphi 7 TMemo nicht
- EnumTypeInfo fibt bei mir nicht Boolean, sondern PTypeInfo zurück
- EnumModules(@MyEnumModule, self); musste ich zu EnumModules(TEnumModuleFunc(@MyEnumModule), self); ändern (gab Fehlermeldung wegen mehrdeutiger Überladung)
- Result := not EnumTypeInfo(Instance, @MyEnumTypeInfo, Data); musste ich nach EnumTypeInfo(Instance, @DoTypeInfo, Data); ändern, da MyEnumTypeInfo nicht definiert ist.
- function TForm1.DoTypeInfo(Info: PTypeInfo): Boolean; register; musste ich nach function DoTypeInfo(UserData: Pointer; Info: PTypeInfo): Boolean; register; ändern (da TEnumTypeInfoCallback so definiert ist)
Ich hoffe das diese Änderungen so richtig sind.
Im Memo steht nun eine Liste der eingebundenen Klassen.
Leider nur die von Projekt1.exe nicht die der
Package, obwohl ich ein
Package mit LoadPackage('dclsockets70.bpl'); geladen habe.
Mein Versuch gestern mit Deiner
Unit brachten mich etwas weiter.
Ich habe einfach Deine
Unit wie folgt abgeändert: (2 x Ausgabe in Memo)
Delphi-Quellcode:
function RegClassesHandler(UserData: Pointer; Info: PTypeInfo): Boolean;
register;
var td:PTypeData;
begin
if Info^.Kind = tkClass
then
begin
td := GetTypeData(info);
if td^.ClassType.InheritsFrom(TPersistent)
then
begin
RegisterClass(TPersistentClass(td^.ClassType));
Form1.Memo1.Lines.Add('
Register: '+TPersistentClass(td^.ClassType).ClassName);
end;
Form1.Memo1.Lines.Add('
Unit:'+td^.UnitName+'
- Klasse: '+td^.ClassType.ClassName+
'
= class('+td^.ParentInfo^.
Name+'
)');
end;
result := false;
end;
Dabei ist mir folgendes aufgefallen:
1. Es werden nicht alle Komponenten gefunden.
2. RegisterClass wird nicht aufgerufen, obwohl TForm von TPersistent abgeleitet ist.
Hier die Ausgabe der Procedure für
Package dclstd70.bpl
Code:
Unit:FiltEdit - Klasse: TFilterEditor = class(TForm)
Unit:FiltEdit - Klasse: TFilterProperty = class(TStringProperty)
Unit:MaskText - Klasse: TMaskTextProperty = class(TStringProperty)
Unit:MaskText - Klasse: TMaskTextForm = class(TForm)
Unit:MaskProp - Klasse: TMaskProperty = class(TStringProperty)
Unit:MaskProp - Klasse: TMaskForm = class(TForm)
Unit:ItemEdit - Klasse: TItemInfo = class(TObject)
Unit:ItemEdit - Klasse: TListViewItems = class(TForm)
Unit:NodeEdit - Klasse: TTreeViewItems = class(TForm)
Unit:ImgEdit - Klasse: TImageInfo = class(TObject)
Unit:ImgEdit - Klasse: TImageListEditor = class(TForm)
Unit:NewStdAc - Klasse: TNewStdActionDlg = class(TForm)
Unit:ActnDrag - Klasse: TActionDragObject = class(TDragControlObject)
Unit:ActnEdit - Klasse: TActionImageListListener = class(TChangeLink)
Unit:ActnEdit - Klasse: TActionListDesigner = class(TToolbarDesignWindow)
Unit:ActnRes - Klasse: TStandardActions = class(TDataModule)
Unit:XPMan - Klasse: TXPManifest = class(TComponent)
Unit:SBarEdit - Klasse: TStatusBarEditor = class(TForm)
Unit:ColEdit - Klasse: TColInfo = class(TObject)
Unit:ColEdit - Klasse: TListViewColumns = class(TForm)
Unit:HCtlEdit - Klasse: THeaderControlEditor = class(TForm)
Unit:DdeReg - Klasse: TSrvrConvEdit = class(TDefaultEditor)
Unit:DdeReg - Klasse: TCliConvEdit = class(TDefaultEditor)
Unit:DdeReg - Klasse: TSrvrItemEdit = class(TDefaultEditor)
Unit:DdeReg - Klasse: TDdeLinkDlg = class(TForm)
Unit:DdeReg - Klasse: TDdeLinkInfoProperty = class(TPropertyEditor)
Unit:DdeReg - Klasse: TDdeClientItemProperty = class(TStringProperty)
In dem
Package sind aber noch folgende Komponenten registriert:
TOpenDialog, TSaveDialog, TOpenPictureDialog, TSavePictureDialog, TFontDialog, TColorDialog, TPrintDialog, TPrinterSetupDialog, TFindDialog, TReplaceDialog, TPageSetupDialog, TTimer, TPaintBox, TMediaPlayer, TMainMenu, TPopupMenu, TLabel, TEdit, TMemo, TButton, TCheckBox, TRadioButton, TListBox, TComboBox, TScrollBar, TGroupBox, TRadioGroup, TPanel, TActionList, TBitBtn, TSpeedButton, TMaskEdit, TStringGrid, TDrawGrid, TImage, TShape, TBevel, TScrollBox, TCheckListBox, TSplitter, TStaticText, TControlBar, TApplicationEvents, TValueListEditor, TLabeledEdit, TColorBox, TTabControl, TPageControl, TImageList, TRichEdit, TTrackBar, TProgressBar, TUpDown, THotKey, TAnimate, TDateTimePicker, TMonthCalendar, TTreeView, TListView, THeaderControl, TStatusBar, TToolBar, TCoolBar, TPageScroller, TComboBoxEx, TXPManifest, TOleContainer, TCOMAdminCatalog, TDdeClientConv, TDdeClientItem, TDdeServerConv und TDdeServerItem
Für das
Package dclsockets70.bpl zeigt mir Deine Funktion gar nichts an, aber es sind die Komponenten
TClientSocket und TServerSocket enthalten