Montag, 28. April 2008

Neue englische Hilfedatei für VFP9 SP2 / New English help file for VFP9 SP2

Microsoft hat am 25. April eine neue, ca. 11 MB grosse Version der fehlerbehafteten Hilfedatei online gestellt.

Hier der Download Link:
http://www.microsoft.com/downloads/details.aspx?FamilyId=842ACEC8-F79C-41CD-AB1A-AE4F184387C2&displaylang=en

Um innerhalb von VFP Zugriff auf diese Datei zu erhalten sollte die Datei (dv_foxhelp.chm) umgehend in den VFP9 Installationsordner kopiert werden. Bei einer Standardinstallation handelt es sich um dieses Verzeichnis: C:\Programme\Microsoft Visual FoxPro 9\ Bleibt zu hoffen, dass dies hilft ;-)  

Nachtrag: Offensichtlich kann die o.a. Datei nicht als Ersatz für die im SP2 mitgelieferte Version angesehen werden. Es erscheint empfehlenswert, die SP2-Datei beizubehalten und die neue Datei gezielt dann zu nutzen, wenn es um 'Reporting'-Fragen geht.

Montag, 21. April 2008

Arbeiten mit Verzeichnissen und Dateinamen (Teil 3) / Working with directories and filenames (Part 3)

Die beiden vorangegangenen Teile handelten von den Funktionen GETDIR() und ADDBS() sowie GETFILE(), CHDIR und CURDIR(). In diesem Eintrag geht es nun um die Zerlegung der einzelnen Bereiche eines Dateinamens inklusive vorgelagertem Pfadnamen.

Wenn wir mit Hilfe von GETFILE() eine Datei selektiert und die Auswahl überprüft haben,

cFile = GETFILE()
IF FILE(cFile)
    ...
ENDIF

kommt es immer wieder vor, dass wir nur einen Teil des in 'cFile' stehenden Wertes verarbeiten möchten.

Gehen wir einmal davon aus, dass in cFile der folgende Wert enthalten ist:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
so stellt uns Visual Foxpro nun u.a. sieben Funktionen bereit, diesen String zu zerlegen.
Die Funktion JUSTDRIVE() liefert uns als Ergebnis den Laufwerksbuchstaben:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTDRIVE(cFile)

Die Funktion JUSTPATH() liefert uns als Ergebnis den Laufwerksbuchstaben inklusive des kompletten Pfades, jedoch ohne Backslash am Ende:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTPATH(cFile)

Die Funktion JUSTSTEM() liefert uns als Ergebnis den Dateinamen ohne Suffix:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTSTEM(cFile)

Die Funktion JUSTFNAME() liefert uns als Ergebnis den Dateinamen mitsamt dem Suffix:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTFNAME(cFile)

Die Funktion JUSTEXT() liefert uns als Ergebnis nur das Suffix:

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?JUSTEXT(cFile)

Mit Hilfe dieser Funktionen können wir den Datei- bzw. Verzeichnisnamen in 5 Segemente zerlegen und ggf. durch neue Teile ersetzen. Wollen wir nun bspw. eine Backup-Datei von Demodatei.doc im selben Verzeichnis anlegen, dann greift die Funktion FORCEEXT(). Mit ihrer Hilfe wird aus Demodatei.doc der String Demodatei.bak Hierbei steht es uns frei, den kompletten Verzeichnisnamen oder nur den reinen Dateinamen mitzugeben.

cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?FORCEEXT(cFile,[bak])
?FORCEEXT(JUSTSTEM(cFile),[bak])
?FORCEEXT(JUSTFNAME(cFile),[bak])


Soll die Backup-Datei in einem Unter- oder Parallelordner abgelegt werden, so könnte die Funktion FORCEPATH() zum Zuge kommen.

Für den Unterordner 'Backups':

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Backups\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?FORCEPATH(cFile,ADDBS(JUSTPATH(cFile)) + [Backups])

Im Parallelordner 'Backups':

C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Backups\Demodatei.doc
 
cFile = [C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Temp\Demodatei.doc]
?FORCEPATH(cFile,ADDBS(JUSTPATH(JUSTPATH(cFile))) + [Backups])

Im Verbund mit der Funktion FORCEEXT() ergeben sich daraus nun bspw. die folgenden Funktionen:

LOCAL    lcBackupExt as String, lcBackupPath as String, ;
    cFile as String, cFNew as String, cSubDir as String, cParall as String
       
lcBackupExt     = [bak]
lcBackupPath    = [Backups]
cFile           = GETFILE()
cFNew           = FORCEEXT(JUSTSTEM(cFile),lcBackupExt)
cSubdir         = GetSubdirectory(JUSTPATH(cFile),lcBackupPath,.T.)
cParall         = GetParallelDirectory(JUSTPATH(cFile),lcBackupPath,.T.)

CLEAR

=CreateBackupFile(cFile,cSubDir + cFNew)
=CreateBackupFile(cFile,cParall + cFNew)

FUNCTION CreateBackupFile
LPARAMETERS vSourceFile as String, vTargetFile as String

    LOCAL llReturn as Boolean
   
    ?[kopiere ] + vSourceFile
    ?[nach    ] + vTargetFile
    TRY
        COPY FILE (m.vSourceFile) TO (m.vTargetFile)
        ?[Kopiervorgang erfolgreich durchgeführt]
        llReturn = .T.
    CATCH
        ?[Kopiervorgang ist fehlgeschlagen]
    ENDTRY

    RETURN llReturn
   
ENDFUNC

FUNCTION GetSubdirectory
LPARAMETERS vPath as String, vSubDir as String, vCreate as Boolean

    LOCAL lcPath as String
    m.vPath    = ADDBS(m.vPath)
    lcPath     = FORCEPATH(m.vPath,m.vPath + m.vSubDir)
   
    IF m.vCreate = .T. AND !DIRECTORY(lcPath)
        MKDIR (lcPath)
    ENDIF
   
    RETURN lcPath
   
ENDFUNC

FUNCTION GetParallelDirectory
LPARAMETERS vPath as String, vSubDir as String, vCreate as Boolean

    LOCAL lcPath as String
    lcPath    = ADDBS(ADDBS(JUSTPATH(JUSTPATH(ADDBS(m.vPath)))) + m.vSubDir)

    IF m.vCreate = .T. AND !DIRECTORY(lcPath)
        MKDIR (lcPath)
    ENDIF

    RETURN lcPath
   
ENDFUNC

Mittwoch, 16. April 2008

Undokumentierte Parameterwerte in der Messagebox

Gemäß der FAQs von George Tasker gibt es bei der VFP Messagebox zwei undokumentierte Werte beim zweiten Parameter.

Hierbei handelt es sich um:

#DEFINE MB_SYSTEMMODAL 4096
#DEFINE MB_TASKMODAL 8192

Der Einsatz dieser beiden Werte beeinflußt ausschließlich Modalitätslevel und -bereich des Messagebox-Dialogs.

MB_TASKMODAL (8192) hat üblicherweise einen wenig sichtbaren Effekt auf die Dialogbox. (es handelt sich mehr oder weniger um interne Auswirkungen).

MB_SYSTEMMODAL (4096) hingegen sorgt dafür, daß die Messagebox nicht nur innerhalb der VFP-Applikation im Vordergrund steht, sondern auch vor allen anderen vorgelagerten Fremdapplikationen.

Dienstag, 15. April 2008

Welche Farbe war das noch mal? / What color was that again?

Immer wieder stehe ich vor dem Problem, dass ich nicht mehr weiss, welche Farbtöne ich innerhalb einer visuellen Klasse benutzt habe.

In Expression Web stellt dies bspw. kein Problem dar. Dort ist ein 'Color Picker' integriert. Im Fux ist dem leider nicht so.

Bisher kam deswegen immer das kleine Tool 'Pixie' von Nattyware zum Einsatz. Im UT stolperte ich vor ein paar Tagen dann über ein kleines Tool (MousetrackedColorPicker). Diesem Programm fehlten jedoch zwei Kleinigkeiten, um einen Mehrwert zu Pixie darzustellen. Deshalb habe ich den Code um die entsprechenden Features erweitert und umgestellt.

Punkt 1: Es genügt nicht, nur den Farbwert unter dem Mousecursor angezeigt zu bekommen. Wenn, dann sollte dieser Wert auch in die Zwischenablage kopiert werden können.

Punkt 2: Je nach Bedarf muss der Wert in der Zwischenablage den Integer-Farbwert, den RGB-Wert oder den Hex-Wert darstellen.


Gesteuert wird dies zum Einen über eine kleine Optiongroup direkt hinter den Anzeigewerten. Die Übernahme des selektierten Farbtyps in die Zwischenablage erfolgt über STRG+m.

Wer möchte legt sich den Aufruf des kleines PRGs auf eine F-Taste (Extras\Makros) und sofort steht der kleine ColorPicker jederzeit auf Abruf bereit.

PUBLIC oForm
oForm = CREATEOBJECT([frmcolorpicker])
oForm.Show
READ EVENTS
RELEASE oForm

DEFINE CLASS frmcolorpicker AS form

    Top                     = 0
    Left                    = 0
    Height                  = 150
    Width                   = 235
    ShowWindow              = 2
    DoCreate                = .T.
    BorderStyle             = 0
    Caption                 = [Color Picker]
    BackColor               = RGB(255,255,255)
    posx                    = 0
    posy                    = 0
    pixelcolor              = 0
    rgbcolor                = []
    hexcolor                = []
    errorstatus             = 0
    errortext               = []
    Name                    = [frmcolorpicker]

    ADD OBJECT lblxpos AS label WITH ;
        BackStyle           = 0, ;
        Caption             = [XPos], ;
        Height              = 17, ;
        Left                = 7, ;
        Top                 = 4, ;
        Width               = 40, ;
        Name                = [lblxpos]

    ADD OBJECT lblypos AS label WITH ;
        BackStyle           = 0, ;
        Caption             = [YPos], ;
        Height              = 17, ;
        Left                = 7, ;
        Top                 = 32, ;
        Width               = 40, ;
        Name                = [lblypos]

    ADD OBJECT lblcolor AS label WITH ;
        BackStyle           = 0, ;
        Caption             = [Color], ;
        Height              = 17, ;
        Left                = 7, ;
        Top                 = 60, ;
        Width               = 40, ;
        Name                = [lblColor]

    ADD OBJECT lblrgbcolor AS label WITH ;
        BackStyle           = 0, ;
        Caption             = [RGB], ;
        Height              = 17, ;
        Left                = 7, ;
        Top                 = 88, ;
        Width               = 40, ;
        Name                = [lblrgbcolor]

    ADD OBJECT lblhexcolor AS label WITH ;
        BackStyle           = 0, ;
        Caption             = [Hex], ;
        Height              = 17, ;
        Left                = 7, ;
        Top                 = 116, ;
        Width               = 40, ;
        Name                = [lblhexcolor]

    ADD OBJECT txtxpos AS textbox WITH ;
        FontBold            = .T., ;
        BorderStyle         = 0, ;
        ControlSource       = [Thisform.PosX], ;
        Height              = 23, ;
        Left                = 45, ;
        ReadOnly            = .T., ;
        Top                 = 2, ;
        Width               = 100, ;
        DisabledBackColor   = RGB(255,255,255), ;
        Name                = [txtXpos]

    ADD OBJECT txtypos AS textbox WITH ;
        FontBold            = .T., ;
        BorderStyle         = 0, ;
        ControlSource       = [Thisform.PosY], ;
        Height              = 23, ;
        Left                = 45, ;
        ReadOnly            = .T., ;
        Top                 = 30, ;
        Width               = 100, ;
        DisabledBackColor   = RGB(255,255,255), ;
        Name                = [txtYpos]

    ADD OBJECT txtcolor AS textbox WITH ;
        FontBold            = .T., ;
        BorderStyle         = 0, ;
        ControlSource       = [Thisform.PixelColor], ;
        Height              = 23, ;
        Left                = 45, ;
        ReadOnly            = .T., ;
        Top                 = 58, ;
        Width               = 100, ;
        DisabledBackColor   = RGB(255,255,255), ;
        Name                = [txtColor]

    ADD OBJECT txtrgbcolor AS textbox WITH ;
        FontBold            = .T., ;
        Alignment           = 1, ;
        BorderStyle         = 0, ;
        ControlSource       = [Thisform.RgbColor], ;
        Height              = 23, ;
        Left                = 45, ;
        ReadOnly            = .T., ;
        Top                 = 86, ;
        Width               = 100, ;
        DisabledBackColor   = RGB(255,255,255), ;
        Name                = [txtRgbColor]

    ADD OBJECT txthexcolor AS textbox WITH ;
        FontBold            = .T., ;
        Alignment           = 1, ;
        BorderStyle         = 0, ;
        ControlSource       = [Thisform.HexColor], ;
        Height              = 23, ;
        Left                = 45, ;
        ReadOnly            = .T., ;
        Top                 = 114, ;
        Width               = 100, ;
        DisabledBackColor   = RGB(255,255,255), ;
        Name                = [txtHexColor]

    ADD OBJECT timer1 AS timer WITH ;
        Top                 = 0, ;
        Left                = 0, ;
        Height              = 23, ;
        Width               = 23, ;
        Interval            = 100, ;
        Name                = [Timer1]

    ADD OBJECT colorshower AS container WITH ;
        Top                 = 5, ;
        Left                = 165, ;
        Width               = 65, ;
        Height              = 130, ;
        BorderWidth         = 0, ;
        Name                = [colorshower]

    ADD OBJECT lblinfo AS label WITH ;
        AutoSize            = .T., ;
        FontSize            = 7, ;
        BackStyle           = 0, ;
        Caption             = [STRG+m kopiert markierten Wert in die Zwischenablage], ;
        Height              = 14, ;
        Left                = 0, ;
        Top                 = 138, ;
        Width               = 235, ;
        ForeColor           = RGB(128,128,128), ;
        Name                = [lblInfo]

    ADD OBJECT opgclipselect AS optiongroup WITH ;
        ButtonCount         = 3, ;
        BackStyle           = 0, ;
        BorderStyle         = 0, ;
        Value               = 2, ;
        Height              = 77, ;
        Left                = 149, ;
        Top                 = 56, ;
        Width               = 15, ;
        Name                = [opgClipselect], ;
        Option1.Caption     = [], ;
        Option1.Value       = 0, ;
        Option1.Height      = 17, ;
        Option1.Left        = 0, ;
        Option1.Top         = 5, ;
        Option1.Width       = 15, ;
        Option1.Name        = [Option1], ;
        Option2.Caption     = [], ;
        Option2.Value       = 1, ;
        Option2.Height      = 17, ;
        Option2.Left        = 0, ;
        Option2.Top         = 31, ;
        Option2.Width       = 15, ;
        Option2.Name        = [Option2], ;
        Option3.Caption     = [], ;
        Option3.Height      = 17, ;
        Option3.Left        = 0, ;
        Option3.Top         = 58, ;
        Option3.Width       = 15, ;
        Option3.Name        = [Option3]

    PROCEDURE color2rgb
        LPARAMETERS tnColor
        LOCAL lnRed as Integer, lnGreen as Integer, lnBlue as Integer

        lnRed    = BITRSHIFT(BITAND(tnColor, 0x0000FF),0)
        lnGreen  = BITRSHIFT(BITAND(tnColor, 0x00FF00),8)
        lnBlue   = BITRSHIFT(BITAND(tnColor, 0xFF0000),16)

        RETURN TRANSFORM(lnRed) + [,] + TRANSFORM(lnGreen) + [,] + TRANSFORM(lnBlue)
    ENDPROC

    PROCEDURE timerbasedrefresh
        LOCAL lpPoint as String, liPosX as Integer, liPosY as Integer
        lpPoint = SPACE(8)

        WITH Thisform

            IF GetCursorPos(@lpPoint) # 0

                liPosX                   = ASC(SUBSTR(lpPoint,1)) * 256 ^ 0 + ;
                                         ASC(SUBSTR(lpPoint,2)) * 256 ^ 1 + ;
                                         ASC(SUBSTR(lpPoint,3)) * 256 ^ 2 + ;
                                         ASC(SUBSTR(lpPoint,4)) * 256 ^ 3

                liPosY                   = ASC(SUBSTR(lpPoint,5)) * 256 ^ 0 + ;
                                         ASC(SUBSTR(lpPoint,6)) * 256 ^ 1 + ;
                                         ASC(SUBSTR(lpPoint,7)) * 256 ^ 2 + ;
                                         ASC(SUBSTR(lpPoint,8)) * 256 ^ 3
                .PosX                    = IIF(liPosX > 10000,INT(liPosX) - 4294967295,INT(liPosX))
                .PosY                    = INT(liPosY)
                .PixelColor              = GetPixel(GetWindowDC(0), .posx, .posy)
                .RGBColor                = .Color2RGB(.PixelColor)
                .HexColor                = STUFF(TRANSFORM(.PixelColor,[@0]),3,2,[])
                .ColorShower.BackColor   = .PixelColor
                .Refresh()

            ENDIF

        ENDWITH
    ENDPROC

    PROCEDURE Release
        LPARAMETERS vKey

        WITH Thisform

            IF VARTYPE(m.vKey) = [C] AND m.vKey = [m]

                * Selektierten Wert in die Zwischenablage kopieren
                DO CASE
                CASE .opgClipSelect.Value = 1    && Color
                    _cliptext = ALLTRIM(CAST(.txtColor.Value as c(10)))

                CASE .opgClipSelect.Value = 2    && RGB
                    _cliptext = .txtRgbColor.Value

                CASE .opgClipSelect.Value = 3    && Hex
                    _cliptext = .txtHexColor.Value

                ENDCASE

            ENDIF

        ENDWITH
    ENDPROC

    PROCEDURE Unload
        CLEAR EVENTS
    ENDPROC

    PROCEDURE Init
        TRY

            DECLARE Sleep IN Win32API Integer
            DECLARE Short GetCursorPos IN win32api String @ lpPoint
            DECLARE Integer GetWindowDC IN Win32API Integer HWnd
            DECLARE Integer GetPixel IN win32API Integer hdc, Integer nXPos, Integer nYPos

            ON KEY LABEL CTRL+m _screen.ActiveForm.Release([m])

            BINDEVENT(Thisform.Timer1,[Timer],Thisform,[TimerBasedRefresh])

        CATCH

            TEXT TO lcMsg TEXTMERGE NOSHOW PRETEXT 3
                ColorPicker kann auf Grund fehlender Win32 API
                Unterstützung auf diesem System nicht genutzt werden.
            ENDTEXT

            MESSAGEBOX(lcMsg,0+16+0,[Programminformation])

            This.Release

        ENDTRY
    ENDPROC

ENDDEFINE

Freitag, 4. April 2008

Arbeiten mit Verzeichnissen und Dateinamen (Teil 2) / Working with directories and filenames (Part 2)

Nachdem ich im ersten Teil auf die Befehle GETDIR() und ADDBS() näher eingegangen bin, ist dieses Mal die Auswahl von Dateien angesagt.
Ergänzend möchte ich auf einen älteren Eintrag hinweisen, der die Arbeit mit Namensausdrücken zum Thema hat.
Der Befehl zur Dateiselektion ist sicherlich jedem VFPler hinlänglich bekannt:
cFile = GETFILE()

GETFILE() kann jedoch mit diversen Parametern versorgt werden, die u.a. auch eine genauere Bestimmung der aufgelisteten Dateien beinhaltet.
GETFILE([cFileExtensions] [, cText] [, cOpenButtonCaption] [, nButtonType] [, cTitleBarCaption])

Parameter 1 (der komplexeste der 5) befasst sich mit den auswählbaren Dateitypen. Hierbei ist unbedingt auf die richtige Syntax innerhalb der Stringdefinition zu achten.
Grundsätzlich gilt:
  • Die einzelnen Parameter werden durch Kommata von einander getrennt
  • Parameter 1 wird als String übergeben und steht somit in Anführungszeichen/Hochkommata/eckigen Klammern
  • Innerhalb von Parameter 1 erfolgt die Trennung der einzelnen Auswahlblöcke mit einem Semikolon.
  • Innerhalb der einzelnen Blöcke erfolgt die Trennung von beschreibendem Text und Suffix über einen Doppelpunkt.
  • Innerhalb der Suffixauflistung erfolgt die Trennung der einzelnen Suffixe mit einem Komma.
cFile = GETFILE([Fotos jpg,gif,png,bmp):jpg,gif,png,bmp;] ;
     + [Dokumente(doc,txt,xls,pdf):doc,txt,xls,pdf], ;
       [Dateiname], ;
       [Auswählen], ;
       0, ;
       [Bitte wählen Sie ein Dokument aus])

In obigen Beispiel stellen wir standardmäßig die Fotoauswahl für die Dateitypen JPG, GIF, PNG und BMP bereit. Innerhalb der Combobox 'Dateityp' wird dieser Punkt als Voreinstellung eingeblendet. Innerhalb der Auswahl taucht jedoch auch die Möglichkeit auf, gezielt nach Dokumenten ausschau zu halten (DOC, TXT, XLS, PDF)

Wichtig bei der Funktion GETFILE() ist, dass wir zuvor in das Startverzeichnis unserer Wahl gewechselt haben sollten.
Ein Wechsel erfolgt üblicherweise mit dem Befehl
CD | CHDIR

Damit wir anschliessend wieder in unser ursprüngliches Verzeichnis zurückspringen können sollte der aktuelle Pfad zwischengespeichert werden.
cCurDir = CURDIR()
CHDIR (cDir)
cFile = GETFILE()
....
CHDIR (SYS(5) + cCurDir)
RELEASE cCurDir

An dieser Stelle sei angemerkt, dass es durchaus sinnvoll ist, sofort nach dem Programmstart das Arbeitsverzeichnis der APP/EXE in einer zentral verfügbaren Eigenschaft oder Variablen zu speichern. Dies kann bspw. über eine Anbindung an das _screen-Objekt erfolgen:
_screen.ADDOBJECT([oVerz],[custom])
_screen.oVerz.AddProperty([Startpfad],ADDBS(SYS(5) + SYS(2003)))

Vorteil dieser Vorgehensweise ist, dass wir ein jederzeit verfügbares und erweiterbares Verzeichnisobjekt haben, in dem wir alle möglichen Ordner gezielt hinterlegen und jederzeit abfragen können. Hierdurch verändert sich natürlich auch der zuvor gezeigte Code.
CHDIR (cDir)
cFile = GETFILE()
....
CHDIR (_screen.oVerz.Startpfad)

Neues Projekt in VFPx / New VFPx project

MS Graph war gestern - heute ist VFP Imaging. 

OK, vielleicht ein klein wenig reisserisch, aber wer erst einmal einen Blick auf Cesar Chaloms neuesten BLOG-Eintrag geworfen hat, der wird mir sehr wahrscheinlich zustimmen. Bereits die Alpha-Version dieses neuen VFPx Projektes sieht verdammt vielversprechend aus.

Hier geht's zu Cesar's Blog:
http://weblogs.foxite.com/vfpimaging/archive/2008/04/04/5919.aspx

Mittwoch, 2. April 2008

Aktivieren des Consolas Schriftpakets in VFP / Enabling the Consolas font package in VFP

Innerhalb der IDE von Visual Foxpro ist für alle einstellbaren Bereiche als Standardschrift Courier New voreingestellt.

Als proportionale Schrift sicherlich nicht die schlechteste Wahl für Entwickler. Nachteile ergeben sich immer dann, wenn mit den Zahlen eins und null(1/0) und den Buchstaben l und o (l/O) gearbeitet wird.

Da dieses Thema im Universalthread just wieder durchdiskutiert wurde, bietet es sich geradezu an, hier ebenfalls darauf einzugehen.

Microsoft stellt das Consolas Font Pack für Visual Studio 2005 hier zum Download bereit:

http://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&displaylang=en

Nach erfolgter Installation steht nun die Umstellung auf die neue Schriftart innerhalb der VFP-IDE an. Hierbei sollte die in der u.a. Abbildung gezeigte Reihenfolge beibehalten werden.
 
Hinweis: Der Klick auf [Als Standardeinstellung verwenden] sollte erst dann durchgeführt werden, wenn alle unter (1) verfügbaren IDE-Bereiche auf Consolas umgestellt wurde. D.h. die Schritte 1-4 werden ggf. mehrfach wiederholt und zum Abschluss als Standard gespeichert.