Thema_2
dialog_1.lst
' Eingabe Verarbeitung Ausgabe(EVA)-Prinzip und dessen ' WINDOWS-gemäße Umsetzung in einem Dialog ' Controls (Text, editierbarer Text, Befehlsschaltfläche) ' WINDOWS-Style-Konstanten: WS_ ... (immer groß schreiben!!!) ' Multitasking und Ereignisse ' //Programm einfacher EVA-Dialog // // --- Definition der Dialogstruktur --- // DIALOG #1,100,50,400,300,"Berechnung (Brutto)" //Control Beschrift.ID Koordinaten Stilkonstanten LTEXT "Eingabe",101, 10,20,80,32 EDITTEXT "", 102, 100,20,220,32,WS_TABSTOP | WS_BORDER LTEXT "Ausgabe",103, 10,60,80,32 EDITTEXT "", 104, 100,60,220,32,WS_TABSTOP | WS_BORDER BUTTON "OK", 110, 140,150,120,32,WS_TABSTOP ENDDIALOG SHOWDIALOG #1 ende!=FALSE // // --- EVA - Schleife zur Dialogbearbeitung --- REPEAT GETEVENT // Ereignisabfrage (Multitasking) IF MENU(11)=WM_COMMAND // Dialogereignis eingetreten SELECT MENU(12) // in Menu(12) Control-ID CASE 110 // Fall: ID vom OK-Schaltknopf ende!=TRUE ENDSELECT ENDIF eingabewert=VAL(_WIN$(DLGITEM(1,102))) // ID 102 auslesen // Eingabe, Typumwandlung ergebnis=eingabewert*1.15 // Verarbeitung _WIN$(DLGITEM(1,104))=STR$(ergebnis) // in ID 104 ausgeben // Typumwandlung, Ausgabe UNTIL ende! CLOSEDIALOG #1 ' ' AUFGABEN: 1. Hinzufügen eines Schaltknopfes "RECHNEN" ' Erst nach seiner Betätigung soll die Berechnung ' mit dem Eingabewert durchgeführt werden. ' 2. Variation der Größe der EDITTEXT-Controls ' Auswirkung auf die Zahlen?
zinsen_2.lst
' Übungsprogramm: Dialog ' weitere Dialogelemente (Gestaltung, Funktionalität) ' // Programm Zinsberechnung in einem Dialog // // --- Dialogdefinition in Units --- DLGBASE UNIT // UNIT ist 1/4 Zeichen breit, 1/8 Zeichen hoch DIALOG #1,100,20,200,260,"Zinsberechnung",WS_BORDER | WS_THICKFRAME,-22,"Times New Roman" BUTTON "Rechnen",1001,4,100,50,12,WS_TABSTOP BUTTON "Schließen",1002,60,100,50,12,WS_TABSTOP LTEXT "Startkapital:",1003,4,6,50,12 EDITTEXT "",1004,60,4,50,12,WS_BORDER | WS_TABSTOP LTEXT "Zinssatz:",1005,4,26,50,12 EDITTEXT "",1006,60,24,50,12,WS_BORDER | WS_TABSTOP LTEXT "Laufzeit:",1007,4,66,50,12 EDITTEXT "",1008,60,64,50,12,WS_BORDER | WS_TABSTOP LTEXT "Endkapital:",1009,4,86,50,12 LTEXT "",1010,60,86,50,12 // für die Ausgabe CHECKBOX "Steuerabzug 30%",1011,4,46,90,12,WS_TABSTOP | BS_AUTOCHECKBOX ENDDIALOG DLG FILL 1,RGB(192,192,192) // RotGrünBlau-Anteile 0 bis 255 SHOWDIALOG #1 REPEAT GETEVENT IF MENU(11) = WM_COMMAND // Dialogereignis SELECT MENU(12) // ID des Controls CASE 1002 ende! = TRUE CASE 1001 kapital = VAL(_WIN$(DLGITEM(1,1004))) zinssatz = VAL(_WIN$(DLGITEM(1,1006))) jahre% = VAL(_WIN$(DLGITEM(1,1008))) IF kapital > 0 AND zinssatz > 0 AND jahre% > 0 FOR i% = 1 TO jahre% zinsen = kapital / 100 * zinssatz IF CHECK?(1,1011) THEN zinsen = .7 * zinsen kapital = kapital + zinsen NEXT i% _WIN$(DLGITEM(1,1010)) = STR$(ROUND(kapital)) ENDIF ENDSELECT ENDIF UNTIL ende! CLOSEDIALOG #1 ' ' AUFGABEN: 1. Fall Rechnen ( CASE 1001) in Prozedur umformen. ' 2. Dialogfüllfarbe ändern. ' 3. Struktogramm nach Aufgabe 1. zeichnen.
proz_3.lst
' einfache Prozeduren als Befehlszusammenfassung ' Modularisierung ' // Progamm Prozedurdemo OPENW #1,10,10,_X - 20,_Y - 20,&X1011110000 ALERT 1, "Möchten Sie ", 1, "zeichnen | rechnen", al| IF al| = 1 zeichnen ENDIF IF al| = 2 rechnen ENDIF DELAY 3 CLOSEW #1 // Ende des Hauptprogramms //----------------------------------------------------- // Prozedurdefinitionen in GFA hinter dem Hauptprogramm // Reihenfolge der Prozeduren in GFA unerheblich PROCEDURE zeichnen CIRCLE 100,100,50 LINE 100,100,150,100 LINE 100,100,100,150 RETURN PROCEDURE rechnen umfang = 2 * PI * 50 inhalt = PI * 50 * 50 TEXT 10,10, "Umfang: " + STR$(umfang) TEXT 10,30, "Inhalt: " + STR$(inhalt) RETURN ' Aufgaben: 1. weitere Prozeduren ergänzen ' mit Fallunterscheidung ' 2. Prozedurfaltung mit F11 F12 testen
menu_4.lst
' Aufbau und Auswertung eines Menüs im Fenster ' Dimensionierung eines string-Datenfeldes (Menüeinträge) ' Aufbau eines Menüeintragsfeldes (Leerstrings am Ende) ' Hotkeys (& im Menüeintrag) ' Einfache Prozeduren (Befehlszusammenfassung) ' falten von Prozeduren (Tasten F11, F12) ' // Programm Menüdemo // // Konstantendefinition i_ ... Index i_oeffnen| = 1, i_ende| = 2, i_kunden| = 5, i_auftraege| = 6 // Index Menü //Menüeintragsfeld DIM men$(20) // string-Feld: 0. bis 20. Eintrag möglich men$(0) = "DATEI", men$(i_oeffnen|) = "&öffnen", men$(i_ende|) = "&ENDE", men$(3) = "" men$(4) = "DATENEINGABE", men$(i_kunden|) = "&Kunden", men$(i_auftraege|) = "&Aufträge", men$(7) = "" men$(8) = "" // OPENW #1 MENU men$() // Menü erstellen ende! = FALSE REPEAT // Menüauswertungsschleife GETEVENT // Ereignisabfrage IF MENU(1) = 20 // Menüeintrag gewählt SELECT MENU(0) // Menüindex in Menu(0) CASE i_oeffnen| // Fall ... oeffnen // Prozedur CASE i_ende| ende! = TRUE CASE i_kunden| kunden // Prozedur CASE i_auftraege| auftraege // Prozedur ENDSELECT ENDIF UNTIL MENU(1) = 4 OR ende! CLOSEW #1 // --- Prozeduren als Befehlszusammenfassung --- PROCEDURE oeffnen TEXT 10,20,"öffnen gewählt" DELAY 2 TEXT 10,20,SPACE$(100) RETURN PROCEDURE kunden TEXT 60,20,"Kunden gewählt" DELAY 2 TEXT 10,20,SPACE$(100) RETURN PROCEDURE auftraege TEXT 60,20,"Aufträge gewählt" DELAY 2 TEXT 10,20,SPACE$(100) RETURN ' ' AUFGABEN: 1. Struktogramm des Hauptprogramms ' 2. Weiteren Menüpunkt "Ausgabe" hinzufügen. ' 3. Befehle für Eingaben (Kunden) und ' Ausgaben in die Prozeduren eintragen. ' 4. Prozedur ende mit drei Signaltönen schreiben.
koord_5.lst
' Prozedur mit Wertübergabe (Call by Value) ' Lokale Variablen in Prozeduren ' Schriftauswahl ' // Darstellung eines Koordinatensystems OPENW #1,0,0,_X,_Y,$2f0 TITLEW #1,"Koordinatensysteme" TEXT 10,10,"erstes Koordinatensystem" FONT "Arial",WIDTH 5, HEIGHT 11 FONT TO fnt& SETFONT fnt& ursprung_x%=100, ursprung_y%=400 koordsys (ursprung_x%,ursprung_y%,50,40,7,6) DELAY 2 // einheit%=30,x_bis%=15,y_bis%=9 REPEAT SLEEP MOUSE maus_x%,maus_y%,maus_k% // Koordinatensystem zeichnen mit linker Maustaste IF maus_k%=1 THEN koordsys(maus_x%,maus_y%,einheit%,einheit%+5,x_bis%,y_bis%) IF maus_k%=2 THEN CLS // Fenster löschen mit rechter Maustaste UNTIL MENU(1)=4 SETFONT SYSTEM_FONT FREEFONT fnt& CLOSEW #1 //------------------------------------------------------------ PROCEDURE koordsys(x0%,y0%,ex%,ey%,x%,y%) // x0%,y0% Ursprung; ex%,ey% Einheit; x%,y% Anzahl Einheiten LOCAL x1%,y1% // x1%,y1% Endpunkte x-,y-Achse LOCAL i%,j% x1%=x0%+x%*ex%, y1%=y0%-y%*ey% LINE x0%,y0%,x1%,y0% // x-Achse LINE x0%,y0%,x0%,y1% // y-Achse FOR i%=x0% TO x1% STEP ex% // Schrittweite Einheit LINE i%,y0%,i%,y0%+5 TEXT i%-5,y0%+10,j% j%++ // Increment j% NEXT i% j%=0 FOR i%= y0% TO y1% STEP -ey% // Schrittweite Einheit LINE x0%,i%,x0%-5,i% TEXT x0%-25,i%-10,j% j%++ NEXT i% RETURN ' ' AUFGABEN: 1. Änderung der Parameterwerte für den Prozeduraufruf ' 2. Löschen von "-" in ... STEP -eY% : Wirkung? ' 3. Einfügen eines weiteren Prozeduraufrufs koordsys
figur_6.lst
' Programmierübung (Gesamtübung) ' Grafische Vorgabe der Aufgabe: Berechnung Figur ' (Menü, Dialog, Ausgabefenster) ' Wahlweise verschiedene Figuren (je Schüler eine!) ' Nutzung F-Tasten 11 und 12 ' //Lösung: Programm Figur (Beispiel Zylinder ausgeführt) // i_loeschen|=1, i_ende|=2, i_quader|=5, i_zylinder|=6, i_pyramide|=7 // Index Menü //Menüeintragsfeld DIM men$(20) men$(0)="DATEI", men$(i_loeschen|)="&loeschen", men$(i_ende|)="&ENDE", men$(3)="" men$(4)="Figur", men$(i_quader|)="&Quader", men$(i_zylinder|)="&Zylinder", men$(i_pyramide|)="&Pyramide",men$(8)="" men$(9)="" OPENW #1,10,10,_X-20,_Y-20,$2f0 TITLEW #1,"Programm Figur (Lösung)" MENU men$() // Menü erstellen ende!=FALSE,zylinder!=FALSE REPEAT GETEVENT IF MENU(1)=20 // Menüeintrag gewählt SELECT MENU(0) // Menüindex CASE i_loeschen| loeschen // Prozedur CASE i_ende| ende // Prozedur CASE i_quader| quader // Prozedur CASE i_zylinder| zylinder // Prozedur CASE i_pyramide| pyramide // Prozedur ENDSELECT ENDIF IF zylinder! IF volumen! THEN TEXT 10,200,"V = "+STR$(volumen) IF oberflaeche! THEN TEXT 10,240,"Ao = "+STR$(oberflaeche) ELLIPSE 200,150,50,25 ELLIPSE 200,350,50,25 LINE 150,150,150,350 LINE 250,150,250,350 ENDIF UNTIL MENU(1)=4 OR ende! CLOSEW #1 // PROCEDURE loeschen CLS zylinder!=FALSE RETURN PROCEDURE ende TEXT 10,20,"Ende gewählt" DELAY 1 TEXT 10,20,SPACE$(100) ende!=TRUE BEEP DELAY 0.5 BEEP RETURN PROCEDURE quader TEXT 60,20,"Quader gewählt" DELAY 2 TEXT 10,20,SPACE$(100) RETURN PROCEDURE zylinder CLS zylinder!=TRUE // Werteberechnung in einem Dialog // DLGBASE UNIT // UNIT ist 1/4 Zeichen Breit, 1/8 Zeichen Hoch DIALOG #1,100,20,140,160,"Zylinderberechnung", WS_BORDER|WS_THICKFRAME,-16,"Times new Roman" PUSHBUTTON " berechnen",1001,40,100,50,12,WS_TABSTOP LTEXT "Radius",1002,4,6,50,12 EDITTEXT "",1003,60,4,50,12,WS_BORDER | WS_TABSTOP LTEXT "Höhe",1004,4,26,50,12 EDITTEXT "",1005,60,24,50,12,WS_BORDER | WS_TABSTOP CHECKBOX "Volumen",1006,4,46,90,12,WS_TABSTOP | BS_AUTOCHECKBOX CHECKBOX "Ao",1007,4,60,130,20,WS_TABSTOP | BS_AUTOCHECKBOX ENDDIALOG DLG FILL 1,RGB(192,192,192) SHOWDIALOG #1 berechnet! = FALSE, volumen!=FALSE, oberflaeche!=FALSE REPEAT GETEVENT IF MENU(11) = WM_COMMAND // Dialogereignis SELECT MENU(12) // ID des Controls CASE 1001 berechnet! = TRUE // berechnen r = VAL(_WIN$(DLGITEM(1,1003))) // Radius h = VAL(_WIN$(DLGITEM(1,1005))) // Höhe IF r > 0 AND h > 0 IF CHECK?(1,1006)THEN volumen=PI*r*r*h, volumen!=TRUE IF CHECK?(1,1007)THEN oberflaeche=2*PI*r*(r+h),oberflaeche!=TRUE ENDIF ENDSELECT ENDIF UNTIL berechnet! CLOSEDIALOG #1 RETURN PROCEDURE pyramide TEXT 60,20,"Pyramide gewählt" DELAY 2 TEXT 10,20,SPACE$ (100) RETURN