LPARAMETERS tcFileName *!* LET OP !! *!* Niet alle variabelen worden hier bovenin gedeclareerd. Om snelheidsredenen *!* worden de variabelen die nodig zijn voor het maken van een Bitmap verderop *!* in deze routine ingesteld. LOCAL lcFileName LOCAL lnFileHandle lcFileName = ALLTRIM(tcFileName) lnFileHandle = 0 *!* Voor de zekerheid controleren we hier of het bestand bestaat. IF !FILE(lcFileName) THIS.cFileName = "" THIS.nACVersion = 0 THIS.cACVersion = "" THIS.PictureVal = FILETOSTR(goApp.cHomeDir + "framework\grafisch\geenvoorbeeld.bmp") RETURN ENDIF *!* Nu het bestand aanwezig lijkt te zijn, *!* kunnen we er daadwerkelijk mee aan de slag. *!* Eerst lezen we de versie uit. Is de versie lager dan 1014 *!* dan zit er geen Preview in het bestand. THIS.cFileName = lcFileName lnFileHandle = FOPEN(THIS.cFileName, 0) = FREAD(lnFileHandle, 2) THIS.nACVersion = VAL(FREAD(lnFileHandle, 4)) DO CASE CASE THIS.nACVersion = 1021 THIS.cACVersion = "AutoCAD 2007" CASE THIS.nACVersion = 1018 THIS.cACVersion = "AutoCAD 2004/2005/2006" CASE THIS.nACVersion = 1015 THIS.cACVersion = "AutoCAD 2000/2000i/2002" CASE THIS.nACVersion = 1014 THIS.cACVersion = "AutoCAD 14" CASE THIS.nACVersion = 1013 THIS.cACVersion = "AutoCAD 14, Sample" CASE THIS.nACVersion = 1012 THIS.cACVersion = "AutoCAD 13" CASE THIS.nACVersion = 1009 THIS.cACVersion = "AutoCAD 11/12" CASE THIS.nACVersion = 1006 THIS.cACVersion = "AutoCAD 10" CASE THIS.nACVersion = 1004 THIS.cACVersion = "AutoCAD 9" OTHERWISE THIS.cACVersion = "" ENDCASE IF THIS.nACVersion < 1014 THIS.PictureVal = FILETOSTR("grafisch/geenvoorbeeld.bmp") = FCLOSE(lnFileHandle) RETURN ENDIF *!* Nu kan de Bitmap worden uitgelezen en afgebeeld. LOCAL lnStartOfBitmap, lnNumberOfDescriptors, lnNum1 LOCAL lnDescriptorID, lnDescriptorStart, lnDescriptorLength LOCAL lcBitmap LOCAL lcFileHeaderType, lcFileSize, lcFileHeaderReserved1, lcFileHeaderReserved2, lcFileHeaderOffsetBits lnStartOfBitmap = 0 lnNumberOfDescriptors = 0 lnNum1 = 0 lnDescriptorID = 0 lnDescriptorStart = 0 lnDescriptorLength = 0 lcBitmap = "" lcFileHeaderType = "" lcFileSize = "" lcFileHeaderReserved1 = "" lcFileHeaderReserved2 = "" lcFileHeaderOffsetBits = "" *!* Daar gaan we..... = FSEEK(lnFileHandle, 13, 0) && Pointer verplaatsen lnStartOfBitmap = DWord2Num(FREAD(lnFileHandle, 4)) && Startlocatie van de Bitmap = FREAD(lnFileHandle, lnStartOfBitmap - 17 + 16) && Startlocatie is een absolute offset, dus de huidige && positie (17 = 13 + 4) moet in mindering worden gebracht && 16 Is de lengte van de header van de BMP. Doen we niks mee = FREAD(lnFileHandle, 4) && Pointer verplaatsen lnNumberOfDescriptors = ASC(FREAD(lnFileHandle, 1)) && Aantal Descriptors aftappen FOR lnNum1 = 1 TO lnNumberOfDescriptors && Loop door de Descriptors heen lnDescriptorID = ASC(FREAD(lnFileHandle, 1)) && de id, lnDescriptorStart = DWord2Num(FREAD(lnFileHandle, 4)) && dan de startpositie en lnDescriptorLength = DWord2Num(FREAD(lnFileHandle, 4)) && tenslotte de lengte aftappen IF lnDescriptorID = 2 && Indien Descriptor Type = 2 (de Bitmap zelf) EXIT && Exit de Loop en gebruik de gevonden startpositie en lengte ENDIF ENDFOR = FSEEK(lnFileHandle, lnDescriptorStart, 0) && Pointer naar begin van de Bitmap lcBitMap = FREAD(lnFileHandle, lnDescriptorLength) = FCLOSE(lnFileHandle) *!* Nu gaan we de header voor de bitmap samenstellen. lcFileHeaderType = Num2Word(19778) && Letters BM in de Header als identificatie lcFileSize = Num2DWord(14 + lnDescriptorLength) && grootte van het bestand (header + bitmap zelf) lcFileHeaderReserved1 = Num2Word(0) && geen betekenis lcFileHeaderReserved2 = Num2Word(0) && geen betekenis lcFileHeaderOffsetBits = Num2DWord(1078) && offset naar begin van de feitelijke bitmap && de waarde 1078 is een aanname die "altijd" klopt. *!* Tenslotte de bitmap samenstellen uit de verschillende onderdelen van *!* de header en de bitmap zelf die uit de AutoCAD-tekening is geript en *!* gelijk in de preview afbeelden (Jippie VFP9 met de nieuwe PictureVal!) THIS.PictureVal = lcFileHeaderType + lcFileSize + lcFileHeaderReserved1 + lcFileHeaderReserved2 + ; lcFileHeaderOffsetBits + lcBitMap *!* LET OP!! *!* Twee extra exit-points in deze routine.