Avatar billede jenshansen Nybegynder
12. oktober 2003 - 17:19 Der er 16 kommentarer

Menu i Dos-program

Hej

Har ikke programmeret særlig meget c/c++ før, og kan derfor heller langt fra særlig meget.
Jeg skal igang med et program, men har haft lidt problemer med en menu. Jeg ved ikke hvordan man "rigtigt" gør det, men havde gang i noget med en define MENUWIDTH 15, og så kalde funktionen til menuen i hver linie.. Sådan at menuen blev skrevet ud, og i det hele fyldte 15 tegn.
Jeg lavede så et par forskellige funktioner der skulle sætte de manglende mellemrum bag efter osv.. Men det kom hele tiden med fejl..
og så er der jo stadig langt til en funktionsdygtig menu..
Så det jeg søger en et eksempel (eller en guide hvis det skal være rigtig godt), til en SIMPEL funktionsdygtig menu..

På forhånd mange tak!
Avatar billede bertelbrander Novice
12. oktober 2003 - 20:09 #1
Jeg lavede for nyligt en lille simpel menu system til DOS. Det kompilerer med BorlandC.

home20.inet.tele.dk/midgaard/menu.zip

Hvis ikke det kan bruges må du gerne komme med lidt flere oplysninger om hvad din menu skal kunne og hvilken kompiler du bruger.
Du kunne også prøve at poste det du har lavet, så kan vi se om vi kan få det til at virke.
Avatar billede jenshansen Nybegynder
12. oktober 2003 - 20:52 #2
Hej

Jeg bruger Microsoft Developer Studio 6.
Den kommer med en fejl når jeg prøver at kompilere. Jeg er ikke så meget inde i det her, så kan ikke umidbart se hvad der skal ændres. Vil du prøve at komme med en forklaring?

--------------------Configuration: menu - Win32 Debug--------------------
Compiling...
menu.c
C:\Programmering\Stor opgave\menu.c(20) : warning C4013: 'textattr' undefined; assuming extern returning int
C:\Programmering\Stor opgave\menu.c(20) : error C2065: 'LIGHTGRAY' : undeclared identifier
C:\Programmering\Stor opgave\menu.c(20) : error C2065: 'BLACK' : undeclared identifier
C:\Programmering\Stor opgave\menu.c(21) : warning C4013: 'gotoxy' undefined; assuming extern returning int
C:\Programmering\Stor opgave\menu.c(22) : warning C4013: 'clreol' undefined; assuming extern returning int
C:\Programmering\Stor opgave\menu.c(98) : warning C4013: 'clrscr' undefined; assuming extern returning int
Error executing cl.exe.

menu.exe - 2 error(s), 4 warning(s)
Avatar billede jenshansen Nybegynder
12. oktober 2003 - 22:07 #3
sorry. Det er en version 97. Min fejl!
Avatar billede bertelbrander Novice
12. oktober 2003 - 23:22 #4
Jeg har lavet en ny version der kan kompileres med alle versioner af MS C++ (og GCC (cygwin mingw) og BorlandC):

http://home20.inet.tele.dk/midgaard/menu2.zip
Avatar billede jenshansen Nybegynder
13. oktober 2003 - 22:18 #5
Det bare i orden! Har i hvert falde fået nogle ideer til hvordan jeg selv kan lave det.
Lige et bonusspørgsmål (+ et par ekstra point :))
Hvordan gør man lettest så alt hvad der bliver skrevet (må godt være inde for en blok eller noget), bliver rykket eksempel vis 20 tegn ind. Altså således at den skriver ALT det der står inde for samme blok bliver rykket ind i vinduet..
Avatar billede bertelbrander Novice
13. oktober 2003 - 23:15 #6
Det er, mig bekendt, ikke muligt at definere "vinduer" vha. windows konsol funktioner, så du er nød til at sætte positionen for hvor du vil udskive hver gang du udskriver. At lave avanceret text output er gået lidt af mode...

På Unix/Linux bruger man normalt ncurses til den slags, cygwin (og sansynligvis også mingw) bruger ncurses på windows platformen. BorlandC understøter stadig text mode vinduer vha. conio.h. cygwin, mingw og Borland laver alle gratis compilere.

En liste over alle konsol mode funktioner findes her:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/console_functions.asp
Avatar billede jenshansen Nybegynder
13. oktober 2003 - 23:39 #7
jeg har lige nu en #define menu 25
Hvordan kan så så ud fra denne få min printf("Her er indholdet") til at starte 25 tegn inde i stedet for ude fra kanten?
Gør ikke noget at det skal sættes i hver linie. Så mange linier er der heller ikke

og lig lige et svar næste gang.
Avatar billede bertelbrander Novice
13. oktober 2003 - 23:46 #8
Du bestemmer hvor den skal udskrive vha. SetConsoleCursorPosition(), du kan se eksempler i koden jeg linkede til, f.ex i text_out(...).

Ulempen ved at ligge et svar er at man risikerer at få point, det vil jeg gerne undgå.
Avatar billede jenshansen Nybegynder
14. oktober 2003 - 18:20 #9
Hvorfor ingen point ?!
Du har jo hjulpet mig rigtig godt vider med mine problemer?

Jeg har dog lige en sidste ting. Vil gerne være fri for at bruge den sidt omtalte funktion. Så har en ide om selv at lave en funktion. Den skal blot via et int-input udskrive et linieskift samt mellemrum * int-inputtet.
Altså ca:

char UdskrivLinieskiftOgMellemrum(int antalmellemrum, int vilduhavelinieskiftmed = 1)
{
  if (vilduhavelinieskiftmed == 1)
  {
    outputtet = "\n";
  }
  return outputtet(fra før) + " " * antalmellemrum;
}

Har prøvet en masse. Men jeg kan ikke på den til at returnere det rigtige. Noget du kan hjælpe med?

Og så lig altså lige et svar! Du har været den største hjælp MEGET MEGET længe.
Jeg er meget glad for din hjælp!
Avatar billede jenshansen Nybegynder
14. oktober 2003 - 18:22 #10
jeg kan saktens kopiere den funktion ind jeg selv har prøvet med. Men tror ikke det giver et særlig godt resultat. Jeg er noget helt ned på en fejl ;-)
Det eneste den ikke kunne var at returnere mit array.
Så vil gerne se hvordan en proff vil gøre det :)
Avatar billede bertelbrander Novice
14. oktober 2003 - 20:09 #11
Du vil have en funktion der udskriver: Måske et linie skift + x mellemrum?
Hvad skal den returnere? Strengen der skal udskrives eller?

Måske:

char UdskrivLinieskiftOgMellemrum(int antalmellemrum, int vilduhavelinieskiftmed = 1)
{
  if (vilduhavelinieskiftmed)
  {
    printf("\n");
  }
  while(antalmellemrum--)
    printf(" ");

  return something;
}

Hvorfor vil du ikke bruge SetConsoleCursorPosition()?
Avatar billede jenshansen Nybegynder
14. oktober 2003 - 20:50 #12
Jeg ville hellere bare have returneret en tekststreng så jeg i mit program kunne skrive

printf("%s", UdskrivLinieskiftOgMellemrum(20));

eller for eksempel

char linieskift[] = UdskrivLinieskiftOgMellemrum(20), LinieskiftUdenMellemrum[] = UdskrivLinieskiftOgMellemrum(20, 0);

og så

printf("UdskrivLinieskiftOgMellemrum(20)");

Men ellers godt :D

Grunden var såment bare at jeg ikke er å meget inde i de der console-funktioner, og så ville jeg have lettere ved at dokumentere den jeg selv havde skrevet.
Avatar billede jenshansen Nybegynder
14. oktober 2003 - 21:13 #13
hov.. i den sidste printf skulle funktionen selvfølgelig være uden for, og så en %s eller lignende inde i de to gåseøjne. men tror du fik pointen?? :D
Avatar billede bertelbrander Novice
14. oktober 2003 - 22:48 #14
Det kan jo gøres på mange måder, man kunne f.ex lave noget i stil med:

const char *EmptyString = "\n                                                                ";

const char *UdskrivLinieskiftOgMellemrum(int antalmellemrum, int vilduhavelinieskiftmed)
{
  static char temp[124];
  sprintf(temp, "%.*s", antalmellemrum + (vilduhavelinieskiftmed ? 1 : 0), &EmptyString[vilduhavelinieskiftmed ? 0 : 1]);
  return temp;
}
Avatar billede bertelbrander Novice
14. oktober 2003 - 22:55 #15
En anden model:
const char *UdskrivLinieskiftOgMellemrum(int antalmellemrum, int vilduhavelinieskiftmed)
{
  static char temp[124];
  int i = 0;
  if(vilduhavelinieskiftmed)
    temp[i++] = '\n';
  while(antalmellemrum--)
    temp[i++] = ' ';
  temp[i] = 0;
  return temp;
}
Avatar billede bertelbrander Novice
14. oktober 2003 - 22:58 #16
Begge kan bruges vha:
printf("%s", UdskrivLinieskiftOgMellemrum(10, 0));
eller:
printf("%s", UdskrivLinieskiftOgMellemrum(2, 1));
eller:
printf(UdskrivLinieskiftOgMellemrum(2, 1));
eller
fputs((UdskrivLinieskiftOgMellemrum(12, 1), stdout);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester