xbpStatic ANSI/OEM Konvertierung verhindern?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Hallo Zusammen,
gibt es eine Möglichkeit die implizite OEM/ANSI Konvertierung bei xbpStatic:setCaption(xxx) zu umgehen?
Der Grund ist, dass wir eine Anwendung mit OEM-Zeichensatz (Set Charset To OEM) nutzen, ich möchte
jetzt aber in einem xbpStatic ein Sonderzeichen anzeigen, dass nicht im OEM-Zeichensatz enthalten ist.
Leider verhindert die implizite Konvertierung dies. (Es gibt halt kein passendes OEM-Zeichen dafür)
Die Anwendung auf ANSI umstellen ist keine Option. Eine Umstellung für diese Ausgabe geht leider nicht,
da die GUI immer den Zeichensatz des Hauptthreads nutzt.
Also kann man die implizite Konvertierung eventuell kurzfristig deaktivieren, oder gibt es eventuell ein
Möglichkeit den Inhalt direkt (via DLL-Call o.ä.) zu setzen?
Für eine Idee wäre ich dankbar. Gruß Matthias
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

hi,

du kannst bei jedem XbPart die Presentation Parameter setzten welches einen Font enthalten kann.

Code: Alles auswählen

LOCAL aPP := {}
   AADD(aPP,{XBP_PP_COMPOUNDNAME,"12.ArialTTF"})
   oStatic := XbpStatic():new( oParent,, aPos,aSize,aPP}  ) 
p.s. alles was das Static als Parent nutzt hätte dann auch "den" Font !
gruss by OHR
Jimmy
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Hi,
danke für die schnelle Antwort. Der Font selber ist leider nicht das Problem (In meinem Problem geht es um "Windings"). Ich möchte das ANSI-Zeichen mit der Nummer 253 (CHR(253)) darstellen.
oxbp:setcaption(chr(253)) geht aber nicht, da die Konvertierung versucht das Zeichen von OEM in ANSI zu konvertieren. Das geht nicht, da es für dieses Sonderzeichen kein passendes OEM-Zeichen gibt.
Es gibt also kein Zeichen, dass auf CHR(253) konvertiert wird.
Gruß Matthias
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Jan »

Ginge denn ConvToAnsiCP(Chr(253))? Ich befürchte mal eher nicht ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Jan »

Ist nicht ASCII 236 = ANSI 253?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Leider nicht.
Chr(253) ist in Arial ein "ý". Im OEM-Zeichensatz gibt es kein passendes Zeichen. So einfach ist es leider nicht.
Gruß Matthias
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

Kamaalan hat geschrieben:Der Font selber ist leider nicht das Problem (In meinem Problem geht es um "Windings"). Ich möchte das ANSI-Zeichen mit der Nummer 253 (CHR(253)) darstellen.
ok dann versuche es mit XBP_PP_FONT und einem Font Object wo du die "richtige" Codepage auswählst.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Jan »

Kamaalan hat geschrieben:Leider nicht.
Chr(253) ist in Arial ein "ý". Im OEM-Zeichensatz gibt es kein passendes Zeichen. So einfach ist es leider nicht.
Gruß Matthias
Matthias,

also in meiner ASCII-Tabelle sieht das exakt gleich aus. y mit Akzent nach rechts oben.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von DelUser01 »

Jan hat geschrieben:Ist nicht ASCII 236 = ANSI 253?
irgendwie nicht ganz falsch.
Auf der beigefügten Hardcopy der Ausschnitt meiner Ascii-Tabelle von MultiEdit.
Da ist Dezimal 236 bei OEM das gesuchte ý und bei ANSI bei Dec 253.
Dateianhänge
HardCopy0001.JPG
HardCopy0001.JPG (42.12 KiB) 11735 mal betrachtet
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Hallo Zusammen,
leider haben Eure Lösungsversuche noch nicht geholfen. Ich schaffe es nicht in einem Static das Zeichen
Chr(253) im Zeichensatz Wingdings darzustellen. Fonts mit verschiedene Codepages ändern zwar das
Ergebnis, erreichen aber nicht das gewünschte.
Gruß Matthias
Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 133
Registriert: Mo, 21. Sep 2015 16:22
Hat sich bedankt: 1 Mal
Danksagung erhalten: 18 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von mikehoffmann »

Mach doch einen DllCall nach SetWindowTextA und übergib den Text als ANSI-String.
Michael
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Werde ich testen. Danke
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Hallo Zusammen,
ich benötige doch noch einmal Eure Hilfe. Ich habe versucht mit SetWindowTextA den Text eines XbpStatic() zu ersetzen. Leider ohne Erfolg. Den Titel eines Fenster konnte ich ohne Problem ändern. Was mache ich falsch? Über Hilfe/Tipps wäre ich sehr dankbar.

Code:

Code: Alles auswählen

EXTERN LONG SetWindowTextA( nHWND AS LONG, @cTxt AS STRING ) IN WIN32API
Function SetCaptionAnsi(oPart, cText)
	Local h := oPart:getHWND()
	SetWindowTextA(h,ctext+chr(0))
Return NIL
Gruß Matthias
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

Kamaalan hat geschrieben: Di, 18. Jul 2017 9:47 Ich habe versucht mit SetWindowTextA den Text eines XbpStatic() zu ersetzen.
Den Titel eines Fenster konnte ich ohne Problem ändern. Was mache ich falsch?
wie der Name der API Function sagt ist es für ein "Windows" ( = Fenster) gedacht und nicht für ein Control.

zum setzte eines Text benötigst du WM_SETTEXT

Code: Alles auswählen

      nHandle := oStatic:GethWnd()
      DllCall(nDll,DLL_STDCALL,"SendMessageA",nHandle,WM_SETTEXT,LEN(cText),cText )
gruss by OHR
Jimmy
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Hi,
danke für Deine schnelle Antwort, leider nur das gleiche Ergebnis.
Hier mal das ganze Programm:

Code: Alles auswählen

#include "gra.ch"
#include "dll.ch"
#include "xbp.ch"
#include "Appevent.ch"

#define WM_SETTEXT  0x000C

EXTERN LONG SetWindowTextA( nHWND AS LONG, @cTxt AS STRING ) IN WIN32API
EXTERN LONG SetWindowTextW( nHWND AS LONG, @cTxt AS STRING ) IN WIN32API
EXTERN LONG SetWindowText( nHWND AS LONG, @cTxt AS STRING ) IN WIN32API
EXTERN LONG GetWindowText( nHWND AS LONG, @cBuf AS STRING, nLen AS LONG ) IN WIN32API
EXTERN LONG SendMessageA( nHWND AS LONG, nMsg AS LONG, nLen AS LONG, @ctxt AS STRING )  IN WIN32API

PROCEDURE Main
	LOCAL nEvent, mp1, mp2, oXbp
	LOCAL oDlg, oDraw, oStatic, cText
	Local i,j,c,s
	Set Charset to oem
	oDlg          := XbpDialog():new()
	oDlg:title    := "Test Ansi/OEM"
	oDlg:create( ,, {50,50}, {500,500} )
	oDraw := oDlg:drawingArea

	oStatic         := XbpStatic():new( oDraw,, {10, 10 } ,{480,400} )
	oStatic:autoSize:=.f.
	oStatic:type    := XBPSTATIC_TYPE_TEXT
	oStatic:caption := "ALT"
	oStatic:create()

	setCaptionAnsi(oStatic,"NEU"+Chr(0))

	nEvent := 0
	DO WHILE nEvent <> xbeP_Close
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO
RETURN

Function APPSYS
Return NIL


Function SetCaptionAnsi(oPart, cText)
	Local h := oPart:getHWND()
	Local cBuffer := Space(200)

	SendMessageA(h,12,len(cText),ctext)
	GetWindowText(h,@cBuffer,20)
	oPart:invalidaterect()
Return NIL
In cBuffer steht hinterher "NEU" drin, aber auf dem Bildschirm bleibt der alte Inhalt ("ALT").
Danke und Gruß Matthias
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

die kommst du auf WIN32API ?
habe bei den anderen nicht nachgesehen aber auch die sind wohl aus USER32.DLL oder KERNAL32.DLL

Code: Alles auswählen

DLLFUNCTION SendMessageA( hWnd, nMsg, nWparam, nLparam ) USING STDCALL FROM user32.dll
du scheinst die v2.x zu benutzen mit EXTERNAL ... das ist nicht Abwärtz kompatible d.h. ich kann es mit der v1.9x nicht testen
gruss by OHR
Jimmy
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von HaPe »

Hallo Jimmy !
die kommst du auf WIN32API ?
Weil das in der Doku von EXTERN steht:
If the constant WIN32API from dll.ch is specified, the function is automatically searched for in the following Win32 API libraries: Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll and Advapi32.dll.
--
Hans-Peter
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Die 1.9 Version verhält sich identisch.
Gruß Matthias

Code: Alles auswählen

#include "gra.ch"
#include "dll.ch"
#include "xbp.ch"
#include "Appevent.ch"

#define WM_SETTEXT  0x000C

