Umsetzung einer Fonteinstellung von Clipper zu XBase

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück
Danksagung erhalten: 1 Mal

Umsetzung einer Fonteinstellung von Clipper zu XBase

Beitrag von uwe.24 »

Hallo.

Ich versuche nun schon länger Zeit einige alte Programme in die XBase++ Welt zu bekommen. Mit vielen Erfolgen. :D
Darunter hab ich auch einige Druckroutinen. Manches dabei hab ich auch schon mit Hilfe der HBPrinter Klasse gut geschafft. =D>

Jetzt möchte ich einen Ausdruck einer Betriebsanweisung mit möglichst gut lesbaren, großen Buchstaben umstellen.
Früher hab ich das mit PCL Sequencen unter DOS auf LPT1 Druckern gemacht.
Für das Beispiel z.B. Esc (s10H für 10 cpi Schriftbreite und Esc (s24V für 24cpi Schrifthöhe als Großschrift.

Das sah dann so aus:
Bild1.jpg
Bild1.jpg (21.97 KiB) 10114 mal betrachtet
Das ist eine DINA4 Breite mit 80 Zeichen auf insgesamt 40 Zeilen.

Ich muss also 80 Zeichen in 40 Zeilen mit nicht proportionalen Zeichen mögichst formatfüllend auf DIN A 4 darstellen.

Jetzt möchte ich das entweder mit dem HBPrinter oder über Express++ lösen.
Hab schon einiges mit veschiedenen Fonts und :height bei den xbpfont() Einstellung probiert, aber keinen Erfolg gehabt.

Kann mir da bitte jemand Hilfestellung geben?

Uwe aus OS
Uwe aus OS
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Umsetzung einer Fonteinstellung von Clipper zu XBase

Beitrag von brandelh »

Schau dir mal die HBPrinter:SAY() Methode an, mit der kannst du genau positionieren wie früher unter Clipper (1,1 = linkes oberes Zeichen).
80 Zeichen auf 40 Linien, also brauchst du Querformat.
Als Zeichensatz empfiehlt sich z.B. Courier New, aber auch andere können das.
Ein Font Objekt kann ja Breite und Höhe vorgeben statt der Point Größe, da musst du experimentieren (am Besten mit Word die verschiedenen Größen prüfen, vielleicht passt ja eine).
Gruß
Hubert
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück
Danksagung erhalten: 1 Mal

Re: Umsetzung einer Fonteinstellung von Clipper zu XBase

Beitrag von uwe.24 »

Hallo Hubert.

Danke für die Antwort.

Das mit HBPrinter:SAY() ist schon klar und damit arbeite ich auch.

Ich brauche aber eigentlicht doppelt hohe Zeichen.
Ein Zeichen ist bis jetzt etwa 6mm hoch und 2,5 mm breit

Damit kommnt man dann bei DINA4 hochkant auf 80 Zeichen x 40 Zeilen (+- mit Rand).

Die 'unnormale' Zeichenhöhe ist mein Problem.

Uwe aus OS
Uwe aus OS
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Umsetzung einer Fonteinstellung von Clipper zu XBase

Beitrag von brandelh »

Du kannst einen Font komplett selbst zusammenstellen (also FontFamilie, Höhe und Breite):

Code: Alles auswählen

oFont  := xbpFont():new()       
oFont:familyName  := "Courier New"
oFont:fixed := .t.
oFont:height  := ?  // je nach Einstellung z.B. 1/10mm # POINTs
oFont:width   := ?  // je nach Einstellung z.B. 1/10mm # POINTs
oFont:create()   
Du kannst z.B. erst einen normalen "10.Courier New" erstellen, dann :height und :widht ermitteln und danach einen mit doppelter Höhe ;-)
Nicht alle Kombinationen werden exakt umgesetzt, es kann auch eine 'ähnliche' Schrift gewählt werden, einfach probieren.
Bei Courier New, Arial (warum nicht, solange alle Spalten einzeln geschrieben werden) etc. sollten die Ergebnisse auf anderen Rechnern gleich bzw. ähnlich sein.
Gruß
Hubert
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück
Danksagung erhalten: 1 Mal

Re: Umsetzung einer Fonteinstellung von Clipper zu XBase

Beitrag von uwe.24 »

Hallo Hubert,

kannst du mir da nochmal auf die Sprünge helfen?

Mein Code in einem Testprogramm sieht an der Stelle so aus:

Code: Alles auswählen

begin sequence
		oDlg := XbpPrintDialog():new()

		oDlg:enablePrintToFile := .f.
		oDlg:printToFile       := .f.
		oDlg:create()

		nZeileMax = nZeile
	  	oXbpPrinter := oDlg:display()
	  	oDlg:destroy()
	  	oHBPrinter := HBPrinter():New(oXbpPrinter):create()

		oHBPrinter:addFont({"Courier New",14,.t.,.f.})

		oHBPrinter:SetFont(1)
		oHBPrinter:StartDoc()

Wo und wie muss ich jetzt die Schriftart auf eine größere Höhe anpassen?

Dank im voraus.

Uwe aus OS
Uwe aus OS
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Umsetzung einer Fonteinstellung von Clipper zu XBase

Beitrag von brandelh »

Hi,

zunächst solltest du hier prüfen ob der XbpPrinterDialog() eventuell NIL zurückgegeben hat.
Das wird zwar keinen Fehler geben, da HbPrinter dann den Standarddrucker nutzt, aber der Anwender wollte eigentlich den Druck abbrechen:

Code: Alles auswählen

   oXbpPrinter := oDlg:display()
   oDlg:destroy()
   if ! empty(oXbpPrinter) // oder # NIL etc.
        oHBPrinter := HBPrinter():New(oXbpPrinter):create()
mit dieser Anweisung legst du die Schriftart und Standard-Punktgröße fest (hier 14, bold, normal also nicht kursiv):

Code: Alles auswählen

 oHBPrinter:addFont({"Courier New",14,.t.,.f.})
wenn du etwas anderes als den Standard willst, musst du ein Fontobjekt mit XbpFont() erstellen, dort kannst du dann die Höhe und Breite frei festlegen, ob es genauso erstellt wird, ist nicht garantiert.
Dieses so erzeugte Font Objekt kannst du dann auch :addFont() übergeben.

Code: Alles auswählen

 
so sieht die Methode aus ...
*-------------------------------------------------------------
METHOD _HBPrinter:AddFont(uFont)
   local oFont := NIL
   do case
      case valtype(uFont) = "C"
           oFont := XbpFont():new(::oPS):create(uFont)
      case valtype(uFont) = "O"
           oFont := uFont
      case valtype(uFont) = "A"
           do while len(uFont) < 4
              aadd(uFont, NIL )
           enddo
           oFont := FontWahl( uFont[1],  uFont[2], uFont[3],uFont[4], ::oPS )
                 // FontWahl( cFontName, nFontHoehe, lBold, lItalic)
   end case
   aadd(::aFontList,oFont)
return self

... so kannst du einen eigenen Font anpassen und verwenden

oFont := XbpFont():new(oHBPrinter:oPS)  // Font-Objekt für diesen Drucker erstellen
oFont:familyName := "Courier New"
oFont:bold := .t.
oFont:fixed := .t. // sicher ist sicher, eventuell unnötig bei Courier New
oFont:height := 60 // 6mm bei meiner HBPrinter Vorgabe GRA_PU_LOMETRIC
// wenn du nicht die Standardbreite willst, kannst du dies so vorgeben, die Schrift könnte aber "gestaucht" wirken !
oFont:width  := 40 // 4mm bei meiner HBPrinter Vorgabe GRA_PU_LOMETRIC
// so wird die Standardbreite zur obigen Höhe verwendet, was meist schöner aussieht.
oFont:width  := 0
oFont:create()

oHBPrinter:addFont(oFont)
wie gesagt, damit muss man experimentieren um zu sehen wie es aussieht.
Das gute daran ist, dass ein Standardfont wie Courier New oder Arial oder Times auf allen Windowsrechnern gleich aussieht (oder zumindest aussehen sollte ;-) )
Gruß
Hubert
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück
Danksagung erhalten: 1 Mal

Re: Umsetzung einer Fonteinstellung von Clipper zu XBase

Beitrag von uwe.24 »

Hallo Hubert.

Suuuuuper. =D>

Jetzt hab ich es geschafft.
Kaum weiß man wie es geht, schon klappt es :D

Vielen Dank.

Uwe aus OS
Uwe aus OS
Antworten