Thema: Delphi Menüs zur Laufzeit

Einzelnen Beitrag anzeigen

DelphiSourcer

Registriert seit: 7. Feb 2005
43 Beiträge
 
Delphi 2006 Professional
 
#1

Menüs zur Laufzeit

  Alt 7. Feb 2005, 11:51
Hallo, liebe Delphianer!

Weil ich in die Tiefen der Delphi-Programmierung einsteigen will und als fortgeschrittener nun auch die Interna besser verstehen will, bin ich dabei,
Menüs zur Laufzeit zu erstellen und zur Laufzeit uneingeschränkt darauf zuzugreifen. Außerdem halte ich diese Vorgehensweise bei der Erstellung mehrsprachiger Anwendungen für unabdingbar, da ich dann die Captions der Menüeinträge leicht an die gewünschte Sprache anpassen kann. Leider funktionirt der Code noch nicht. Deshlb bitte ich um Eure Hilfe und zeige Euch an dieser Stelle meinen Quellcode:

{-----------------------------------------------------------------------------
Unit Name: main
Author: Projektmaster
Purpose: Building menus at runtime
History:
-----------------------------------------------------------------------------}


unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;

type
TForm1 = class(TForm)
LBox: TListBox;
btnShow: TButton;
btnEnde: TButton;
procedure FormCreate(Sender: TObject);
procedure Beenden1Click(Sender: TObject);
procedure btnShowClick(Sender: TObject);
procedure btnEndeClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
Menu: TMainMenu;
MenuItems: array of TMenuItem;
SubItems: array of TMenuItem;
Datei,
Bearbeiten,
Fenster,
Hilfe: TMenuItem;

Neu,
Oeffnen,
N1,
Beenden: TMenuItem;

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//Hier will ich zur Laufzeit mein Menü aufbauen.
//Grund:
// Das soll später mehrsprachig werden
// Da werden dann den Captions ResourceStrings
// zugewiesen, die von der gewünschten Sprache
// abhängen.

Menu := TMainMenu.Create(self);
Datei := TMenuItem.Create(Self);
Datei.Caption := 'Datei';

Bearbeiten := TMenuItem.Create(Self);
Bearbeiten.Caption := 'Bearbeiten';

Fenster := TMenuItem.Create(Self);
Fenster.Caption := 'Fenster';

Hilfe := TMenuItem.Create(Self);
Hilfe.Caption := 'Hilfe';

Neu := TMenuItem.Create(self);
Neu.Caption := 'Neues Projekt öffnen...';
N1 := TMenuItem.Create(self);
N1.Caption := '-';
Oeffnen := TMenuItem.Create(self);
Beenden := TMenuItem.Create(self);
Beenden.Caption := 'Programm &Verlassen';
Beenden.OnClick := Beenden1Click;
Oeffnen.Caption := 'Existierendes Projekt öffnen...';

Menu.Items.Add(Datei);
Menu.Items.Items[0].Insert(0,Neu);
// Sobald ich Untermenüs einfügen will, Wird Exception
// EListError ausgelöst
// Meldung: Listenindex überschreiete das Maximum (1)
// Menu.Items.Items[1].Add(Oeffnen);
// Menu.Items.Items[2].Add(N1);
// Menu.Items.Items[3].Add(Beenden);

Menu.Items.Add(Bearbeiten);
Menu.Items.Add(Fenster);
Menu.Items.Add(Hilfe);

end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.btnShowClick(Sender: TObject);
var i,j,k: Integer;
begin
if Menu <> nil then
if Menu.Items.Count > 0 then
for i:=0 to Menu.Items.Count-1 do
LBox.Items.Add(Menu.Items[i].Caption);

//Warum wird hier die Exception EListError ausgelöst, Meldung:
//Listenindex überschreiete das Maximim (4)
//wenn ich diesen Code ausführe ?
{

Ich will hier die Untermenüs anzeigen, weil ich lernen will,
wie sich das Menü, das ich so wunderbar mit dem Designer er-
stellen läßt, denn nun intern aufbaut.

j := 0; // wenn ich das gleiche mit for... mache, gleiches Erebnis.
while j <= Menu.Items[i].Count-1 do begin
LBox.Items.Add(Menu.Items[i].Items[j].Caption);
inc(j);
end;
}
end;

procedure TForm1.btnEndeClick(Sender: TObject);
begin
Close;
end;

end.

Warum werden die in den Kommentaren angegebenen Exceptions ausgelöst? Wie kann ich mein Problem lösen?

DelphiSourcer
  Mit Zitat antworten Zitat