PROCEDURE Main
	LOCAL nEvent, mp1, mp2, oXbp
	LOCAL oDlg, oDraw, oStatic, cText
	Local i,j,c,s
	Set Charset to oem
	oDlg          := XbpDialog():new()
	oDlg:title    := "Test Ansi/OEM"
	oDlg:create( ,, {50,50}, {500,500} )
	oDraw := oDlg:drawingArea

	oStatic         := XbpStatic():new( oDraw,, {10, 10 } ,{480,400} )
	oStatic:autoSize:=.f.
	oStatic:type    := XBPSTATIC_TYPE_TEXT
	oStatic:caption := "ALT"
       oStatic:create()

	setCaptionAnsi(oStatic,"NEU"+Chr(0))

	nEvent := 0
	DO WHILE nEvent <> xbeP_Close
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO
RETURN

Function APPSYS
Return NIL

Function SetCaptionAnsi(oPart, cText)
	Local h := oPart:getHWND()
	Local cBuffer := Space(200)

	nDLL = DLLLoad("user32.dll")
	DllCall(nDll,DLL_STDCALL,"SendMessageA",h,WM_SETTEXT,LEN(cText),cText )
	DLLUnload(ndll)
Return NIL
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von ramses »

Überprüfe doch mal ob dein installierter Zeichensatz das gewünschte Zeichen überhaupt enthält. Ich hatte in anderem zusammenhang auch schon Probleme weil ein Zeichensatz von Windows keine hohen Zeichen enthielt. Nach installation eines vollständigen Zeichensatz ging es dann.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

Kamaalan hat geschrieben: Di, 18. Jul 2017 15:09Die 1.9 Version verhält sich identisch.
hm ... irgendwie geht es mit der Static nicht :angry4:
wenn du ein XbpSLE nimmst klappt es ... hm ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

HaPe hat geschrieben: Di, 18. Jul 2017 14:54
die kommst du auf WIN32API ?
Weil das in der Doku von EXTERN steht:
If the constant WIN32API from dll.ch is specified, the function is automatically searched for in the following Win32 API libraries: Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll and Advapi32.dll.
das ist wieder Typisch Alaska die "Sache" so zu "verdrehen" :angry4:

es kann ja sein das es den Xbase++ Usern "einfacher" gemacht werden soll aber "so" weiss der User ja gar nicht was er macht. wenn man mit der Windows API arbeitet sollte man die "übliche" Syntax verwenden wie es auch ot4xb macht

Code: Alles auswählen

@User32:SendMessageA(h,WM_SETTEXT,len(cText),cText)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

habe mir noch mal XbpStatic angesehen und festgestellt das es kein "echtes" Windows "Static" (WC_STATIC) ist :shock:
somit das Handle von o:GethWND() hier nichts für Windows API taugt [-X

allerdings frage ich mich was du damit eigentlich erreichen willst ?
du wirst damit ja die Zeichen nicht anders darstellen denn das hängt vom Font/Codepage ab.

ich verwende Unicode (ArialUni.TTF) und kann damit auch chinesische Zeichen unter "DE" anzeigen.
dito kann ich damit deutsche Umlaute unter "CN" anzeigen.

ob Xbase++ mit Unicode schon so weit ist ?
gruss by OHR
Jimmy
Kamaalan
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 31
Registriert: Do, 08. Jun 2006 15:04

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von Kamaalan »

Hi,
ich hoffe, die OEM/Ansi-Konvertierung umgehen zu können. Ich kann unsere Anwendung nicht auf Ansi umstellen! Und xBase konvertiert bei xbpStatic:setcaption() die Eingabe von OEM nach Ansi. Die gewünschten Zeichen (chr(253) im Zeichensatz Wingdings) haben kein passendes OEM Zeichen. Deswegen führt keine Eingabe zu dem gewünschtem Ergebnis. Deswegen auch die ursprüngliche Frage, ob man diese Konvertierung deaktivieren kann.
Gruß Matthias
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von AUGE_OHR »

ok ... aber es muss ja nicht eine XbpStatic sein zum anzeigen ... wie wäre es mit einem Bitmap von dem Sonderzeichen ?
eine andere Möglichkeit wäre ein XbpSLE was o:Disable ist wofür es extra Presentation Parameter gibt. (XBP_PP_DISABLED_FGCLR / XBP_PP_DISABLED_BGCLR )
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: xbpStatic ANSI/OEM Konvertierung verhindern?

Beitrag von ramses »

Einen Weg gäbe es noch. Baue dir einen Zeichensatz zusammen der dir unter OEM deine gewünschten Zeichen darstellt.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Antworten