Seite 1 von 1

Fenstergröße

Verfasst: So, 24. Mär 2013 16:53
von MaTel
Ich habe die "ehrenvolle" Aufgabe, ein altes Clipper 5.2 Programm auf WIndows 7 laufen zu lassen... soweit so gut.

Leider ist das Programmfenster ( VIO-Modus ) immer sehr klein ( Bildschim läuft z.B. bei 1280*1024, kann aber noch höher sein!), da xbase vermutlich immer einen Standartzeichensatz für die Ausgabe nimmt.
Nun würde ich aber gern das Programmfenster der jeweiligen eingestellten Auflösung des Bildschirm in Bezug auf Fenstergröße + Zeichensatzgröße anpassen. Ist das im VIO-Modus überhaupt möglich? Wenn nein, geht es denn im XbpCrt-Modus?
Per Tastendruck ( welche auch immer ) soll zwischen 80x25 Zeichen auf 80x50 zeichen umgeschaltet werden können ( das alte Clipperprogramm hat sowas eingebaut ). Ist das mit dem XbpCrt-Modus möglich?

Ich stelle mir das so vor:
Programm ermittelt die Bildschirmauflösung und stellt darauf das Programmfenster und die Zeichensatzgröße in Abhängigkeit dieser Bildschirmauflösung ein.


Falls die Fragen unverständlich sind... ich bin NOCH ein absoluter xbase++ Laie und arbeite mich da gerade ein :(

Re: Fenstergröße

Verfasst: So, 24. Mär 2013 21:04
von UliTs
Hallo MaTel,

ist sicher kein Problem.
Noch besser ist aber -meine ich- der Hybridmodus :-) .

Uli

Re: Fenstergröße

Verfasst: So, 24. Mär 2013 22:13
von AUGE_OHR
MaTel hat geschrieben:Programm ermittelt die Bildschirmauflösung und stellt darauf das Programmfenster und die Zeichensatzgröße in Abhängigkeit dieser Bildschirmauflösung ein.
suche mal nach APPSYS.PRG
mit SetMode(<nMaxRow>, <nMaxCol>) kannst du den Bildschirmmodus "umschalten".

Re: Fenstergröße

Verfasst: Mo, 25. Mär 2013 7:16
von Jan
Es gab hier vor kurzem eine Diskussion im Forum, wie man aus der Bildschirmauflösung die maximale Anzahl Splaten und Zeilen errechnen kann. Knechte doch mal die Foren-Suchfunktion danach. Manfred brauchte das, glaube ich.

Jan

Re: Fenstergröße

Verfasst: Mo, 25. Mär 2013 7:53
von georg
Guten Morgen,


vor einigen Jahren habe ich mich mit dem Problem herumgeschlagen. Ich muss allerdings erst das Programm raussuchen (habe von hier keinen Zugriff auf die Quellen).

Du solltest Dir mal die Funktion SetMode() anschauen. Das zweite Problem war damals (noch zu Zeiten von Windows 2000) war ein nicht-proportionaler Font, der auch entsprechend skalierbar ist. Ich habe damals Lucida Console verwendet. Da Windows überwiegend mit proportionalen Fonts arbeitet, ist die Auswahl von nicht-proportionalen Fonts recht bescheiden.

Je nach Grösse der Schriftart gibt es diese nicht, dann wird die nächst-kleinere, verfügbare Schriftgrösse genommen. Das Programm lief damals auf Monitoren mit 1024*768 Auflösung (wenn ich mich recht erinnere), und Lucida Console war die Schriftart, mit der man am besten (eben auch von der Darstellung her) klarkam.

Code-Beispiele folgen dann heute abend.

Re: Fenstergröße

Verfasst: Mo, 25. Mär 2013 21:13
von georg
Hallo,


einfach mal schnell rüberkopiert:

Code: Alles auswählen

   #define DEF_ROWS       25
   #define DEF_COLS       80

         aSizeDesktop    := AppDesktop():currentSize()
         nFontWide := Int(aSizeDesktop[1] / DEF_COLS * 0.95)
         nFontHigh := Int(aSizeDesktop[2] / DEF_ROWS * 0.95)
         aPos            := { (aSizeDesktop[1]-(DEF_COLS * nFontWide))  /2, ;
            (aSizeDesktop[2]-(DEF_ROWS * nFontHigh))  /2  }

         // Create XbpCRT object
         oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
         oCrt:FontWidth  := nFontWide
         oCrt:FontHeight := nFontHigh
         oCrt:title      := AppName()
         oCrt:titleBar   := TRUE
         oCrt:FontName   := "Lucida Console"
         oCrt:Create()
Wie geschrieben, Lucida Console war damals der Font, der am flexibelsten einsetzbar war.

Re: Fenstergröße

Verfasst: Di, 26. Mär 2013 0:45
von brandelh
Hi,

hier habe ich einen Vortrag zur Migration von der DevCon 2007.
Im letzten Beispiel zeige ich wie man mit einem XbpCRT() Programm (VIO geht nicht) einen Zeichensatz wählen und auch speichern kann.

http://www.xbaseforum.de/viewtopic.php?f=16&t=2294

auf der 4. Seite gibt es auch noch diesen Artikel, aber da wurde das Beispiel im Beitrag zerstört. Die ZIP müsste aber noch funktionieren.

http://www.xbaseforum.de/viewtopic.php?f=16&t=225

Re: Fenstergröße

Verfasst: Di, 26. Mär 2013 2:27
von AUGE_OHR
Jan hat geschrieben:Es gab hier vor kurzem eine Diskussion im Forum, wie man aus der Bildschirmauflösung die maximale Anzahl Splaten und Zeilen errechnen kann.
hier ist der Thread http://www.xbaseforum.de/viewtopic.php?f=30&t=6377

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 7:55
von AUGE_OHR
hi,

welche Fonts kann man im Hybrid Modus "richtig" resizen ? hiess es nicht es würde mit TTF Fonts gehen ?

mit dem Standard "Alaska CRT" hab ich bei 4:3 Auflösungen gute Resultate aber bei 16:9 oder 19:10 passt es im "Vollbild" nicht in der "Breite".
"Terminal" und "Courier New" haben bei "wide Screen" das selbe Problem wie "Alaska Crt".
"Lucida Console" geht da zwar ... ist mir aber "zu dünn".

so und nun eine Frage :

Code: Alles auswählen

oCrt   := XbpCrt() :new(...)
oCrt:SysMenu    := .F.
oCrt:titleBar   := .F.  // no CRT Titlebar
oCrt:Border     := XBPDLG_NO_BORDER
oCrt:setName(nSetName)  // better to Identify
oCrt:create()
oCrt:SetFont( oFont )
warum "knallt" es bei "SetFont" wenn ich diese Fonts verwende
"Times New Roman"
"Arial Black"
"Arial Fett"
"Arial Unicode MS"
"Courier"
"Verdana"
"Helvetica"
"Arial"
"MS Serif"
mit
oError:args :
-> VALTYPE: O CLASS: XbpCrt
-> VALTYPE: O CLASS: XbpFont
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : :setFont
oError:osCode : 0
oError:severity : 2
oError:subCode : 1025
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 8:18
von UliTs
Hallo Jimmy,

warum benutzt Du SetFont unmittelbar nach Create() ?
Ich mache es so:

Code: Alles auswählen

  // XbpCRT-Fenster erzeugen
  oCrt := XbpCrt():New ( NIL, NIL, aPos,25/*nRows*/,80/*nCols*/ )
  oCrt:FontWidth  := nFontWidth
  oCrt:FontHeight := nFontHeight
  oCrt:title      := AppName()
  oCrt:FontName   := "COURIER NEW"+nationMsg(NAT_MSG_FNT_STYLE_BOLD)  // "Alaska Crt"
  oCrt:Create()
  oCrt:PresSpace()            // Presentation Space initialisieren
  SetAppWindow( oCrt )        // XbpCrt wird aktives Fenster und Ausgabegerät

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 9:23
von brandelh
AUGE_OHR hat geschrieben: so und nun eine Frage :
warum "knallt" es bei "SetFont" wenn ich diese Fonts verwende
"Times New Roman"
"Arial Black"
"Arial Fett"
"Arial Unicode MS"
"Courier"
"Verdana"
"Helvetica"
"Arial"
das steht in der Dokumentation von 1.90.355 zu XbpCrt():SetFont() ;-)
Hinweis: Der in <oXbpFont> angegebene Zeichensatz muß eine Nicht-Proportional-Schrift, d.h. ein Zeichensatz mit fester Breite, sein, andernfalls wird ein Laufzeitfehler ausgelöst.

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 10:23
von UliTs
Courier ist allerdings ein Zeichensatz mit fester Zeichenbreite.
Uli

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 10:37
von AUGE_OHR
UliTs hat geschrieben:warum benutzt Du SetFont unmittelbar nach Create() ?
schon klar aber es geht hier um CRT "Vollbild" d.h. mit dem oCrt:resize Slot wo man dann oCrt:SetFont(oFont) verwenden muss.

p.s. es handelt sich um dass was Till uns auf dem JHV gezeigt hat

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 10:41
von AUGE_OHR
UliTs hat geschrieben:Courier ist allerdings ein Zeichensatz mit fester Zeichenbreite.
wenn ich das richtig verstehe "sollten" es die mit oFont:vector = .F. sein ?

wie Ulli sagte zeigt mir c:\ALASKA\XPPW32\Source\samples\basics\FONT\fontdb.prg für

Code: Alles auswählen

"Courier" 
"MS Serif"
"MS Sans Serif"
ebenfalls .F. an ... aber damit "knallt" es :banghead:

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 10:44
von brandelh
Ist Courier ein TrueType Font ? Ich meine nur Courier New ...

Ich nutze dieses Programm um einen schönen Font zu finden:

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 11:49
von AUGE_OHR
hi,

sehr schön mit der INI Datei :thumbright:

ich habe mir aus dem FONTDB Sample etwas ähnliches gebaut aber wir beide arbeiten auf das oCRT mit oCrt:configure() statt wie Till mit oCrt:SetFont(oFont)

Frage : was war bei Cl*pper die möglichen "Auflösungen" ?

25 x 80
50 x 80
43 x 80
50 x 132
50 x 144 (?)

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 12:21
von UliTs
brandelh hat geschrieben:Ist Courier ein TrueType Font ? Ich meine nur Courier New ...
Courier ist kein TrueType Font. Es funktioniert aber trotzdem. Man ist nur in der Wahl der Schriftgröße eingeschränkt.

Uli

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 15:51
von brandelh
AUGE_OHR hat geschrieben:sehr schön mit der INI Datei :thumbright:
Diese INI Lösung ist sehr alt und unflexibel, wer als eine INI Dateiverwaltung sucht, findet in der Wissensbasis bessere ;-)
Das Programm ermöglicht nur die Suche nach dem passenden Font für CRT, ich habe damals einige für uns freigeschaltet die gut ausgesehen haben.
Insbesondere bei den LINIEN Symbolen, aber auch z.B. bei § muss man aber immer mit Abstrichen rechnen.

Hier eine modernere Version im Anwendungsprogramm, das die Funktion beim Programmstart mit .f. aufruft,

Code: Alles auswählen

ChangeFont( .f. )             // ohne Nachzufragen letzte Einstellung starten.
ansonsten im Menü "Schriftart wählen" die möglichen Schriftarten durchschaltet, je nach Anwender will der mehr oder weniger Kontrolle.

Code: Alles auswählen

      case hpmen=NR_DIENST
         do case
           case submen=1
                ChangeFont()                // Bildschirmschriten umstellen

Code: Alles auswählen

*------------------------------------------------------------------------
procedure ChangeFont( lZeigAuswahlFenster )
  local oCrt := SetAppWindow()
  local aSizeDesktop    := AppDesktop():currentSize()
  local nDesktopBreite  := aSizeDesktop[1]
  local nDesktopHoehe   := aSizeDesktop[2]
  local nBreite, nHoehe
  local aFontList     := {  { "Alaska Crt"    , 16, 8 } ,;
                            { "8514oem"       , 20,10 } ,;
                            { "Terminal"      , 18,10 } ,;
                            { "IBM3270"       , 29,13 } ,;
                            { "IBM3270"       , 29,14 } ,;
                            { "IBM3270"       , 35,14 } ,;
                            { "IBM3270"       , 36,15 } ,;
                            { "IBM3270"       , 38,15 } ,;
                            { "Lucida Console", 28,13 } ,;
                            { "Lucida Console", 29,13 } ,;
                            { "Lucida Console", 30,14 } ,;
                            { "Lucida Console", 32,14 } ,;
                            { "Lucida Console", 35,14 } ,;
                            { "Lucida Console", 36,14 }     }

  static nAktivFont   := 1                       // Alaska CRT
  local nMaxFontNr    := len(aFontList)
  local cWahl
  local cFileName     := UserInI("INI")          // INI-Dateinamen DES Users ermitteln
  local cSection      := "Benutzervorgaben"
  local cVar          := "Bildschirmschriftart"

  DEFAULT lZeigAuswahlFenster TO .t.

  if lZeigAuswahlFenster

     do while .t.
        cWahl := ask(12,"Schrift: "+aFontList[nAktivFont,1]+;
                " ["+ntrim(aFontList[nAktivFont,2])+"-"+ntrim(aFontList[nAktivFont,3])+"]"+;
                        " wechseln ? <L>etzte, <N>„chste, <E>nde","<" )
        do case
           case cWahl = "E"
                exit
           case cWahl = "N"
                nAktivFont++
           case cWahl = "L"
                nAktivFont--
        end case
        * hier muá die Schriftart ge„ndert werden

        if nAktivFont > nMaxFontNr // šber und
           nAktivFont := 1
        endif
        if nAktivFont < 1          // Unterl„ufe ausgleichen
           nAktivFont := nMaxFontNr
        endif

        oCrt:FontName   := aFontList[nAktivFont,1]
        oCrt:FontHeight := aFontList[nAktivFont,2]
        oCrt:FontWidth  := aFontList[nAktivFont,3]
        oCrt:configure()
        nBreite := oCrt:currentSize()[1]
        nHoehe  := oCrt:currentSize()[2]
        oCrt:setPos( { (nDesktopBreite-nBreite)/2 , (nDesktopHoehe-nHoehe)/2 } )
     enddo

     if ! SetIni(cSection, cVar, nAktivFont , cFileName)
        meldung(12,"F",{ cSection + " - " + cVar,;
                         "konnten nicht in INI-Datei geschrieben werden:",;
                          cFileName } )
     endif

  else

     nAktivFont := val( GetIni(cSection, cVar, "1", cFileName) )

     if nAktivFont < 1 .or. nAktivFont > nMaxFontNr  // m”gliche Fehler ausgleichen
        nAktivFont := 1
     endif
     if nAktivFont > 1       // 1 ist ja Standard !
        oCrt:FontName   := aFontList[nAktivFont,1]
        oCrt:FontHeight := aFontList[nAktivFont,2]
        oCrt:FontWidth  := aFontList[nAktivFont,3]
        oCrt:configure()
        nBreite := oCrt:currentSize()[1]
        nHoehe  := oCrt:currentSize()[2]
        oCrt:setPos( { (nDesktopBreite-nBreite)/2 , (nDesktopHoehe-nHoehe)/2 } )
     endif
  endif
return
Mein Bestreben war aber nie einen ganzen Monitor zu füllen, sondern nur ein lesbares Bild zu bekommen.
Daher fehlt die das Fenster vergrößern würde.

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 16:27
von AUGE_OHR
UliTs hat geschrieben:Courier ist kein TrueType Font. Es funktioniert aber trotzdem. Man ist nur in der Wahl der Schriftgröße eingeschränkt.
und wie sehen deine BOX Zeichen aus ?
um die zu bekommen muss man oFont:Codepage := 255 setzten und dann funktioniert oCrt:SetFont nicht mehr :(

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 19:12
von brandelh
Hi,

ich hatte früher die doppelten Ränder außen, die sich mit einfach gekreuzt haben, die Kreuzungen fehlen komplett.
Daher habe ich bei den XbpCRT Programmen auf einfache Linien umgestellt und z.B. "Lucida Console" zeigt es schön an:
CrtAnwendung.png
CrtAnwendung.png (140.24 KiB) 20319 mal betrachtet

Re: Fenstergröße

Verfasst: Mi, 10. Apr 2013 19:35
von AUGE_OHR
so langsam denke ich das oCRT:SetFont() noch nicht ganz richtig arbeitet ...
hier der Code

Code: Alles auswählen

oFont := oCrt:Setfont()
IF NIL <> oFont
   IF oFont:isDerivedFrom( XbpFont() )
      IF oFont:status() == XBP_STAT_CREATE
          // hier wäre erst OK 
      ELSE
         Msgbox("Error CREATE")
      ENDIF
   ELSE
      Msgbox("Error FONT")
   ENDIF
ELSE
   Msgbox("FONT = NIL")
ENDIF
oCrt:SetFont( oFont )
und hier Fehlermeldung
oError:args :
-> VALTYPE: O CLASS: XbpCrt
-> VALTYPE: O CLASS: XbpFont
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : :setFont
oError:osCode : 0
oError:severity : 2
oError:subCode : 1025
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
klar hat er vorher "Error CREATE" geschrienen ... aber ich habe vorher mit

Code: Alles auswählen

oCrt  := oDlg:drawingArea:ChildList()[1]
oFontDlg            := XbpFontDialog():New()
oFontDlg:fixedOnly  := .T.
oFontDlg:create()
oFont := oFontDlg:display()
IF NIL <> oFont
   oCrt:SetFont(oFont)
ENDIF
bestückt und einen "sichtbaren" Nachweis das sich der Font verändert während bei

Code: Alles auswählen

oCrt:FontName   := oFont:familyName
oCrt:FontHeight := oFont:height
oCrt:FontWidth  := oFont:width
oCrt:configure()
es "so" nicht "wirkte" ... hm :-k

ok, wenn es in der "Liste der Änderungen" unter "Neu" steht und in "Blau" im Helpfile dann ist es eben noch nicht sehr erprobt ( was User damit anstellen ... ) :-"

Re: Fenstergröße

Verfasst: Do, 11. Apr 2013 9:35
von UliTs
AUGE_OHR hat geschrieben:
UliTs hat geschrieben:Courier ist kein TrueType Font. Es funktioniert aber trotzdem. Man ist nur in der Wahl der Schriftgröße eingeschränkt.
und wie sehen deine BOX Zeichen aus ?
um die zu bekommen muss man oFont:Codepage := 255 setzten und dann funktioniert oCrt:SetFont nicht mehr :(
Ich habe die Codepage nicht verändert. Einzellinien und Doppellinien funktionieren. Allerdings "Kreuzungen" und "Dreiecke" zwischen Einzel- und Doppellinien nicht.

Uli

Re: Fenstergröße

Verfasst: Sa, 13. Apr 2013 6:50
von AUGE_OHR
im Prinzip ist es eigentlich egal ob die BOX Symbole "stimmen" oder nicht.
es scheint aber so das nicht alle "machbaren" Fonts auch "richtige" Ergebnisse liefern.

bislang hab ich CRT Fenster nur auf maximale Grösse gebracht ohne "resize"
wie bei Hubert muss man dann einen Kompromiss aus Font Grösse und Row/Col machen.

nun hat uns Till ja Beispiel zum Thema CRT "resize" gezeigt wobei er eine Class geschrieben hat.

Code: Alles auswählen

FUNCTION CreateSizeableCrt( oParent, nRows, nCols, cTitle, xBGColor )

   // Create a dialog that hosts the console window.
   // The dialog serves as a background for the
   // console
   oDlg := XbpDialog():New( oParent )
   ...
   oDlg:Create()
   // Create console window without frame and title
   // bar.
   oCrt := XbpMainCrt():New ( oDlg:DrawingArea,,, nRows, nCols )
   ...
   oCrt:Create()
   ...
RETURN oCrt
also genau das was ich als "Shell" für ein CRT Fenster vorgeschlagen habe.

die "Shell" ist ja schon fertig und mit "Lucida Console" funktioniert es ... aber welcher Font noch ?
wenn man meint "Alaska CRT" ist doch vorhanden dann probiert es mal mit verschiedenen "Auflösungen"
hierbei ist sowohl AppDeskTop:CurrentSize() als auch ROW / COL gemeint.

"Alaska CRT" scheint bei allen 4:3 "Auflösungen" zu funktionieren aber bei "wide-Screen" und "Vollbild"
stimmt ja dann die "Umrechnung" nicht wie bei "Lucida Console" d.h. statt 50 x 132 sind es dann 50 x 144

***

was nun oCrt:SetFont( oFont ), was ich vorher nie gesehen haben, angeht sieht es so aus das bei einem
"eingebetteten" CRT eine Änderrung per oCRT:Configure() nicht gleich zu einem "optischen" Resultat führt (refresh).
man muss ja auch die "Shell" entsprechend "umrechnen" und ggf. ändern wenn es nicht mehr auf den Bildschirm "passt"

***

was nun XbpFontDialog() -> oFont angeht ist ja oFont:fixedOnly := .T. MUSS für ein CRT Fenster,
aber damit wird auch "Courier" ohne "New" angezeigt was mit oCrt:SetFont( oFont ) abstürzt während
"Courier New" ohne Probleme funktioniert.

sieht man sich den Code von Till an so findet man oFont:Codepage := 255 was für OEM steht.
ich "denke" Alaska lässt bei oCrt:SetFont( oFont ) auch nun diese Fonts zu welche eine OEM Codepage haben.
man müsste also eine eigene Class machen und das für CRT Fenster weiter "abfangen"

Code: Alles auswählen

CLASS MyCrtFontDialog() FROM XbpFontDialog()
   EXPORTED:
      METHOD display()
ENDCLASS

METHOD MyFontDlg:display()
LOCAL oFont := NIL
LOCAL nButton

   DO WHILE .T.
      oFont := ::XbpFontDialog:display()
      IF NIL <> oFont
         IF oFont:fixed    = .T.  .AND. ;  // CRT-Fenster needs FIXEDFONT
            oFont:Codepage = 255         // OEM ... hm
            EXIT
         ELSE
            nButton := ConfirmBox( , ;
                    "wrong Font "+oFont:FamilyName+" for Hybrid Mode. try again ?" ,;
                    "Error Font", ;
                    XBPMB_YESNO , ;
                    XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE,;
                    XBPMB_DEFBUTTON1)

            IF nButton = XBPMB_RET_YES
            ELSE
               oFont := NIL
               EXIT
            ENDIF
         ENDIF
      ELSE
         EXIT
      ENDIF
   ENDDO

RETURN oFont
aber dann bleiben nicht mehr viele Fonts übrig ...