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:

BOM für €

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



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 21.03.2015, 15:04    Titel: BOM für € Antworten mit Zitat

Hallo Leute,

meine Frage gehört warscheinlich eher zur Abteilung Windows-fragen. Aber ich denke Fragen zu Byte Order Mark passen auch ganz gut zu FB.

Und zwar versuche ich das € Symbol auf meinem Drucker zu bekommen. Natürlich benutze ich Win APIs. Und zum anzeigen TextOut(). Ich habe jetzt schon alles mögliche versucht, aber leider erscheint auf meinem Ausdruck immer nur ein ? oder so eine Art C mit einem Kringel unten dran.

Probiert habe ich es mit 'Times New Roman' und 'Arial'
Da ich zum erstenmal WStrings benutze hab ich in der Referenz was von BOM gelesen und mal Wiki und Google angestrengt.

Kann mir jemand sagen wie ich ein BOM setze? Muss ich mein WString um 2 Symbole vergrößern, die 2 Indexnummern bzw. Bytes für das entsprechende BOM an den Anfang des Strings setzen und dann den gewünschten Text (in dem Fall halt das € zeichen oder den Index 8364(&h20AC)) an die 3 Stelle bzw 2.Indexstelle des WStrings setzen?

Bisher hab ich das:
Code:

...
#UNDEF TextOut
declare function TextOut alias "TextOutW" (byval as HDC, byval as integer, byval as integer, byval as LPCWSTR, byval as integer) as BOOL

...

Dim As wstring ptr  wtext
wtext = Callocate( ( Len(text)+1 )*2 )
*wtext = text

Dim As byte  byt

For ws As Integer = 0 To Len(*wtext)-1
  byt = wtext[ws]       ' Zeigt den wert 8364 was ja eigentlich das € ist
Next ws

TextOut(Printer.hDC,  x  ,  -y  ,  *wtext  ,  cntchars  )

DEALLOCATE wtext
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.03.2015, 15:15    Titel: Antworten mit Zitat

TextOut behandelt keine BOMs. Entweder man übergibt einen ANSI-String an TextOutA, oder einen Unicode-String an TextOutW. Alles andere ist nicht möglich.
Dein Code sieht allerdings so oder so suspekt aus. Wozu das ganze rum-allocaten?
Versuch es doch einfach mal ganz simpel.
Code:

#include "windows.bi"
...
Dim as wstring text = !"Eurozeichen \&H20AC"
TextOutW(Printer.hDC,  x  ,  -y  ,  strptr(text),  len(text))

_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 21.03.2015, 15:55    Titel: Antworten mit Zitat

Hi Jojo, danke für die schnelle Antwort. Naja laut Ref. kann ich nicht erkennen das ich ein WString ohne Größenangabe befüllen kann.
Code:
Dim As WString  wtext = !"Eurozeichen \&H20AC"

ergibt folgendes: error 28: Expected pointer, found 'wtext' in 'Dim As wstring wtext = !"Eurozeichen \&H20AC"'

Da ich #DEFINE UNICODE vermeiden wollte lädt die Windows.bi die TextOutA als TextOut. Deshalb hab folgendes benutzt:
Code:
#UNDEF TextOut
declare function TextOut alias "TextOutW" (byval as HDC, byval as integer, byval as integer, byval as LPCWSTR, byval as integer) as BOOL


