Einzelnen Beitrag anzeigen

Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#1

In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 12:52
Mein Programm schreibt in ein Konsolenfenster ein Menü, etwa in dem Stil:
Code:
Alt F1 File F2 Edit F3 Help F4 Info
Mit Alt+F1, Alt+F2, Alt+F3 und Alt+F4 kann ich den jeweiligen Punkt ansprechen.
Das funktioniert auch problemlos.
Nun möchte ich allerdings auch auf das Anklicken des Punkts reagieren.
Also fange ich in der Konsole das Mausevent ab und frage ab, ob in die erste Zeile geklickt wurde.
In dem Fall wird ProcessMenuClick aufgerufen:
Delphi-Quellcode:
procedure TNWLGUICon.ProcessMenuClick(Rec:MOUSE_EVENT_RECORD);
var m: TNWLGUICMenu; i: Byte;
begin
   m := Menu;
   i := 1;
   AppMan.Console.Cursor.Move(0,2);
   while (Rec.dwMousePosition.X > m.PaintInfo.Left) and (m<>nil) do begin
      m := m.NextMenu;
      i += 1;
      if m=nil then WriteLn('nil');
   end;
   AppMan.Console.Cursor.Move(0,1);
   AppMan.Console.InOut.Space := Menues[i-2].PaintInfo.Left;
   AppMan.Console.InOut.Ansi := Menues[i-2].Caption;
end;
TNWLGUICMenu.PaintInfo.Left enthält die Position des Menüpunkts von Links.
Menu ist eine Eigenschaft von TNWLGUICon vom Typ TNWLGUICMenu und stellt die gesamte Menüstruktur nach.

Den ersten Menüpunkt bekommt man über Menu,
den zweiten über Menu.NextMenu,
den dritten über Menu.NextMenu.NextMenu,
den vierten über Menu.NextMenu.NextMenu.NextMenu
usw.

Weiterhin gibt es über die Eigenschaft Menues die Möglichkeit einen Menüpunkt über den Index zu bekommen:
den ersten über Menues[0] (=Menu)
den zweiten über Menues[1] (=Menu.NextMenu)
den dritten über Menues[2] (=Menu.NextMenu.NextMenu)
usw.

Das Problem ist folgendes:
Wenn ich den letzten Menüpunkt anklicke, gibt es eine AccessViolation.

Hat jemand eine Idee, woher die kommen könnte und wie ich die umgehen kann?

[EDIT]Screenshot hinzugefügt[/EDIT]
Miniaturansicht angehängter Grafiken
fenster_104.jpg  
Marvin
  Mit Zitat antworten Zitat