Forum: PC-Programmierung C# Menü im Konsolenprogramm


von Michael S. (michael8192)


Lesenswert?

Guten Morgen,

ich versuche gerade ein Konsolenprogramm in C# zu schreiben, mit dem ich 
ein Menü realisieren kann ähnlich wie in diesem Beitrag von Karl-Heinz:
Beitrag "Re: Menü über RS232 ausgeben"

Das Ziel ist eine Kommunikation mit einem PIC über RS232.

Leider habe ich noch nicht viel Erfahrung mit C# und benötige bitte 
etwas Hilfe. Ich habe versucht, mit Hilfe von Delegate eine einfache 
Menüstruktur zu programmieren. Ich kann auch in "Vorwärtsrichtung" die 
Menüpunkte aufrufen, aber wie komme ich wieder zurück????
Ich kann nicht als Funktion "0" übergeben. Wie macht man das in C#?
Vielleicht kann mir da jemand weiterhelfen. Bitte mit konkretem 
Beispiel, damit ich das besser nachvollziehen kann.

Vielen Dank dafür.

Hier mein Code bisher:
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Linq;
6
using System.Text;
7
using System.IO.Ports;
8
9
namespace ConsoleApplication1
10
{
11
    public delegate void MenuFnct();
12
    public struct MenuEntry
13
    {
14
        public String Text;
15
        public MenuFnct Function;
16
    }
17
    class Program
18
    {
19
        static void Main(string[] args)
20
        {
21
            //RS232 Initialisierung
22
            SerialPort serialport = new SerialPort();
23
            serialport.BaudRate = 19200;
24
            serialport.Parity = Parity.None;
25
            serialport.DataBits = 8;
26
            serialport.StopBits = StopBits.One;
27
            serialport.RtsEnable = false;
28
            serialport.ReadTimeout = 1000;
29
            serialport.WriteTimeout = 1000;
30
            serialport.PortName = "COM4";
31
            serialport.Open();
32
            //Ende RS232
33
34
            int len = 0;
35
            // Variable vom Typ des Delegaten
36
            MenuEntry[] MainMenu = new MenuEntry[4];
37
            MainMenu[0].Text = "Datei";
38
            MainMenu[1].Text = "Bearbeiten";
39
            MainMenu[2].Text = "Ansicht";
40
            MainMenu[3].Text = "Beenden";
41
            MainMenu[0].Function = Menu0.DateiMenu;
42
            MainMenu[1].Function = Menu0.BearbeitenMenu;
43
            MainMenu[2].Function = Menu0.AnsichtMenu;
44
            MainMenu[3].Function = Menu0.Ende;
45
            for (int i = 0; i < MainMenu.Length; i++)
46
                len += System.Runtime.InteropServices.Marshal.SizeOf(MainMenu[i]);
47
            len /= System.Runtime.InteropServices.Marshal.SizeOf(typeof(MenuEntry));
48
            HandleMenu("Hauptmenue", ref MainMenu, len);
49
        }
50
51
        static void HandleMenu(String MenuTitle, ref MenuEntry[] Menu, int MenuSize)
52
        {
53
            int i;
54
            int Auswahl=0;
55
            MenuFnct sel;
56
57
            do
58
            {
59
60
                // Eingabe der Operation
61
62
                Console.Clear();
63
                Console.WriteLine(MenuTitle);
64
                Console.WriteLine("Bitte waehlen:");
65
                for (i = 0; i < MenuSize; i++)
66
                {
67
                    Console.WriteLine(i+1 + " " + Menu[i].Text);
68
                }
69
                Auswahl = Convert.ToInt16(Console.ReadLine().ToUpper());
70
                 // In Abhängigkeit von der Wahl des Anwenders wird die Variable 'sel'
71
                // mit einem Zeiger auf die auszuführende Methode initialisiert
72
                if (Auswahl < 1 || Auswahl > MenuSize)
73
                {
74
                    do
75
                    {
76
                        Console.WriteLine("Ungültige Eingabe");
77
                        Console.WriteLine("Bitte waehlen:");
78
                        Auswahl = Convert.ToInt16(Console.ReadLine().ToUpper());
79
                     }  while (Auswahl < 1 || Auswahl > MenuSize);
80
                }
81
                else
82
                {
83
                    Auswahl--;
84
                    Console.Clear();
85
                    sel = new MenuFnct(Menu[Auswahl].Function);
86
87
                    sel();
88
                    Console.WriteLine("----------------------------------");
89
                    Console.WriteLine("Zum Beenden F12 drücken, Weiter: beliebige Taste druecken");
90
                }
91
            } while (Console.ReadKey(true).Key != ConsoleKey.F12);
92
            
93
        }
94
        class Menu0
95
        {
96
            public static void DateiMenu()
97
            {
98
                int len = 0;
99
                // Variable vom Typ des Delegaten
100
                MenuEntry[] DateiMenu = new MenuEntry[4];
101
                DateiMenu[0].Text = "Neu";
102
                DateiMenu[1].Text = "Oeffnen";
103
                DateiMenu[2].Text = "Speichern";
104
                DateiMenu[3].Text = "Zurueck";
105
                DateiMenu[0].Function = Menu1.New;
106
                DateiMenu[1].Function = Menu1.Open;
107
                DateiMenu[2].Function = Menu1.Save;
108
                DateiMenu[3].Function = Menu1.Back; //"0" geht hier nicht
109
                for (int i = 0; i < DateiMenu.Length; i++)
110
                    len += System.Runtime.InteropServices.Marshal.SizeOf(DateiMenu[i]);
111
                len /= System.Runtime.InteropServices.Marshal.SizeOf(typeof(MenuEntry));
112
                HandleMenu("Hauptmenue", ref DateiMenu, len);
113
            }
114
            public static void BearbeitenMenu()
115
            {
116
                int len = 0;
117
                // Variable vom Typ des Delegaten
118
                MenuEntry[] BearbeitenMenu = new MenuEntry[4];
119
                BearbeitenMenu[0].Text = "Ausschneiden";
120
                BearbeitenMenu[1].Text = "Kopieren";
121
                BearbeitenMenu[2].Text = "Einsetzen";
122
                BearbeitenMenu[3].Text = "Zurueck";
123
                BearbeitenMenu[0].Function = Menu2.Cut;
124
                BearbeitenMenu[1].Function = Menu2.Copy;
125
                BearbeitenMenu[2].Function = Menu2.Paste;
126
                BearbeitenMenu[3].Function = Menu2.Back; //"0" geht hier nicht
127
                for (int i = 0; i < BearbeitenMenu.Length; i++)
128
                    len += System.Runtime.InteropServices.Marshal.SizeOf(BearbeitenMenu[i]);
129
                len /= System.Runtime.InteropServices.Marshal.SizeOf(typeof(MenuEntry));
130
                HandleMenu("Hauptmenue", ref BearbeitenMenu, len);
131
            }
132
            public static void AnsichtMenu()
133
            {
134
135
            }
136
            public static void Ende()
137
            {
138
                
139
            }
140
        }
141
        class Menu1
142
        {
143
            public static void New()
144
            {
145
                Console.WriteLine("Funktion 'Neu' ausgewaehlt");
146
            }
147
            public static void Open()
148
            {
149
                Console.WriteLine("Funktion 'Oeffnen' ausgewaehlt");
150
            }
151
            public static void Save()
152
            {
153
                Console.WriteLine("Funktion 'Speichern' ausgewaehlt");
154
            }
155
            public static void Back()
156
            {
157
                Console.WriteLine("Funktion 'Zurueck' ausgewaehlt");
158
159
            }
160
        }
161
162
        class Menu2
163
        {
164
            public static void Cut()
165
            {
166
                Console.WriteLine("Funktion 'Ausschneiden' ausgewaehlt");
167
            }
168
            public static void Copy()
169
            {
170
                Console.WriteLine("Funktion 'Kopieren' ausgewaehlt");
171
            }
172
            public static void Paste()
173
            {
174
                Console.WriteLine("Funktion 'Einfuegen' ausgewaehlt");
175
            }
176
            public static void Back()
177
            {
178
                Console.WriteLine("Funktion 'Zurueck' ausgewaehlt");
179
180
            }
181
        }
182
183
    }
184
}

von Arc N. (arc)


Lesenswert?

Erstmal eine kleine Anmerkung: C# ist nicht C d.h.
die ganzen
1
for (int i = 0; i < BearbeitenMenu.Length; i++)
2
                    len += System.Runtime.InteropServices.Marshal.SizeOf(BearbeitenMenu[i]);
3
                len /= System.Runtime.InteropServices.Marshal.SizeOf(typeof(MenuEntry));
sind überflüssig, da die Länge eines Arrays auch nach der Übergabe an 
eine andere Methode über .Length ermittelt werden kann und das Übergeben 
der MenuEntrys per Referenz (außer hier soll später mal die Methode 
HandleMenu die angelgten Verweise auf Dateimenu etc. verändern können) 
unnötig.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.