Thema_4

bild_1.lst

' Bitmaps in Dialogen
' word-Variablen als Bitmap-Handle
'
// Progmm Bild
//
// irgendein Fenster ...sonst werden die Bilder im Dialog
// nicht farbig
OPENW #1,0,0,0,0,0
DIALOG #1,20,20,600,500,"Bilder",WS_THICKFRAME,-24,"Courier New"
  BUTTON "E&xit",101,50,10,500,32
  BUTTON "",102,50,50,500,400,BS_OWNERDRAW  // ... für Bilder
ENDDIALOG
bmp0& = LOADBMP("fisch16.bmp") // ein Bild laden aus dem  Verzeichnis
bmp1& = LOADBMP("geld.bmp")   // ein weiteres Bild
//zuweisen der Bilder zum OWNERDRAW-Button (normal + klick)
_WIN$(DLGITEM(1,102))=STR$(bmp0&)+","+STR$(bmp1&)
DLG FILL 1, RGB(0,192,192)
SHOWDIALOG #1
REPEAT
  GETEVENT
  IF MENU(11)=WM_COMMAND
    SELECT MENU(12)
    CASE 101
      beenden!=TRUE
    ENDSELECT
  ENDIF
UNTIL beenden!
CLOSEDIALOG #1
CLOSEW #1
FREEBMP bmp0&  // nach closew Speicher für Bitmaps wieder freigeben
FREEBMP bmp1&
'
'AUFGABEN: 1. Mit Paintbrush eigenes Bild zeichnen, auf Disk
'             speichern und in das Programm einbinden. (Pfad)
'

type_2.lst

' Strukturierte Daten: TYPE (record, structure)
' Zusammenfassung verschiedener Variablenarten
' Einbindung von Bildern über das Handle
' Eingabe über Dialog
'
// Programm type
OPENW #1,.05*_X,.05*_Y,.85*_X,.85*_Y,$2F0
TITLEW #1,"Type_1"
// Definition der Datenstruktur (Elemente)
TYPE person:
- STRING(20) name$
- STRING(20) vorname$
- STRING(10)  geb$
- STRING(64)  bildpfad$
- WORD bildhdl
- BYTE kurse
- DOUBLE beitrag#
ENDTYPE
// Dimensionierung von Type-Variablen
person: mitglied.
person: aufnahme.
DIM person: abgang.
//
DLGBASE UNIT
DIALOG #1,32,32,300,250,"Personendaten",WS_THICKFRAME,-16,"Courier New"
  LTEXT "Name",101,10,10,80,12
  LTEXT "Vorname",102,10,30,80,12
  LTEXT "geb.",103,10,50,80,12
  EDITTEXT "",104,100,10,80,12,WS_BORDER|WS_TABSTOP
  EDITTEXT "",105,100,30,80,12,WS_BORDER|WS_TABSTOP
  EDITTEXT "",106,100,50,80,12,WS_BORDER|WS_TABSTOP
  LTEXT "Kurse",111,10,80,80,12
  LTEXT "Beitrag",112,10,100,80,12
  EDITTEXT "",113,100,80,80,12,WS_BORDER|WS_TABSTOP
  EDITTEXT "",114,100,100,80,12,WS_BORDER|WS_TABSTOP
  BUTTON "BILD",201,16,160,40,12,WS_TABSTOP
  BUTTON "",202,60,120,80,80,BS_OWNERDRAW|WS_BORDER
  DEFPUSHBUTTON "übernehmen",301,150,140,60,16,WS_TABSTOP
  BUTTON "OK",401,150,180,60,16,WS_TABSTOP
ENDDIALOG
SHOWDIALOG #1
ende!=FALSE
REPEAT
  GETEVENT
  IF MENU(11)=WM_COMMAND
    SELECT MENU(12)
    CASE 201
      bild
    CASE 301
      uebernehmen
    CASE 401
      ende!=TRUE
    ENDSELECT
  ENDIF
UNTIL  ende!
CLOSEDIALOG #1
// --- Auswertung ---
TOPW #1
REPEAT
  GETEVENT
  TEXT 10,10,"Inhalt der Type-Variablen Aufnahme."
  TEXT 10,30, aufnahme.bildpfad$
  TEXT 10,50, "Handle: "+STR$(aufnahme.bildhdl)
  TEXT 10,70,aufnahme.name$+"  Beitrag: "+STR$(aufnahme.beitrag#)
  //
  mitglied.=aufnahme.       // Zuweisung gesamte Type-Variable
  //
  TEXT 350,10,"Inhalt von Type-Variable Mitglied."
  TEXT 350,30,mitglied.bildpfad$
  TEXT 350,50, "Handle: "+STR$(mitglied.bildhdl)
  TEXT 350,70,mitglied.name$+ "  Beitrag: "+STR$(mitglied.beitrag#)
  //    Bild an Fenstergröße angepaßt darstellen
  STRETCH 10,100,aufnahme.bildhdl,_X/1.4,_Y/1.4
  //
UNTIL MENU(1) = 4 OR INKEY$ = CHR$(27)
CLOSEW #1
FREEBMP aufnahme.bildhdl   // Freigabe des Bildspeichers
//
// ---------------------- PROZEDUREN --------------------------
//
PROCEDURE bild
  FILESELECT "C:\TEST\*.*","*.bmp",datei$  // einfache Dateiauswahlbox
  aufnahme.bildpfad$=datei$
  aufnahme.bildhdl=LOADBMP(datei$)  // Bild laden
  ENABLEW DLG(1)    // Maus- und Tastatureingaben auf Dialog 1
  // Bild darstellen:
  _WIN$(DLGITEM(1,202))= STR$(aufnahme.bildhdl)+","+STR$(aufnahme.bildhdl)+",,,&+"
RETURN
PROCEDURE uebernehmen
  aufnahme.name$=_WIN$(DLGITEM(1,104))
  aufnahme.vorname$=_WIN$(DLGITEM(1,105))
  aufnahme.geb$=_WIN$(DLGITEM(1,106))
  aufnahme.kurse=VAL(_WIN$(DLGITEM(1,113)))
  aufnahme.beitrag#=VAL(_WIN$(DLGITEM(1,114)))
RETURN
'
' AUFGABEN: 1. Weiteres Element in die Datenstruktur einfügen.
'           2. Ausgabefenster als Nutzer in der Größe verändern. (Bild!)

qsort_3.lst

' Sortieren von Daten
' Nutzung des GFA QSORT - Befehls
'

//Programm QUICKSORT von Datenfeldern (array)
OPENW #1,5,20,_X-10,_Y-40,$2f0
TITLEW #1,"QUICKSORT"
OPTION BASE 1
DIM in_firma$(20),firma$(20),in_betrag(20),betrag(20),index%(20)
BUTTON "weiter",1000,_X * 0.25,_Y * 0.9,80,32  // Control im Fenster
BUTTON "ende",2000,_X*0.5,_Y*0.9,80,32
ende!=FALSE
REPEAT
  CLS
  GETEVENT
  ueberschrift
  FOR i%=1 TO 20                      // Werte zufällig zuordnen
    index%(i%)=i%
    f1|=RAND(26)
    f2|=RAND(26)
    f3|=RAND(26)
    in_firma$(i%)=CHR$(65+f1|)+CHR$(65+f2|)+CHR$(65+f3|)
    in_betrag(i%)=ROUND(RND(0)*100,2)
    TEXT 10,16+16*i%,i%
    TEXT 50,16+16*i%,in_firma$(i%)
    TEXT 150,16+16*i%,in_betrag(i%)
    firma$(i%)=in_firma$(i%)
    betrag(i%)=in_betrag(i%)
  NEXT i%
  ALERT 2,"sortieren|nach",1,"Betrag|Firma",bf|
  IF bf|=1
    QSORT betrag(+),20,index%()             // sortiert nach Betrag
  ELSE
    QSORT firma$(+),20,index%()             // sortiert nach Firma
  ENDIF
  CLS
  weiter!=FALSE
  REPEAT
    PEEKEVENT
    IF MENU(1) = 30    // Control im Fenster angeklickt
      SELECT MENU(0)   // ID des Controls
      CASE 1000
        weiter!=TRUE
      CASE 2000
        ende!=TRUE
      ENDSELECT
    ENDIF
    PEEKEVENT  // nochmalige Ereignisabfrage!!!
    ueberschrift
    FOR i%=1 TO 20
      // Eingegebenes:
      TEXT 10,16+16*i%,i%
      TEXT 50,16+16*i%,in_firma$(i%)
      TEXT 150,16+16*i%,in_betrag(i%)
      // Sortiertes:
      TEXT 310,16+16*i%,index%(i%)
      IF bf|=1
        TEXT 310,16,"sortiert nach Betrag  "
        TEXT 350,16+16*i%,firma$(index%(i%))
        TEXT 450,16+16*i%,betrag(i%)
      ELSE
        TEXT 310,16,"sortiert nach Firma   "
        TEXT 350,16+16*i%,firma$(i%)
        TEXT 450,16+16*i%,betrag(index%(i%))
      ENDIF
    NEXT i%
  UNTIL weiter! OR ende!
UNTIL ende!
CLOSEW #1
//---------------------------------------------
PROCEDURE ueberschrift
  TEXT 120,0,"Sortieren von zufällig erzeugten Firmen und Beträgen"
  TEXT 10,16,"Index"
  TEXT 50,16,"Firma"
  TEXT 150,16,"Betrag"
RETURN
'
' Aufgaben: 1. Analysieren der Wirkung der Indexsortierung

qsoue_4.lst

' Sortierung von vorgegebenen Datenfeldern
' Übungen zum Sortieren
'
//
OPENW #1,0,0,_X,_Y,$2f0
TITLEW #1,"Sortierung"
OPTION BASE 1
DIM betrag(10),sort_betrag(10),index%(10),sort_index%(10)
betrag(1)=6.8, betrag(2)=5.5, betrag(3)=1.7575  // 10 beliebige Zahlen
betrag(4)=12.7, betrag(5)=6.18, betrag(6)=6.888
betrag(7)=99, betrag(8)=-6.68, betrag(9)=26.8
betrag(10)=-34.8
FOR i%=1 TO 10
  index%(i%)=i%              // laufende Nr. ins Indexfeld speichern:
  //                            index%(1)=1, index%(2)=2,  ...
  sort_betrag(i%)=betrag(i%) // Betrag ins Sortierfeld kopieren
  sort_index%(i%)=index%(i%) // Index ins Sortierindexfeld kopieren
NEXT i%
sort!=FALSE, sort_anzeige!=FALSE
REPEAT
  GETEVENT
  IF NOT sort_anzeige!
    TEXT 50,350," --> weiter: Leertaste"
  ENDIF
  FOR i%=1 TO 10
    TEXT 10,60+20*i%,STR$(index%(i%),2,0)+STR$(betrag(i%),12,2)+" DM "
  NEXT i%
  taste$=INKEY$
  IF taste$=CHR$(32)         // Leertaste: Code 32
    sort!=TRUE, sort_anzeige!=TRUE
  ENDIF
  IF sort!
    sort!=FALSE
    //
    QSORT sort_betrag(+),10,sort_index%()     //quicksort
    //
  ENDIF
  IF sort_anzeige!
    TEXT 50,350," --> beenden:  Schließmenü, rechte Maustaste oder ESC"
    FOR i%=1 TO 10
      TEXT 300,60+20*i%, STR$(sort_index%(i%),2,0) + STR$(sort_betrag(i%),12,2) + " DM "
    NEXT i%
  ENDIF
  PEEKEVENT
UNTIL  MENU(1)=4 OR MOUSEK=2 OR taste$=CHR$(27)
CLOSEW #1
'
' AUFGABEN:  1. Feld absteigend sortieren
'            2. Nur die ersten 5 Elemente sortieren
'            3. Erklären Sie das Zusammenwirken von Betrag und Index

liste_5.lst

' Listenverarbeitung
' zweidimensionales Feld und Liste
'
//Programm einfach verkettete Liste
OPENW #1,0,0,_X,_Y,0
TITLEW #1,"einfach verkettete Liste"
DIM k(20,2)                // Kette 20 Zeilen 2 Spalten
TEXT 200,10,"Nr. von 1 bis 20;           Ende mit nächste Nr. 0"
INPUT "Anfang Nr. ";nr%
k(0,1)=nr%                 // Spalte 1: Nummern
// Füllen der Liste
DO
  INPUT "Wert: ";wert
  k(nr%,0)=wert            // Spalte 0: Werte
  INPUT "nächste Nr.,";n_nr%
  EXIT IF n_nr%=0
  k(nr%,1)=n_nr%
  nr%=n_nr%
LOOP
// Auswertung
CLS 3
TEXT 200,6,"Nr."
TEXT 240,6,"Wert"
TEXT 300,6,"nächste Nr."
FOR i%=0 TO 20
  TEXT 200,i%*16+32,i%
  TEXT 240,i%*16+32,k(i%,0)
  TEXT 300,i%*16+32,k(i%,1)
  TEXT 10,_Y-25,"TASTE: -> weiter"
NEXT i%
KEYGET dd%
TEXT 400,10,"Werte in Reihenfolge"
j%=k(0,1)
i%=0
DO
  i%++
  TEXT 400,i%*16+16,k(j%,0)
  j%=k(j%,1)
  EXIT IF j%=0 OR i%=21
LOOP
KEYGET dd%
CLOSEW #1

hit_6.lst

' Verarbeitung dynamischer Listen
' Kombination der Befehle INSERT(DELETE) SWAP ERASE
' Schwerpunkt: Prozeduren und Funktionen zur Listenverarbeitung
' (ohne Menüs und Dialoge)
'
//Programm hitliste
OPENW #1,0,0,_X,_Y,$2f0
OPTION BASE 1
DIM hit$(1)
hit$(1)=" *** Ende ***"   // Eintrag als Endekennung der Liste
TEXT 300,20,"Ende der Eingabe mit Titel: Leertaste"
// --- Füllen der Hitliste ---
DO
  PEEKEVENT
  INPUT "Titel:",titel$
  EXIT IF titel$=" "
  INPUT "       eifügen auf Platz: ",platz&
  aufnehmen(titel$,platz&,hit$())
LOOP
// --- einen Titel streichen ---
INPUT "streiche Titel:",raus$
streichen(raus$,hit$())
// --- suchen eines Titels ---
INPUT "Suchen nach: ",titel$
gefunden&=@platz(titel$,hit$())
CLS
// --- Anzeige der Liste und Ergebnisse ---
REPEAT
  GETEVENT
  TEXT 10,16,"gestrichen wurde: (wenn vorhanden!)  "+raus$
  IF gefunden&<>0
    TEXT 10,32,titel$+" ist aktuell auf Platz "+STR$(gefunden&)
  ELSE
    TEXT 10,32,titel$+" wurde nicht gefunden"
  ENDIF
  FOR i&=1 TO DIM?(hit$())
    TEXT 10,64+16*i&,"Platz "+STR$(i&)+":  "+hit$(i&)
  NEXT i&
UNTIL MENU(1)=4
CLOSEW #1
// --- Prozeduren und Funktionen ---
PROCEDURE aufnehmen(inhalt$,nr&,VAR liste$())
  LOCAL j&, d&=DIM?(liste$())
  IF nr&>d& OR nr& < 1
    ALERT 1,"FALSCHE|NUMMER",1,"OK",ok|
  ELSE
    DIM neue_liste$(d&+1)    // Platz für neuen Titel
    FOR j&=1 TO d&
      neue_liste$(j&)=liste$(j&) // umkopieren
    NEXT j&
    INSERT neue_liste$(nr&)=inhalt$ // Titel einfügen
    SWAP liste$(),neue_liste$()  // Deskriptoren tauschen
    ERASE neue_liste$()      // weg damit
  ENDIF
RETURN
PROCEDURE streichen(inhalt$,VAR liste$())
  LOCAL j&, platz&, d&=DIM?(liste$())
  // beachte: Variable und Funktion namensgleich ( & @ )
  platz&=@platz(inhalt$,liste$())     // suchen des Titels
  IF platz&>0 AND platz&d&
    EXIT IF inhalt$=liste$(i&)
  LOOP
  IF i&>d&
    ALERT 1,"NICHT|GEFUNDEN",1,"OK",ok|
    i&=0
  ENDIF
  RETURN i&
ENDFUNC
'
' AUFGABEN: 1. Überlegung für eine weitere Listenauswertung
'               Struktogramm und Prozedur (Funktion) dazu.

baum_7.lst

' Baumstrukturen
'
// Programm Baum
OPENW #1,10,10,_X-20,_Y-20,$10
TITLEW #1,"Baum"
FONT "Courier New",WIDTH 8, HEIGHT 16 TO fnt&
SETFONT fnt&
CLS 7
DIM bezeich$(0),baum%(0)
INPUT "Wurzelbezeichnung: ",wurzel$   //die Wurzel
bezeich$(0)=wurzel$
baum%(0)=0
REPEAT
  ALERT 2,"wählen Sie bitte",1,"NEU|WEG|ENDE",al|
  SELECT al|
  CASE 1
    INPUT "Neu an: ",bezeichnung$
    INPUT "Untergliederung: ",unterglied$
    neu(bezeichnung$,unterglied$,bezeich$(),baum%())
  CASE 2
    INPUT "beseitige: ",bezeichnung$
    weg(bezeichnung$,bezeich$(),baum%())
  ENDSELECT
  CLS 7
  // Ausgabe
  FOR i%=0 TO DIM?(baum%())-1
    TEXT 300+20*baum%(i%),16+16*i%,STR$(baum%(i%))+" "+bezeich$(i%)
  NEXT i%
UNTIL al|=3
SETFONT SYSTEM_FONT
FREEFONT fnt&
CLOSEW #1
//------------------------------------
PROCEDURE neu(bez$,untergl$,VAR bezeich$(),baum%())
  LOCAL d%,i%,index%
  index%=@suchen(bez$,bezeich$())
  IF index%=-1
    ALERT 1,"sorry",1,"OK",al|  // nicht gefunden
  ELSE
    d%=DIM?(bezeich$())
    i%=0
    DIM bezeich_neu$(d%),baum_neu%(d%) // 1 El. mehr (ab 0.)
    FOR i%=0 TO d%-1
      bezeich_neu$(i%)=bezeich$(i%)
      baum_neu%(i%)=baum%(i%)
    NEXT i%
    INSERT bezeich_neu$(index%+1)=untergl$
    INSERT baum_neu%(index%+1)=baum%(index%)+1 // nächste Ebene
    SWAP bezeich$(),bezeich_neu$()
    SWAP baum%(),baum_neu%()
    ERASE bezeich_neu$(),baum_neu%()
  ENDIF
RETURN
PROCEDURE weg(bez$,VAR bezeich$(),baum%())
  LOCAL d%,index%,ebene%
  index%=@suchen(bez$,bezeich$())
  IF index%=-1 OR bez$=wurzel$
    ALERT 1,"sorry",1,"OK",al|  // nicht gefunden oder Wurzel
  ELSE
    d%=DIM?(baum%())
    ebene%=baum%(index%)
    DELETE bezeich$(index%)
    DELETE baum%(index%)
    DEC d%
    WHILE baum%(index%)>ebene%
      DELETE bezeich$(index%)
      DELETE baum%(index%)
      DEC d%
    WEND
    DIM bezeich_neu$(d%-1),baum_neu%(d%-1)
    FOR i%=0 TO d%-1
      bezeich_neu$(i%)=bezeich$(i%)
      baum_neu%(i%)=baum%(i%)
    NEXT i%
    SWAP bezeich$(),bezeich_neu$()
    SWAP baum%(),baum_neu%()
    ERASE bezeich_neu$(),baum_neu%()
  ENDIF
RETURN
FUNCTION suchen(bezeichnung$,VAR bezeich$())
  LOCAL i%,d%
  i%=0
  d%=DIM?(bezeich$())
  DO
    EXIT IF bezeichnung$=bezeich$(i%)
    INC i%
    EXIT IF i%=d%
  LOOP
  IF i%=d%
    RETURN -1     // nicht gefunden!
  ELSE
    RETURN i%
  ENDIF
ENDFUNC
'
' AUFGABEN: 1. Überlegung zu weiteren Prozeduren zur Baum-
'              bearbeitung.