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