![]() |
In Konsole angeklickten Menüpunkt ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Mein Programm schreibt in ein Konsolenfenster ein Menü, etwa in dem Stil:
Code:
Mit Alt+F1, Alt+F2, Alt+F3 und Alt+F4 kann ich den jeweiligen Punkt ansprechen.
Alt F1 File F2 Edit F3 Help F4 Info
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:
TNWLGUICMenu.PaintInfo.Left enthält die Position des Menüpunkts von Links.
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; 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] |
Re: In Konsole angeklickten Menüpunkt ermitteln
Delphi-Quellcode:
du greifst erst auf m zu und prüfst danach, ob es überhaupt existiert
while (Rec.dwMousePosition.X > m.PaintInfo.Left) and (m<>nil) do begin
also (m<>nil) muß nach vorne ;) PS: auch wenn wieder mal die genaue Fehlermeldung fehlt ... ("eine AccessViolation") Zitat:
|
Re: In Konsole angeklickten Menüpunkt ermitteln
Danke für die schnelle Antwort, das war das Problem.
Delphi-Quellcode:
procedure TNWLGUICon.ProcessMenuClick(Rec:MOUSE_EVENT_RECORD);
var m: TNWLGUICMenu; i: Byte; break: Boolean; begin m := Menu; i := 1; AppMan.Console.Cursor.Move(0,2); break := false; while (not break) and ((m<>nil) and (i<5)) do begin break := not (Rec.dwMousePosition.X > m.PaintInfo.Left); if not break then begin m := m.NextMenu; i += 1; end; 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; |
Re: In Konsole angeklickten Menüpunkt ermitteln
geht auch etwas kürzer
Delphi-Quellcode:
[edit]
while (m <> nil) and (Rec.dwMousePosition.X >= m.PaintInfo.Left) do begin
m := m.NextMenu; i += 1; end; if m = nil then WriteLn('nil'); // oder while Assigned(m) and (Rec.dwMousePosition.X >= m.PaintInfo.Left) do begin m := m.NextMenu; Inc(i); end; if not Assigned(m) then WriteLn('nil'); sicher daß > so stimmt? hätte jetzt eher >= vermutet denn sonst würde ich vermutten, daß das erste Zeichen eines Menüpunktes nicht mitgezählt wird |
Re: In Konsole angeklickten Menüpunkt ermitteln
Zitat:
|
Re: In Konsole angeklickten Menüpunkt ermitteln
Zitat:
|
Re: In Konsole angeklickten Menüpunkt ermitteln
Also meines Erachtens widerspricht das ein bisschen dem Konzept einer Konsole. Mach doch lieber gleich eine GUI-Anwendung...
|
Re: In Konsole angeklickten Menüpunkt ermitteln
Zitat:
|
Re: In Konsole angeklickten Menüpunkt ermitteln
Zitat:
Zitat:
|
Re: In Konsole angeklickten Menüpunkt ermitteln
Sag mal, ist das eine eigene Klasse? Ich habe so was nämlich mal gesucht. Allerdings auch mit einer Konsolen Eingabemaske.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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