MenuItem dynamisch hinzufügen funktioniert nicht

Rund um die LCL und andere Komponenten
Antworten
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von ConcAPPtLab »

Hallo allerseits,

ich möchte eine Anwendung mit mehreren verschiedenen Arbeitsflächen programmieren. Dabei ist eine Arbeitsfläche ein Panel (wer Blender kennt: ich möchte genau diese Art der Oberfläche nachmachen). Dabei soll jedes Panel auch ein MainMenu bekommen, das natürlich dynamisch erzeugt werden muss.

So weit mein Code:

Code: Alles auswählen

type
 
TSMMenu = class(TMainMenu)  //neue Klasse von MainMenu wegen benötigtem Startparameter
    private
    public
      constructor Create(cParent: TComponent; cMiTypes: array of TMiType);  //cMiTypes - eigener Startparameter. Ist die Menge der Typen der MenuItems, die im neuen MainMenu angezeigt werden sollen
  end;
 
  TSBuild = class(TPanel)     //ein einzelnes "Fenster" der Oberfläche -> Panel
  private
    Menu: TSMMenu;
  public
    constructor Create(cParent: TWinControl; cPos: TPoint);
  end;
 
 
implementation
 
TSMMenu.Create(cParent: TComponent; cMiTypes: array of TMiType);
var i: byte;
    NewItem: TMenuItem;
begin
  inherited Create(cParent);          //Erstellen des MainMenus
 
  Parent:=cParent;
 
  for i:=0 to length(cMiTypes)-1 do    //Erzeugen der MenuItems die angezeigt werden sollen
    begin
      case cMiTypes[i] of
        miContentType:
          begin
            NewItem:=TMenuItem.Create(Self);
            NewItem.Caption:='Ansicht';
            Items.Add(NewItem);
            MenuItem.Free;
           //später wird auch noch eine Prozedur hinzugefügt, versprochen ;)
          end;
      end;
    end;
end;
 
constructor TSBuild.Create(cParent: TWinControl; cPos: TPoint);
begin
  inherited Create(cParent);
 
  Parent:=cParent;
  Left:=cPos.X;
  Top:=cPos.Y;
 
  BevelOuter:=bvNone;
  BevelInner:=bvNone;
 
  Menu:=TSMMenu.Create(Self, [miContentType]);
end;
 
 
Dank Internet habe ich herausgefunden, wie man MenuItems in ein MainMenu einfügt. Dieser Code kompiliert auch ohne Probleme. Angezeigt wird aber: nichts!
Man sieht kein MainMenu, gerade so, als würde kein MenuItem im MainMenu sein. Durch den Debugger weiß ich aber, dass die Stelle, an der das MenuItem erzeugt wird, korrekt durchlaufen wird.

Weiß jemand, was ich falsch mache?

Grüße
ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von theo »

Man kann durchaus mal die angezeigten Meldungen lesen.

Code: Alles auswählen

unit1.pas(27,19) Warning: Eine Inherit-Methode wird durch constructor Create(TComponent;{Open} Array Of <erroneous type>); verdeckt
unit1.pas(34,17) Warning: Eine Inherit-Methode wird durch constructor Create(TWinControl;TPoint); verdeckt
override und inherited sind wahrsch. deine Freunde.

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von ConcAPPtLab »

Diese sind mir noch nie aufgefallen, weil die immer als erste kommen und innerhalb von Sekundenbruchteilen von hunderten anderen überschrieben werden
Zuletzt geändert von ConcAPPtLab am Fr 25. Mär 2016, 15:39, insgesamt 1-mal geändert.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von theo »

ConcAPPtLab hat geschrieben:Ich kriege diese Fehlermeldung nicht. Bei mir kompiliert alles.
Es sind Warnungen. Probiere trotzdem den Tipp.

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von ConcAPPtLab »

Jup, sorry, hab deinen Satz mit "Meldungen angezeigt" etc. überlesen. Ich guck mal nach wie ich das lösen kann. Danke für den Hinweis :)
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von ConcAPPtLab »

Override? Nicht Overload? ich möchte die alte ja nicht überschreiben sondern nur eine gleichnamige Prozedur erhalten.

Und egal ob Overload oder nicht. Auch mit Overload ist das Problem nicht gelöst (bei override kommt eine Fehlermeldung, da die Parameter nicht gleich sind)
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von theo »

Nee, hatte dein inherited überlesen.
Aber den Code verstehe ich eh nicht. was ist und was soll "MenuItem.Free;"?

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von Mathias »

Ist es überhaupt möglich ein TMainMenu auf ein Panel zu setzten ?
Ich habe dies auch schon vergeblich versucht, auch mit einem im Form-Designer erstellten MainMenu.
Es gibt gar kein TPanel.Menu .
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von ConcAPPtLab »

@theo: Mit dem Free bin ich nicht sicher gewesen, ob es gut/nötig ist. Ich weiß nicht, ob Objekte nach dem Durchlauf einer Prozedur automatisch sauber zerstört werden oder nicht. Um kein Risiko einzugehen, hab ichs per Hand gemacht.

@Mathias: Das könnte natürlich sein. Wäre ne Erklärung für das alles. TPanel.Menu...so gibt es das natürlich nicht. Aber ich kann es doch per Hand einfügen, oder etwa nicht?

Gibt es ne andere Möglichkeit, eine Panel-ähnliche Komponente, die MainMenus zulässt?

Bis hierhin schonmal einen kräftigen Dank an euch beide!
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von Mathias »

Ich wollte es mit einem Frame ausprobieren, da kann man ein MainMenu im Form-Designer erstellen, aber leider auch nicht sichtbar.
Es fehlt TFrame.Menu.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von theo »

ConcAPPtLab hat geschrieben:@theo: Mit dem Free bin ich nicht sicher gewesen, ob es gut/nötig ist. Ich weiß nicht, ob Objekte nach dem Durchlauf einer Prozedur automatisch sauber zerstört werden oder nicht. Um kein Risiko einzugehen, hab ichs per Hand gemacht.
Aber was freest du da eigentlich? Ich sehe keine Variable namens MenuItem.
Falls du NewItem meinst, das darfst du dort nicht freen.

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von ConcAPPtLab »

Habe ich MenuItem gesagt? Ich meine natürlich NewItem ^^

Warte...ich darf die dort nicht freeen weil nur der Zeiger zum MainMenu hinzugefügt worden ist, oder? Und wenn ich NewItem free, verweist der Zeiger beim MainMenu ins Leere?

So oder so...egal ob ich freee oder nicht: Das Ergebnis bleibt gleich.

@Mathias: Schade. TFrame wäre das Einzige was ich auch noch kenne... Gibt es vielleicht eine Alternative zum MainMenu?
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von Mathias »

Gibt es vielleicht eine Alternative zum MainMenu?
Das einzige was ich dir bieten kann, die MenuItems auf einer ToolBar.
Und die ToolBar kann man gut auf ein Panel legen.
Es bietet nicht ganz den Komfort eines echten Menüs, aber immerhin du kannst auf die MenuItems zugreifen.
Dateianhänge
ToolBar_Menu.zip
(124.94 KiB) 79-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: MenuItem dynamisch hinzufügen funktioniert nicht

Beitrag von ConcAPPtLab »

Na sieht doch gut aus :) Danke für die Hilfe, ich werde jetzt ne Toolbar nehmen (auch wenn sie nicht ganz so komfortabel erscheint ^^).

Auch nochmal Danke an theo.

Grüße
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Antworten