AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi In Konsole angeklickten Menüpunkt ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

In Konsole angeklickten Menüpunkt ermitteln

Ein Thema von implementation · begonnen am 6. Sep 2009 · letzter Beitrag vom 7. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 13:09
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

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

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 13:20
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;
Marvin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 13:25
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 13:27
Zitat von himitsu:
i += 1;
Geht das jetzt auch unter Delphi?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 13:31
Zitat von DeddyH:
Zitat von himitsu:
i += 1;
Geht das jetzt auch unter Delphi?
ich glaub nicht, aber es könnte ja in Lazarus gehn
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jakob Ullmann
Jakob Ullmann

Registriert seit: 17. Feb 2007
218 Beiträge
 
Lazarus
 
#7

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 13:38
Also meines Erachtens widerspricht das ein bisschen dem Konzept einer Konsole. Mach doch lieber gleich eine GUI-Anwendung...
Jakob
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 13:49
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*)
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

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

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 14:26
Zitat von DeddyH:
Zitat von himitsu:
i += 1;
Geht das jetzt auch unter Delphi?
unter FreePascal, wenn man es im Compiler so einstellt.
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.
Marvin
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: In Konsole angeklickten Menüpunkt ermitteln

  Alt 6. Sep 2009, 14:40
Sag mal, ist das eine eigene Klasse? Ich habe so was nämlich mal gesucht. Allerdings auch mit einer Konsolen Eingabemaske.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr.
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