Deine Variante (TextOut(hdc,x,y, StrPtr(wtext) , LEN(wtext) ) benutzte ich anfangs auch. Aber StrPtr scheint nicht mit WSTRINGs zu arbeiten:
error 24: Invalid data types, found ')' in 'TextOut(Printer.hDC, x , -y , StrPtr(wtext) , len(wtext) )'
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.03.2015, 16:19    Titel: Antworten mit Zitat

Okay, dann ist das mit WSTRING eine FB-Limitierung. Da ich FB schon seit 6 Jahren nicht mehr angerührt habe, war mir das nicht bewusst. Hässlich...

Zitat:
Da ich #DEFINE UNICODE vermeiden wollte

Warum? UNICODE sollte eigentlich schon seit Jahren der Standard sein. Intern muss Windows so oder so alle ANSI-Strings in Unicode konvertieren.
So oder so sollte die windows.bi alle drei Symbole (TextOut, TextOutA und TextOutW) bereitstellen, sonst ist das unvollständig. Kann aber natürlich sein, dass die FreeBASIC-Header hier im Vergleich zu den Original-C-Headern unvollständig sind.

Zitat:
Aber StrPtr scheint nicht mit WSTRINGs zu arbeiten:

Naja, das hängt dann wieder damit zusammen, dass WSTRING nicht wie STRING funktioniert; Wenn du eh einen WSTRING PTR brauchst, hast du ja sowieso schon den Pointer auf den String-Inhalt.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 107

BeitragVerfasst am: 21.03.2015, 19:25    Titel: Antworten mit Zitat

Das Ansi-Eurozeichen ist: CHR(128)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.03.2015, 23:54    Titel: Antworten mit Zitat

...vorausgesetzt, dass du die Westeuropäische Codepage verwendest. (und genau deswegen ist ANSI doof)
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 27.03.2015, 08:42    Titel: Antworten mit Zitat

Also danke für eure Antworten.

Ich hab Jojos Rat befolgt und benutze DEFINE UNICODE und hab alle meine Funktionen und Bibliotheken angepasst. Nun hat auch alles funktioniert... bis ich gestern meine Compileroption umgestellt habe. Die Profis unter euch wissen es bestimmt aber mir war das neu.
Es macht schon ein Unterschied ob -exx oder -s gui eingestellt ist. Frage: gibt es hier eine abfrage möglichkeit wie zB '#IFDEF exx' oder so?


Noch eine Frage zu Win API. Ins besondere zum Druckerdialog. Ich habe mich da für die Funktion und Struktur 'PrintDlg' entschieden. Erst habe die Funktion immer ohne ein Handle des aufrufenden Programms aufgerufen was dazu führte das das Dialogfeld im Hintergrund aufpopte. Jetzt gebe ich den Handle mit und das Dialogfeld hat ein ganz anderes Design. Mir hat allerdings das erste besser gefallen hat da jemand eine Idee. Ein Flag wie bei SHBrowseForFolder (BIF_USENEWUI) scheint es ja hier leider nicht zu geben.

P.S. Wenn es niemanden stört würde ich den Titel des Threads ändern, denn mit BOM hat es nun doch nichts zu tun durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.03.2015, 09:36    Titel: Antworten mit Zitat

braesident hat Folgendes geschrieben:

Es macht schon ein Unterschied ob -exx oder -s gui eingestellt ist. Frage: gibt es hier eine abfrage möglichkeit wie zB '#IFDEF exx' oder so?

-exx sollte absolut keinen Unterschied machen. Welchen Unterschied bemerkst du denn?
GUI könnte einen Unterschied wegen des Fensterhandles machen.

braesident hat Folgendes geschrieben:

Jetzt gebe ich den Handle mit und das Dialogfeld hat ein ganz anderes Design.

Könnte auch daran liegen, dass du die Common Controls nicht initialisierst. Versuch mal, direkt zu Beginn des Programms InitCommonControlsEx aufzurufen. Ist allerdings nur ne Vermutung und es wäre vielleicht hilfreich, sich die komplette Dokumentation zu dem Druckerkram in der MSDN durchzulesen (was ich aber nicht für dich tun werde).
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 27.03.2015, 09:44    Titel: Antworten mit Zitat

Die Optionen -exx und -s gui haben zwar natürlich Auswirkungen, einen Zusammenhang mit deinem Einsatzgebiet sehe ich jedoch nicht (zumindest auf den ersten Blick). Das hinzufügen/entfernen von -exx könnte irgendwelche falschen Speicherzugriffe zutage bringen. Die Option -s gui sollte keinerlei Auswirkung haben.

Bezüglichlich Layout fallen mir auf die Schnelle folgende mögliche Versuche ein:
1. Aufrufen von InitCommonControls bzw. InitCommonControlsEx und/oder
2. Hinzufügen eines entsprechenden Manifests in den Resourcen siehe https://msdn.microsoft.com/en-us/library/windows/desktop/bb773175.aspx
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 27.03.2015, 11:37    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
-exx sollte absolut keinen Unterschied machen. Welchen Unterschied bemerkst du denn?

Kann natürlich sein das Freetype2 da mit einwirkt.
Also wie schon erwähnt steht als erste Zeile im Code #DEFINE UNICODE
dann benutze ich Screenres 900, 560, 32
Wie gesagt hab die ganze Zeit mit -exx Kombiliert und Ascii2Ansi(MONTHNAME(MONTH(schluessel))) zeigte mir für März auch ein 'ä' an. Nach dem Kombilieren mit -s gui wurde aus dem ä ein Viereck. Dafür geht es jetzt ohne die Ascii2Ansi Funktion.

Zu dem ganzen Druckerkram lese ich mich nun schon seit einigen Wochen durch die MSDN Seiten und auch anderen Seiten. Das würde ich auch von niemandem verlangen, dies für mich zu tun. InitCommonControlsEx hat ich auch schon vor Augen. Hab mich nur noch nicht weiter mit beschäftigt. War wohl noch nicht interessant als ich drauf stieß.

@St_W
deinen Link werde ich mir auch gleich genauer ansehen

erstmal wieder vielen Dank euch.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 27.03.2015, 17:12    Titel: Antworten mit Zitat

Zitat:
gibt es hier eine abfrage möglichkeit wie zB '#IFDEF exx' oder so?

siehe dazu http://www.freebasic-portal.de/befehlsreferenz/fb-err-504.html
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische 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