Ich würde das ganze als Interface umsetzen. Das macht weniger Aufwand, weil du die
MDI-Fenster nicht von einer Basisklasse ableiten musst. Und die Referenzzählung ist bei Formularen und Komponenten ohnehin deaktiviert.
Dann geht das nämlich einfach so:
Delphi-Quellcode:
type
IMDIChild = interface
['{80D62D80-EC9A-476A-99D4-54746544092F}']
procedure LoadFromFile(const AFilename: string);
end;
IMp3MDIChild = interface(IMDIChild)
['{044E0A1D-AB28-4DA4-9E48-A1DAE67AB0FC}']
function GetID3Name: string;
end;
TfrmMDIChild = class(TForm, IMDIChild, IMp3MDIChild)
public
procedure LoadFromFile(const AFilename: string);
function GetID3Name: string;
end;
Und dann kannst du direkt prüfen, ob es sich um ein passendes Kindfenster handelt:
Delphi-Quellcode:
var
CurrentChild: TForm;
MDIChild: IMDIChild;
Mp3Child: IMp3MDIChild;
begin
CurrentChild := ...;
if Supports(CurrentChild, IMDIChild, MDIChild) then
MDIChild.LoadFromFile(...);
// oder:
if Supports(CurrentChild, IMp3MDIChild, Mp3Child) then
ShowMessage(Mp3Child.GetID3Name);
Sprich mit Supports fragst du, ob das Fenster ein bestimmtes Interface implementiert. Und als dritten Parameter gibst du eine Variable, in die du dann eine entsprechende Referenz bekommst. Wenn Supports zurückgibt, dass es geklappt hat, kannst du dann direkt damit arbeiten.
So kannst du auch unterschiedliche Interfaces implementieren, die jeweils nur von einem Teil der
MDI-Childs unterstützt werden.
Am Rande:
MDI gilt schon seit einigen Jahren als veraltet. Für neue Anwendungen würde ich das eher nicht mehr benutzen.