Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Frage zu TMenuItem.Create (https://www.delphipraxis.net/72050-frage-zu-tmenuitem-create.html)

PeterPanino 24. Jun 2006 16:12


Frage zu TMenuItem.Create
 
Ich möchte zur Laufzeit in einem PopupMenü 'MeinPopupMenue' unter dem Menüeintrag 'DieserMenueEintrag' ein Untermenü erstellen. Muss dann bei der Erzeugung des neuen Untermenüeintrages dieser der Popupmenü-Komponente 'MeinPopupMenue' oder dem Menüeintrag 'DieserMenueEintrag' zugewiesen werden?:

Delphi-Quellcode:
NewItem := TMenuItem.Create(MeinPopupMenue);
//oder:
NewItem := TMenuItem.Create(DieserMenueEintrag);
In der Delphi-Hilfe steht:

Zitat:

Delphi-Quellcode:
constructor Create(AOwner: TComponent);
AOwner bezeichnet die Eigentümerkomponente, die für die Freigabe des Menüeintrags zuständig ist.
Es steht aber nicht da, wer dann die erzeugten Untermenüeinträge freigibt: Die Popupmenü-Komponente oder der Menüeintrag, unter dem das Untermenü erstellt wird?

mkinzler 24. Jun 2006 16:17

Re: Frage zu TMenuItem.Create
 
Zitat:

Es steht aber nicht da, wer dann die erzeugten Untermenüeinträge freigibt
dafür ist der parent zuständig, also die Komponente, die du dem Konstruktor übergeben hast.

dataspider 24. Jun 2006 16:30

Re: Frage zu TMenuItem.Create
 
Hi,

normalerweise sollte der MenuItem dem Formular gehören. Dieses gibt den Item auch wieder frei.
Folgende Vorgehensweise würde ich wählen:

Delphi-Quellcode:
Var
  NewItem: TMenuItem;
begin
  // Self, also Form ist Owner und damit für die Freigabe zuständig...
  NewItem := TMenuItem.Create(Self);
  NewItem.Caption := 'New Item';

  // der neue MenuItem wir ins Menü integriert
  ExistingMenuItem.Add(NewItem);
end;
Cu, Frank

PeterPanino 24. Jun 2006 16:51

Re: Frage zu TMenuItem.Create
 
Zitat:

Zitat von dataspider
normalerweise sollte der MenuItem dem Formular gehören.

Wieso dem Formular? Sollte ein MenuItem nicht dem Menü gehören?

dataspider 24. Jun 2006 17:11

Re: Frage zu TMenuItem.Create
 
Zitat:

Zitat von PeterPanino
Wieso dem Formular? Sollte ein MenuItem nicht dem Menü gehören?

Wenn man in Delphi ein Formular erzeugt und Komponenten drauflegt, so weist auch Delphi den Komponenten als Owner immer das Formular zu, auch wenn der Parent z.B. ein Panel ist.
Die eingefügte Komponente wird dann in der Liste Components des Formulares aufgenommen und beim Zerstören des Formulares freigegeben.
Ich kann natürlich auch das PopupMenu als Owner im Constructor übergeben, da auch TPopupMenu von TComponent abgeleitet ist und damit eine Liste von Komponenten verwalten kann. Eine Freigabe des Menuitem ist damit auch gesichert.
Ich halte mich nur gern an das Konzept von Delphi.
Wichtig ist aber, dass man Owner und Parent nicht verwechselt und bewusst einsetzt.

Cu, Frank

dataspider 24. Jun 2006 17:15

Re: Frage zu TMenuItem.Create
 
Ach ja,

der Nachteil, wenn man nicht das Formular als Owner übergibt:

Man kann nichtr mehr alle Komponenten des Formulares in einer einfachen Schleife iterieren,
Delphi-Quellcode:
for i := 0 to Pred(ComponentCount) do
   if Components[i] is TMenuItem then
     ...;
da ja das Formular den MenuItem dann nicht in der Liste verwaltet.
Das muss man dan rekursiv über alle Components erledigen.

Frank

mkinzler 24. Jun 2006 17:17

Re: Frage zu TMenuItem.Create
 
Das sehe ich in diesem Fall als kein Problem an, wenn man nicht viele Menüs pro Form hat.

dataspider 24. Jun 2006 17:30

Re: Frage zu TMenuItem.Create
 
Zitat:

Zitat von mkinzler
Das sehe ich in diesem Fall als kein Problem an, wenn man nicht viele Menüs pro Form hat.

Ich wollte auch nicht rüberbringen, dass es ein Problem ist.
Aber wenn man ein einheitliches Konzept von Anfang an fährt, spart man sich für die Zukunft unter Umständen eine Menge Sucharbeit.

... du hast sicher auch Owner statt Parent schreiben wollen... :wink:

Frank

mkinzler 24. Jun 2006 17:33

Re: Frage zu TMenuItem.Create
 
Zitat:

... du hast sicher auch Owner statt Parent schreiben wollen... Wink
Natürlich, den übergibt man ja auch im Konstruktor. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:54 Uhr.

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