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.