Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Problem mit AK-Lib

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 06.08.2006, 16:27    Titel: Problem mit AK-Lib Antworten mit Zitat

Hallo Leute,

ich habe heute angefangen, mein Grafik-N00b-Dasein zu beenden mit den Augen rollen und zu diesem Zweck mal den Einstieg in dieses Thema mit Hilfe der AK-Lib versucht.

Ich muss sagen, die Lib funktioniert echt super happy, 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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 06.08.2006, 17:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 06.08.2006, 18:03    Titel: Antworten mit Zitat

Danke für die rasche Antwort & die Anleitung zum Workaround! lächeln
_________________
lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz