Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi In Konsole angeklickten Menüpunkt ermitteln (https://www.delphipraxis.net/139828-konsole-angeklickten-menuepunkt-ermitteln.html)

implementation 6. Sep 2009 12:52


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:
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]

himitsu 6. Sep 2009 13:09

Re: In Konsole angeklickten Menüpunkt ermitteln
 
Delphi-Quellcode:
while (Rec.dwMousePosition.X > m.PaintInfo.Left) and (m<>nil) do begin
du greifst erst auf m zu und prüfst danach, ob es überhaupt existiert

also (m<>nil) muß nach vorne ;)

PS: auch wenn wieder mal die genaue Fehlermeldung fehlt ... ("eine AccessViolation")

Zitat:

Zugriffsverletzung auf Adresse $000000xx
däutet fast immer darauf hin, daß man auf etwas zugreift, welches nicht existiert, bzw. wo ein Pointer oder eine Objektvariable auf NIL stehen.

implementation 6. Sep 2009 13:20

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;

himitsu 6. Sep 2009 13:25

Re: In Konsole angeklickten Menüpunkt ermitteln
 
geht auch etwas kürzer
Delphi-Quellcode:
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');
[edit]
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

DeddyH 6. Sep 2009 13:27

Re: In Konsole angeklickten Menüpunkt ermitteln
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
i += 1;

Geht das jetzt auch unter Delphi? :shock:

himitsu 6. Sep 2009 13:31

Re: In Konsole angeklickten Menüpunkt ermitteln
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von himitsu
Delphi-Quellcode:
i += 1;

Geht das jetzt auch unter Delphi? :shock:

ich glaub nicht, aber es könnte ja in Lazarus gehn :zwinker:

Jakob Ullmann 6. Sep 2009 13:38

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...

Der.Kaktus 6. Sep 2009 13:49

Re: In Konsole angeklickten Menüpunkt ermitteln
 
Zitat:

Zitat von Jakob Ullmann
Also meines Erachtens widerspricht das ein bisschen dem Konzept einer Konsole. Mach doch lieber gleich eine GUI-Anwendung...

..sehe ich auch so..da kann ich auch meine alten Tools von Turbopascal wieder rauskramen(wenn die Disketten noch lesbar sind *gg*) :-D

implementation 6. Sep 2009 14:26

Re: In Konsole angeklickten Menüpunkt ermitteln
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von himitsu
Delphi-Quellcode:
i += 1;

Geht das jetzt auch unter Delphi? :shock:

unter FreePascal, wenn man es im Compiler so einstellt.
Zitat:

Zitat von himitsu
sicher daß &gt; so stimmt? hätte jetzt eher &gt;= vermutet
denn sonst würde ich vermutten, daß das erste Zeichen eines Menüpunktes nicht mitgezählt wird

Hast Recht, hab ich geändert.

Luckie 6. Sep 2009 14:40

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 10:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz