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