|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
pinkpanther
Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 06.08.2006, 17:27 Titel: Problem mit AK-Lib |
|
|
Hallo Leute,
ich habe heute angefangen, mein Grafik-N00b-Dasein zu beenden und zu diesem Zweck mal den Einstieg in dieses Thema mit Hilfe der AK-Lib versucht.
Ich muss sagen, die Lib funktioniert echt super , ist logisch & einfach strukturiert und dazu gut dokumentiert - mit einem Wort - ein geniales Stück Software, das A.K. der QB-Community da zur Verfügung gestellt hat.
Ich bin allerdings auf ein kleines Problem gestoßen, das sich nicht & nicht lösen lässt. Vielleicht kann mich jemand auf meinen Denkfehler aufmerksam machen.
Und zwar schmiert mir meine gesamtes MS-DOS-Teilsystem bei Ausführung der Prozedur PageCopy mit folgender Meldung ab: Zitat: | "Die NTVDM-CPU hat einen ungültigen Befehl entdeckt. CS:5f81 IP:3134 OP:fe fe fe fe fe Klicken Sie auf "Schließen", um die Anwendung zu beenden." |
Ich arbeite mit QuickBasic PDS unter WIN XP.
Hier ist das Programm:
Code: | DEFINT A-Z
'AKTEST.BAS
' Dieses Programm testet die Moeglichkeiten der AK-Lib
' Version 1.5 aus.
'
' Es sollen nacheinander die unter den Dateinamen
' 'Bild1.bmp' bis 'Bild5.bmp' gespeicherten Bilder angezeigt
' werden (ca. 300 x 400 Pixel, 256 Farben, Farbtiefe 8 Bit).
' Diese Dateien sind im Verzeichnis ctWorkDir$ abgelegt.
' Jedes Bild soll in eine Bildschirmmaske platziert werden,
' die sich aus Rahmenelementen und Texten zusammensetzt.
'
' (c) pinkpanther, der (Noch-)QB-Grafik-n00b
'Deklarationen der verwendeten Prozeduren aus der AK-Lib
DECLARE SUB PageCopy (FromPage, ToPage)
DECLARE SUB PalToRgb (Colr, Red, Green, Blue)
DECLARE SUB Set.Picture (x, y, Datei$)
DECLARE SUB Set.Work.Page (Page)
DECLARE SUB Set.View.Page (Page)
DECLARE SUB XColor (f, b, bx)
DECLARE SUB XLine (x1, y1, x2, y2, f, cmd$)
DECLARE SUB XMouse (Aktion$, Taste, x, y)
DECLARE SUB XPrint (x, y, text$)
DECLARE SUB XScreen (ScreenMode)
'Verzeichnis, von dem die Bilder eingelesen werden sollen
CONST ctWorkDir$ = CurDir$ 'ggf. anpassen!
'Bildschirmmodus 640 x 480 x 256 einrichten
CLS
XScreen &H101
'Arbeits- und Anzeigeseite auf 0 setzen
Set.Work.Page 0
Set.View.Page 0
'Ausgangswert fuer Farbe Weiss = 7
iCurColorWhite = 7
DO
FOR i = 1 TO 5
'Pfad des anzuzeigenden Bildes ermitteln;
' wenn Datei nicht existiert, Zaehlschleife verlassen
tDateiName$ = "bild" + LTRIM$(RTRIM$(STR$(i))) + ".bmp"
tPfad$ = ctWorkDir$ + tDateiName$
IF LEN(DIR$(tPfad$)) = 0 THEN
EXIT FOR
END IF
'DIR$ gibt's erst ab PDS;
' einfacher QB4.5-Workaround:
'FileIsMissing = 0
'OPEN tPfad$ FOR BINARY AS #1
' IF LOF(1) = 0 THEN
' FileIsMissing = -1
' END IF
'CLOSE #1
'IF FileIsMissing THEN
' KILL tPfad$
' EXIT FOR
'END IF
'Benutzer auf Bildschirmseite 0 ueber eine evt.
' bevorstehende Wartezeit informieren:
' dazu Meldung in ein mit weisser Farbe ausgefuelltes
' Rechteck schreiben;
' schliesslich Bildschirmseite 0 sichtbar machen
Set.Work.Page 0
GOSUB InformWait
Set.View.Page 0
'Bild auf Bildschirmseite 1 zeichnen:
' Breite und Hoehe des Bildes in xLen&/yLen& lesen;
' Bild an den Bildschirmkoordinaten 10/10 anzeigen
Set.Work.Page 1
OPEN tPfad$ FOR BINARY AS #1
GET #1, 19, xLen&
GET #1, 23, yLen&
CLOSE #1
Set.Picture 10, 10, tPfad$
'Farbe 'Weiss' aus aktueller Palette ermitteln:
' das reinste Weiss entspricht dem Maximum der
' summierten Rot-Gruen-Blau-Werte
iMaxFarbWert = 0
FOR iFarbe = 0 TO 255
PalToRgb iFarbe, iRot, iGruen, iBlau
iSummeFarbWerte = iRot + iGruen + iBlau
IF iSummeFarbWerte > iMaxFarbWert THEN
iMaxFarbWert = iSummeFarbWerte
iCurColorWhite = iFarbe
END IF
NEXT
'Farbe der Wartemeldung korrigieren
' (Palette hat sich mittlerweile veraendert)
Set.Work.Page 0
GOSUB InformWait
Set.Work.Page 1
'Weisse Rahmen zeichnen, darin diverse Texte ausgeben
' (Unterkante des linken Rahmens an Bildhoehe anpassen)
XColor iCurColorWhite, 0, 1
XLine 0, 0, xLen& + 20, yLen& + 20, iCurColorWhite, "B"
XLine xLen& + 20, 0, 639, 479, iCurColorWhite, "B"
XPrint xLen& + 25, 4, "TESTUEBERSCHRIFT"
XLine xLen& + 20, 21, 639, 479, iCurColorWhite, "B"
XPrint xLen& + 25, 25, "Testdaten"
XPrint 10, yLen& + 26, tPfad$
'Bildschirmseite 1 auf Seite 0 kopieren;
' (dient als Hintergrund fuer die folgende Wartemeldung)
' dann Bildschirmseite 1 anzeigen
'PageCopy 1, 0 ' <--- HIER PASSIERT DER ABSTURZ!
Set.View.Page 1
'auf Benutzeraktion (Tastendruck) warten;
' Tastendruck zwecks spaeterer Auswertung in Ky$
' speichern
DO
Ky$ = INKEY$
LOOP UNTIL LEN(Ky$)
'naechstes Bild anzeigen, wenn nicht Escape
' gedrueckt wurde
IF ASC(Ky$) = 27 THEN
EXIT FOR
END IF
NEXT
'wenn Benutzer die Escape-Taste gedrueckt hat,
' Programm beenden
LOOP UNTIL ASC(Ky$) = 27
SCREEN 0
CLS
END
InformWait:
'Benutzer auf Bildschirmseite 0 ueber eine evt.
' bevorstehende Wartezeit informieren:
' dazu Meldung in ein mit weisser Farbe ausgefuelltes
' Rechteck schreiben;
XLine 240, 200, 430, 230, iCurColorWhite, "BF"
XColor 0, iCurColorWhite, 1
XPrint 250, 210, "Einen Moment bitte..."
RETURN |
Danke für eure Hilfe! _________________ lG
pinkpanther |
|
Nach oben |
|
|
A.K.
Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 06.08.2006, 18:39 Titel: |
|
|
Hi,
habs bei mir ebend mal ausprobiert und festgestellt das der PageCopy wirklich irgendein Problem hat. Gleiche Fehlermeldung wie bei dir kommt bei mir auch und unter DOS stürzt er einfach so ab.
Das heißt im ersten Step am besten das PageCopy rausnehmen und dafür einen Ersatz dahernehmen.
Folgendes Programm kannst du dafür nehmen. Es ist natürlich nicht so schnell wie der PageCopy-Befehl.
Code: |
FromPage% = 1
ToPage% = 0
For i% = 0 TO 479
SET.WORK.PAGE (FromPage%)
XGet 0, i%, 639, i%, puffer$
SET.WORK.PAGE (ToPage%)
XPut 0, i%, puffer$
Next i%
puffer$=""
|
Ansonsten bin ich gerade dabei das Assemblerprogramm für PageCopy auseinander zu pflücken und mal nachzuschauen was dort los ist.
Das kann aber noch ne Weile dauern.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
|
pinkpanther
Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 06.08.2006, 19:03 Titel: |
|
|
Danke für die rasche Antwort & die Anleitung zum Workaround! _________________ lG
pinkpanther |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|