Hallo zusammen.
Ich bin gerade dabei ein Display mit Menüführung zu programmieren. Das
läuft auch solange, bis ich am Ende des Menüs ankomme und es darum geht
mir Werte anzeigen zu lassen. Die Menüsprünge realisiere ich mittels
Vektoren, die auf ein Struct aus Strings zeigen. Diese werden dann
ausgegeben. Läuft 1a solange ich nur Strings anzeigen muß. Jetzt möchte
ich aber auf Werte zurück greifen und diese Anzeigen. Dafür benötige ich
viele verschiedene Funktionen und nicht die Standardroutine.
Lange Rede kurzer Sinn. Kann ich mit einer Switch-Anweisung irgendwie
auch auf einen Vektor verweisen?
Gruß Bruno
Hä?
Klingt aber danach, also ob die Antwort auf deine Frage "Nein"
lautet.
Da ich aber nicht wirklich kapiert habe, was du da machst, kann
ich dir auch keine Alternative vorschlagen.
Bruno wrote:
> Vllcht kannst dui dich an den Thread erinnern>> Beitrag "strlen bei mehrdimensionalen Strings">> Ich möchte jetzt nicht auf ein Subdisplay verweisen, sondern auf eine> Funktion.>>
1
>MenuEntryMainMenu[]=
2
>{
3
>{{"Hilfe","Help"},NULL},
4
>{{"Bearbeiten","Edit"},&EditScreen},
5
>{{"Beenden","Exit"},NULL}
6
>};
7
>
OK.
Dann musst du deine Struktur erweitern.
Die besteht jetzt nicht mehr aus den 2 Einträgen, sondern aus 3
1
typedefvoid(*FuncPtr)(void);
2
3
4
// Ein Eintrag (Menuepunkt) im Scrollbereich
5
typedefstructMenueEntry_{
6
Textm_Text;
7
structDisplayScreen_*m_pSubDisplay;
8
FuncPtrm_pFunction;
9
}MenuEntry;
wobei der dritte Eintrag der Funktionspointer ist. Die Auswerte-
funktion checkt jetzt einfach ab, welcher der beiden Pointer
nicht NULL ist. Ist es der SupDisplay Pointer, dann wird ein
Untermenü angezeigt. Ist es der Funktionspointer, dann wird die
Funktion aufgerufen.
1
voiddoCopy()
2
{
3
}
4
5
voiddoCut()
6
{
7
}
8
9
voiddoPaste()
10
{
11
}
12
13
// "Bearbeiten" Display
14
MenuEntryEditMenu[]=
15
{
16
{{"Kopieren","Copy"},NULL,doCopy},
17
{{"Ausschneiden","Cut"},NULL,doCut},
18
{{"Einsetzen","Paste"},NULL,doPaste}
19
};
20
21
...
22
23
voidHandleDisplay(DisplayScreen*pDisplay)
24
{
25
...// konstante Teile des Screens aufbauen
26
27
HandleMenu(pDisplay->ScrollArea.Entries,
28
pDisplay->ScrollArea.m_Size);
29
}
30
31
voidHandleMenu(MenuEntry*Entries,size_tNrEntries)
32
{
33
size_ti;
34
35
for(i=0;i<NrEntries;++i){
36
// GetCurrentText( &Entries[i].m_Text ) ) ausgeben und so
37
// das Menü aufbauen
38
}
39
40
// du hast eine Rückmeldung vom Benutzer und musst sie
41
// jetzt auswerten
42
43
// an dieser Stelle enthält i den Index des ausgewählten
44
// Eintrags
45
//
46
// Checken ob es eine Funktion dafür gibt, wenn ja aufrufen
47
if(Entries[i].pFunction!=NULL)
48
(*Entries[i].pFunction)();
49
50
// Wenn es ein Submenü gibt, dann dieses auswählen
51
if(Entries[i].m_pSubDisplay!=NULL)
52
HandleDisplay(Entries[i].m_pSubDisplay);
53
}
Beachten musst du nur, dass alle Funktionen immer die gleichen
Argumente haben, falls du welche brauchst. Das kann auch mal
bedeuten, dass eine Funktion Argumente bekommt, die sie nicht
benötigt.
Die tatsächlichen Argumente nimmst du ebenfalls mit in die
Struktur auf, damit sie beim Funktionsaufruf zur Verfügung
stehen.
zb.
Bruno wrote:
> Jetzt brauche ich erst mal Verarbeitungszeit.> Aber danke für den/die Ansatz/Lösung.
Ist sehr simpel.
Im Grunde wurde einfach nur in die Struktur ein zusätzlicher
Member mit aufgenommen. Alles andere ergibt sich daraus.
Na ja so simpel war das nicht. Wenn man an einem bestehenden Programm an
der Basis fummelt kommt oft nur quatsch raus. Auf dem ganzen Jedöns
basieren ca 20k Code. Aber der Ansatz war super. So in der Art hatte ich
das auch geplant. Nur die Codestelle
1
(*Entries[i].pFunction)(m_pArg1)
war mir nicht geläufig.
Danke nochmal² für die Hilfe.
Gruß Bruno