Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Frage zu Methode (https://www.delphipraxis.net/190992-frage-zu-methode.html)

oakley 27. Nov 2016 16:58

Frage zu Methode
 
Hallo zusammen,

ich habe eine Prozedur als Methode auf verschiedenen Units als MDI Child die zwar in jeder Unit den gleichen Namen hat aber generell etwas anders macht.
Wenn ich nun im MDI Parent auf einen Button klicke soll diese Methode des aktuell aktiven MDI Child ausgeführt werden.

Wie macht man sowas? CHILDNAME.methodenname geht nicht weil CHILDNAME dynamisch ermittelt wird.
CHILDNAME.FindMethodenname as .... geht auch nicht.

LG

Mirko

himitsu 27. Nov 2016 17:26

AW: Frage zu Methode
 
Eine "gemeinsame" Vorfahrklasse für deine Klassen.
Dort die Methode als virtual rein und eventuell auch abstract, da der Vorfahre keine eigene Funktion hat.
Dann alle Klassen davon ableiten und diese Methode überscheiben (override).

Ein Cast in die Vorfahrklasse und man kann jeweils auf die aktuelle Implementation zugreifen.

siehe Delphi-Referenz durchsuchenTStrings (abstrakter Vorfahr) -> Delphi-Referenz durchsuchenTStringList (eine der vielen Implementationen)

oakley 27. Nov 2016 17:55

AW: Frage zu Methode
 
Okay danke ich lese es mir durch und probiere es.

Gruß

Mirko

jaenicke 28. Nov 2016 07:46

AW: Frage zu Methode
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz