Announcement

Collapse
No announcement yet.

MenuChanged-Event

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MenuChanged-Event

    Hallo,

    ich möchte eine Komponente erstellen, die den Inhalt eines Menüs anzeigt und selbständig auf Änderungen
    des TMainMenus/TMenuItem reagieren kann (löschen/zufügen von TMenuItems, disable/enable, Caption).
    Wie kann ich TMainMenu/TMenuItem dazu überreden, mit diese Änderungen mitzuteilen????

    Besten Dank im vorraus und
    Liebe Grüße
    Manfred

  • #2
    Hi

    sehr schwierig !
    Hast Du die originalen Sourcen der RTL ? Wenn ja schau doch mal in die Unit Menus. Dort wirst Du sehen das das Root-Menu durch seine Items usw. benachrichtigt wird wenn eine Änderung vorlag und auch eine Message (cm_MenuChanged) an das besitzende Fensterhandle verschickt wird. Leider, wie so oft, hat Borland kein entsprechendes Event published deklariert, meint also ALLES ist private.

    Folgender Trick:

    Kopiere den Deklarationabschnitt von TMenuItem in Deine Sourcen und benenne die Klasse um:

    <pre>
    type
    TMenuItemCracker = class(TComponent)
    private
    FCaption: string;
    FHandle: HMENU;
    FChecked: Boolean;
    FEnabled: Boolean;
    FDefault: Boolean;
    FRadioItem: Boolean;
    FVisible: Boolean;
    FGroupIndex: Byte;
    FBreak: TMenuBreak;
    FCommand: Word;
    FHelpContext: THelpContext;
    FHint: string;
    FItems: TList;
    FShortCut: TShortCut;
    FParent: TMenuItem;
    FMerged: TMenuItem;
    FMergedWith: TMenuItem;
    FMenu: TMenu;
    FOnChange: TMenuChangeEvent;
    FOnClick: TNotifyEvent;
    end;

    <pre>

    Jetzt hast Du mit einem Typecast

    TMenuItemCracker(MainMenu.Items).FOnChange,
    TMenuItemCracker(PopupMenu.Items).FOnChange

    Zugriff auf das originale OnChangeEvent des Menus/PopupMenus. Kannst also dort Dein eigens OnChangeEvent plazieren. ABER, vorher aktuellen Inhalt zwischenspeichern und in Deinem Event das originale Event aufrufen. Du hast Dich so "hinein-gehookt"

    Wie gesagt, das alles ist ein "schmutziger" Trick der hervorragend und sicher funktioniert, wenn man weis was man tut. Übrigens: für JEDE Delphiversion MUSST Du überprüfen ob sich die originale TMenuItem-Deklaration geändert hat, WICHTIG !!! Ansonsten gibt's Crashs....

    Gruß Hagen

    PS: good luck, als Komponentenentwickler

    Comment


    • #3
      Übrigens, obige TMenuItem Deklaration stammt aus D3

      Comment

      Working...
      X