Archief - [PROG][C] Venster sluiten

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

killgore

Legacy Member
tip: gebruik
Code:
-tags ;).

Ik kan maar op 1 iets komen en das dat borland system() gewoon niet ondersteunt :), pech dan.

wlibaers

Legacy Member
EasyWin? Die heb ik ook nog gebruikt, in 1996 of zo, en ik denk niet dat er sindsdien nog iets aan veranderd is ;)

PostQuitMessage(0); is inderdaad de juiste manier om dit te doen. EasyWin is namelijk een manier bij Borland om 16-bit DOS-programma's naar 16-bit Windows te porten zonder veel aanpassingen te moeten uitvoeren, gewoonlijk geen enkele (de vraag is natuurlijk waarom je zoiets vandaag nog nodig zou hebben). Hiervoor opent dat systeem een venster dat functioneert als de console in DOS (dus de standaard I/O streams zijn eraan gekoppeld). Bij een DOS-programma blijft na afloop de uitvoer gewoon op de console staan, je kan die dus nog lezen. Om datzelfde effect te bekomen bij een EasyWin programma is het standaard gedrag dat het venster gewoon blijft staan (met "inactive" in de titelbalk). Vermits het eigenlijk een echt 16-bit Windowsprogramma is heeft het een messageloop, en die zal op PostQuitMessage(0) reageren door het venster te sluiten en het programma te stoppen.

White Label

Legacy Member
moet ge daar dan iets speciaals mee doen (header includen ofzo)? Want bij mij werkte da niet...

wlibaers

Legacy Member
#include <windows.h>


Van Borland zelf:


Code:
Technical Notes Database

TN3177C.txt   Using Windows API in an EasyWin application
Category   :Win16 API
Platform    :All
Product    :BCW  3.10-

Description:
Q: Why does my EasyWin application window just sit there after I'm done with
it, forcing the user to close the window to end the program?
A: You can use the Windows API in an EasyWin application. The following code
sample prompts for input in a loop and, after the user quits the loop,
immediately close down the EasyWin application ( and the Window ).
/*
   A minimal EasyWin example that prompts for user input and
   echoes the input string to a window. Closes the window,
   via PostQuitMessage, after user ends input loop.
*/
#include <windows.h>
#include <stdio.h>
#include <ctype.h>

char buffer[256];
#pragma argsused
int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
   LPSTR lpszCmdLine, int cmdShow )
{
  _InitEasyWin();
  printf("please enter a string ( start string with Q to quit )\n");
  do
  {
   gets( buffer );
   printf("%s\n", buffer );
  }while( toupper(buffer[0]) != 'Q' );
 // we're done so close the app...
  PostQuitMessage(0);
  return 0;
}

White Label

Legacy Member
Hoi,
ik heb weer een probleem. Ik ben bezig met een loginsysteem waarbij je een nieuwe gebruiker kunt aanmaken. Hij moet dan zijn gebruikersnaam ingeven en zijn paswoord. Nu zou ik willen dat wanneer hij zijn paswoord typt, de tekst op het scherm komt in de vorm van *. Dus het paswoord onzichtbaar is. Is dit haalbaar?

Alvast bedankt!

killgore

Legacy Member
bah :p

gebruik dan toch een GUI ;).

kunde prolly in plain c doen met buffering en dergelijke, ma ken nie genoeg van c-functies, dus kan nie helpen

White Label

Legacy Member
het programma moet in C geschreven worden :s iemand anders die enige ervaring of enig idee heeft?

En tis idd voor KDG :p

wlibaers

Legacy Member
Niet binnen standaard C (en dus waarschijnlijk niet cross-platform). Ga op zoek naar functies die de invoer van letters toelaten zonder echo naar de console, en die werken op jouw systeem. Voor elke letter schrijf je dan zelf een sterretje. Backspace moet je zelf regelen. ncurses voor Linux/Unix, conio voor Windows bevatten wel zo'n dingen, voor EasyWin ben ik niet zeker wat van toepassing is.

White Label

Legacy Member
Code:
void accountmenu(void)
{
  int keuze, sw=0;
  printf("Menu\n----\n");
  printf("1 Log in\n2 Registreer\n3 Exit\n\n");
  printf("Typ het nummer van uw keuze in: ");
  scanf("%d", &keuze);

  while(sw==0)
	 switch(keuze)
	 {
		case 1:
		  sw=1; inloggen(); break;
		case 2:
		  sw=1; registreer(); break;
		case 3:
		  sw=1; PostQuitMessage(0); break;
		default:
		  printf("Dit is geen geldige optie!");break;
	 }
}

als ik ipv een getal bv mm ingeef dan blijft hij de default printen zodat het programma crasht. Kan ik dit op een of andere manier voorkomen?

Tnx ;)

killgore

Legacy Member
Code:
void accountmenu(void)
{
  int keuze, sw=0;

  while(sw==0)
  {
         printf("Menu\n----\n");
         printf("1 Log in\n2 Registreer\n3 Exit\n\n");
         printf("Typ het nummer van uw keuze in: ");
         scanf("%d", &keuze);
	 switch(keuze)
	 {
		case 1:
		  sw=1; inloggen(); break;
		case 2:
		  sw=1; registreer(); break;
		case 3:
		  sw=1; PostQuitMessage(0); break;
		default:
		  printf("Dit is geen geldige optie!");break;
	 }
  }
}

of recursief:
Code:
void accountmenu(void)
{
  int keuze, sw=0;
  printf("Menu\n----\n");
  printf("1 Log in\n2 Registreer\n3 Exit\n\n");
  printf("Typ het nummer van uw keuze in: ");
  scanf("%d", &keuze);

	 switch(keuze)
	 {
		case 1:
		  sw=1; inloggen(); break;
		case 2:
		  sw=1; registreer(); break;
		case 3:
		  sw=1; PostQuitMessage(0); break;
		default:
		  printf("Dit is geen geldige optie!");accountmenu();break;
	 }
}
Ma recursie is meestal de slechtste keuze.

in dit geval zou ik dan ook onmiddelijk returnen ipv break en evaluatie in die rare while-structuur, is imho niet minder onduidelijk, ma kweet da het in bepaalde lessen niet mag.

wlibaers

Legacy Member
White Label zei:
Code:
void accountmenu(void)
{
  int keuze, sw=0;
  printf("Menu\n----\n");
  printf("1 Log in\n2 Registreer\n3 Exit\n\n");
  printf("Typ het nummer van uw keuze in: ");
  scanf("%d", &keuze);

  while(sw==0)
	 switch(keuze)
	 {
		case 1:
		  sw=1; inloggen(); break;
		case 2:
		  sw=1; registreer(); break;
		case 3:
		  sw=1; PostQuitMessage(0); break;
		default:
		  printf("Dit is geen geldige optie!");break;
	 }
}

als ik ipv een getal bv mm ingeef dan blijft hij de default printen zodat het programma crasht. Kan ik dit op een of andere manier voorkomen?

Tnx ;)

De reden is dat een break alleen uit de onmiddellijk omringende switch of loop springt. Dus dan kom je terug in de while loop, waar die sw==0 nog steeds geldt, dan wordt weer dezelfde keuze bekeken in de switch, en je zit met een oneindige loop.

Als je een break wil die uit meerdere switch en/of loop statements kan springen kan je een goto gebruiken die naar een label buiten de loop springt. Als het de bedoeling is telkens opnieuw de vraag te stellen tot de gebruiker iets zinnigs doet gebruik je de oplossingen van killgore. (ik veronderstel dat dat ook is wat je wou, maar je vermeldt natuurlijk nergens expliciet wat het gewenste gedrag was)

White Label

Legacy Member
Gewenste gedrag: dat hij bij alles dat niet 1,2 of 3 is zegt dat het een ongeldige keuze is. Zou het een goede oplossing zijn om na de scanf van de keuze een isdigit te gebruiken. Als dan de waarde true is gaat men door naar de while-lus en anders moet men opnieuw een keuze ingeven. Of is dit niet zo efficient?

Greetz ;)

wlibaers

Legacy Member
White Label zei:
Gewenste gedrag: dat hij bij alles dat niet 1,2 of 3 is zegt dat het een ongeldige keuze is.

Onvolledig. Wat moet er daarna gebeuren? Opnieuw vragen? Return uit de functie met foutcode? Programma afsluiten?

White Label

Legacy Member
Bij de keuze 1/2/3 gaat hij naar de bijhorende functie, dit is in orde. Bij een foutieve keuze (intypen van letters, verkeerde nummer,...) moet er een bericht op het scherm verschijnen bv(dit is geen geldige keuze) en daarna moet men opnieuw een keuze maken.

wlibaers

Legacy Member
White Label zei:
Bij de keuze 1/2/3 gaat hij naar de bijhorende functie, dit is in orde. Bij een foutieve keuze (intypen van letters, verkeerde nummer,...) moet er een bericht op het scherm verschijnen bv(dit is geen geldige keuze) en daarna moet men opnieuw een keuze maken.

OK, dat was dus de oplossing van killgore.

White Label

Legacy Member
Code:
void accountmenu(void)
{
  int keuze, sw=0;

  while(sw==0)
  {
         printf("Menu\n----\n");
         printf("1 Log in\n2 Registreer\n3 Exit\n\n");
         printf("Typ het nummer van uw keuze in: ");
         scanf("%d", &keuze);
	 switch(keuze)
	 {
		case 1:
		  sw=1; inloggen(); break;
		case 2:
		  sw=1; registreer(); break;
		case 3:
		  sw=1; PostQuitMessage(0); break;
		default:
		  printf("Dit is geen geldige optie!");break;
	 }
  }
}

als ik bij de switch bv "dd" ingeef dan crasht het... Iemand een oplossing :help:

EDIT: gefixed met de buffer te flushen bij de default... domme fout van me...
Iedereen al nen dikke merci voor de hulp ;)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan