Forum | | | | Stephan Sonneborn | Hallo Leute, ich stehe immer noch vor dem Problem, russische Texte auf Dialogelemente zu bringen. Die Texte liegen mittlerweile in einer DLL in russischer Sprache vor.
Ich schaffe es aber nicht, diese Texte darzustellen. Es werden immer nur Fragezeichen angezeigt.
Wie muss ich die Texte im ANSI- Bereich > 1024 ansprechen? Ich komme mit den WIDECHARS und WIDESTRINGS nicht klar...?!?! Zunächst muss ich die Texte aus der DLL lesen und zwar so, dass die Information, dass es kyrilische Zeichen sind mit übertragen wird. Bei stehen hier schon immer nur Fragezeichen im eingelesenen String.
Hat jemand eine Idee? |
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 06.07.2021 ▲ |
| |
| | Georg Teles | Hallo Stephan,
Wenn die Windows Sprache auf Deutsch ist, ist es normal, dass die Texte mittels print als ??? herauskommen, da print und SetText damit nicht umgehen können - anderes Problem ist, dass diese Texte bereits im Russichen vorliegen, sodass du diese als Ressource herauslesen und dann umwandeln müsste, weil ExtString$ nicht mit WideStrings umgehen kann.
Der Grund meiner PCU [...] war genau dieser, dass man die Strings als lateinische im Programm oder DLL einfügt und dann mit der Funktion umwandelt - l2cPCU.l2l von lateinischen Strings zu WideStrings und l2cPCU.l2c von den lateinischen Strings zu kyrillischen WideStrings
Grüße |
| | | | |
| | Stephan Sonneborn | Hallo Georg,
vielen Dank für Deine Antwort! So habe ich es über Umwege auch gemacht: Ein Kollege hat mit einer englisch / russischen Tastatur die russischen Texte "blind" eingegeben und ich hab den Kauderwelsch aus lateinischen Buchstaben dann verwendet, um ihn mit dem CYRILLIC - Font darzustellen. Ist aber sehr unschön, weil man immer den Font mitliefern muss. Jetzt hat ein andere Kollege direkt russische Texte eingegeben. Und ein anderer alles nochmal "richtig" auf russisch übersetzt.
Ich kann morgen mal eine abgespeckte DLL einstellen... |
| | | Schöne Grüße aus Wittgenstein von Stephan
Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 07.07.2021 ▲ |
| |
| | Georg Teles | Die Texte kann ich dir ja auch in meine Form übersetzen, für die PCU wenn du magst
Du kannst den Text direkt im Programm oder in der DLL mitliefern. Da russiche Texte generell problematisch auf einem deutschsprachigen PC sind, ist es meiner Meinung sinnvoller die Texte gleich in lateinischen Buchstaben abzuspeichern (ansi) weil die meisten Textfunktionen sowieso nur mit Ansi was anfangen können ... diese dann in WideStrings umwandeln ind ausgeben, dann hast du die Sicherheit, dass auf jedem PC das Gleiche angezeigt wird. |
| | | | |
| | Stephan Sonneborn | Ich hab hier mal ein Testprogramm und eine Mini-DLL mit drei Texten drin:
DECLARE DLL$, DLL&, FONT&, HText&[3], HTextW&[3]
DECLARE Text$[3], TextW$[3]
DECLARE Buffer#, count&, Adresse%,i%
DECLARE id%
DEF LoadStringW(4) !"USER32", "LoadStringW"
DEF IsMEnu(1) !"USER32", "IsMenu"
DEF CreateWindowExW(12) !"USER32", "CreateWindowExW"
DEF SetWindowTextW(2) !"USER32", "SetWindowTextW"
DIM Buffer#,4097
STRUCT CREATESTRUCT = lpCreateParams&, hInstance&, hMenu&, hwndParent&, cy%, cx%, y%, x%, style&, lpszName&, lpszClass&, dwExStyle&
'*****************************************************************************************************************'
'* ORDW, CHRW, UTF, CREATEW
'*****************************************************************************************************************'
proc ordw
parameters s$
declare m#
dim m#,2
char m#,0=left$(s$+"\z\z",2)
var wc&=word(m#,0)
dispose m#
return wc&
endproc
'*****************************************************************************************************************'
proc chrw
parameters wc&
declare m#
dim m#,2
word m#,0=wc&
var s$=char$(m#,0,2)
dispose m#
return s$
endproc
'*****************************************************************************************************************'
Proc UTF
parameters text$
declare b#
Dim b#,2*len(text$)+2
StringW b#,0 = text$
text$ = Char$(b#,0,SizeOf(b#)-2)
return text$
EndProc
'*****************************************************************************************************************'
Proc CreateW
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&,exstyle&
case %pCount <11 : exstyle& = 0
Class$ = UTF(Class$)
Name$ = UTF(Name$)
Var cs# = New(CREATESTRUCT)
With cs#
.lpCreateParams& = SizeOf(cs#)
.hInstance& = hInst&
.hMenu& = (IsMenu(id%)<>0) * id%
.hwndParent& = pWnd&
.cy% = dy%
.cx% = dx%
.y% = y%
.x% = x%
.style& = style&
.lpszName& = Addr(Name$)
.lpszClass& = Addr(Class$)
.dwExStyle& = exstyle&
EndWith
Var handle& = CreateWindowExW(exstyle&,Addr(Class$),Addr(Name$),style&,x%,y%,dx%,dy%,pWnd&,id%,hInst&,cs#)
Class$ = WinError$(%WinError)
inc id%
IfNot handle&
MessageBox("Es trat folgender Fehler auf:\n\n" + Class$,"F E H L E R !!!",4096)
EndIf
Dispose cs#
Return handle&
EndProc
'*****************************************************************************************************************'
'*****************************************************************************************************************'
'* Hauptprogramm'
'*****************************************************************************************************************'
DLL$ ="DLL_RU_Test.DLL"
DLL&=USEDLL(DLL$)
id% = 1
CLS
SET("CHARSET", 1251)
Font&=Create("FONT", "calibri",0,0,0,0,0)
HText&[1] = create("Static",%HWND,"1", 10,10,200,20)
HText&[2] = create("Static",%HWND,"2", 10,40,200,20)
HText&[3] = create("Static",%HWND,"3", 10,70,200,20)
HTextW&[1] = createW("static","W1", $50000000,250,10,200,20,%HWND,0,%HINSTANCE)
HTextW&[2] = createW("static","W2", $50000000,250,40,200,20,%HWND,0,%HINSTANCE)
HTextW&[3] = createW("static","W3", $50000000,250,70,200,20,%HWND,0,%HINSTANCE)
SETFONT HText&[1], Font&
SETFONT HText&[2], Font&
SETFONT HText&[3], Font&
SETFONT HTextW&[1], Font&
SETFONT HTextW&[2], Font&
SETFONT HTextW&[3], Font&
WAITINPUT
Adresse% = 99
WHILELOOP 1,3,1
CLEAR Buffer#
count& = LoadStringW(DLL&, Adresse%+&LOOP, Buffer#, 4097)
Text$[&LOOP] = EXTSTRING$ (DLL&, Adresse%+&LOOP)
TextW$[&LOOP] = WIDECHAR(Buffer#,0,count&*2)
SETTEXT HText&[&LOOP], Text$[&LOOP]
SETTEXT HTextW&[&LOOP], TextW$[&LOOP]
WEND
WAITINPUT
DISPOSE Buffer#
DELETEOBJECT Font&
FREEDLL DLL&
END
|
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 08.07.2021 ▲ |
| |
| | Georg Teles | Hi Stephan, habe deinen Quelltext angepasst, so dürfte es gehen
DECLARE DLL$, DLL&, FONT&, HText&[3], HTextW&[3]
DECLARE Text$[3], TextW$[3]
DECLARE Buffer#, count&, Adresse%,i%
DECLARE id%
DEF LoadStringW(4) !"USER32", "LoadStringW"
DEF IsMEnu(1) !"USER32", "IsMenu"
DEF CreateWindowExW(12) !"USER32", "CreateWindowExW"
DEF SetWindowTextW(2) !"USER32", "SetWindowTextW"
DIM Buffer#,4097
STRUCT CREATESTRUCT = lpCreateParams&, hInstance&, hMenu&, hwndParent&, cy%, cx%, y%, x%, style&, lpszName&, lpszClass&, dwExStyle&
'*****************************************************************************************************************'
'* ORDW, CHRW, UTF, CREATEW
'*****************************************************************************************************************'
proc ordw
parameters s$
declare m#
dim m#,2
char m#,0=left$(s$+"\z\z",2)
var wc&=word(m#,0)
dispose m#
return wc&
endproc
'*****************************************************************************************************************'
proc chrw
parameters wc&
declare m#
dim m#,2
word m#,0=wc&
var s$=char$(m#,0,2)
dispose m#
return s$
endproc
'*****************************************************************************************************************'
Proc UTF
parameters text$
declare b#
Dim b#,2*len(text$)+2
StringW b#,0 = text$
text$ = Char$(b#,0,SizeOf(b#)-2)
return text$
EndProc
'*****************************************************************************************************************'
Proc CreateW
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&,exstyle&
case %pCount <11 : exstyle& = 0
Class$ = UTF(Class$)
Name$ = UTF(Name$)
Var cs# = New(CREATESTRUCT)
With cs#
.lpCreateParams& = SizeOf(cs#)
.hInstance& = hInst&
.hMenu& = (IsMenu(id%)<>0) * id%
.hwndParent& = pWnd&
.cy% = dy%
.cx% = dx%
.y% = y%
.x% = x%
.style& = style&
.lpszName& = Addr(Name$)
.lpszClass& = Addr(Class$)
.dwExStyle& = exstyle&
EndWith
Var handle& = CreateWindowExW(exstyle&,Addr(Class$),Addr(Name$),style&,x%,y%,dx%,dy%,pWnd&,id%,hInst&,cs#)
Class$ = WinError$(%WinError)
inc id%
IfNot handle&
MessageBox("Es trat folgender Fehler auf:\n\n" + Class$,"F E H L E R !!!",4096)
EndIf
Dispose cs#
Return handle&
EndProc
'*****************************************************************************************************************'
'*****************************************************************************************************************'
'* Hauptprogramm'
'*****************************************************************************************************************'
DLL$ ="DLL_RU_Test.DLL"
DLL&=USEDLL(DLL$)
id% = 1
CLS
SET("CHARSET", 1251)
Font&=Create("FONT", "calibri",0,0,0,0,0)
HText&[1] = create("Static",%HWND,"1", 10,10,200,20)
HText&[2] = create("Static",%HWND,"2", 10,40,200,20)
HText&[3] = create("Static",%HWND,"3", 10,70,200,20)
HTextW&[1] = createW("static","W1", $50000000,250,10,200,20,%HWND,0,%HINSTANCE)
HTextW&[2] = createW("static","W2", $50000000,250,40,200,20,%HWND,0,%HINSTANCE)
HTextW&[3] = createW("static","W3", $50000000,250,70,200,20,%HWND,0,%HINSTANCE)
SETFONT HText&[1], Font&
SETFONT HText&[2], Font&
SETFONT HText&[3], Font&
SETFONT HTextW&[1], Font&
SETFONT HTextW&[2], Font&
SETFONT HTextW&[3], Font&
WAITINPUT
Adresse% = 99
WHILELOOP 1,3,1
CLEAR Buffer#
count& = LoadStringW(DLL&, Adresse%+&LOOP, Buffer#, 4097)
TextW$[&LOOP] = c2w(Buffer#,count&*2)'Byte für Byte auslesen !!!
SetWindowTextW(HText&[&LOOP], Addr(TextW$[&LOOP]))'Set...W
SetWindowTextW(HTextW&[&LOOP], Addr(TextW$[&LOOP]))'Set...W
'Text$[&LOOP] = EXTSTRING$ (DLL&, Adresse%+&LOOP)
'TextW$[&LOOP] = WIDECHAR(Buffer#,0,count&*2)
'SETTEXT HText&[&LOOP], Text$[&LOOP]
'SETTEXT HTextW&[&LOOP], TextW$[&LOOP]
WEND
WAITINPUT
DISPOSE Buffer#
DELETEOBJECT Font&
FREEDLL DLL&
END
WEND
Proc c2w'Byte für Byte auslesen
Parameters buf#, siz&
Declare wide$
Clear wide$
WhileLoop 0,(siz&-1)
wide$ = wide$+Chr$(Byte(buf#,&loop))'+Chr$(4) CHR(4) entfällt, da Buffer# bereits als Wide geladen wurde !!! bei normalem String müsste man hier den CHR(4) noch anhängen
EndWhile
Return wide$
EndProc
Grüße Georg |
| | | | |
| | Stephan Sonneborn | Hallo Georg,
super! Das klappt prima!
Der Knackpunkt war also das byte-weise Einlesen der Texte und das Setzen über SETWINDOWTEXTW() mit Ansprechen der Textadresse.
Vielen, vielen Dank! |
| | | XProfan X4Schöne Grüße aus Wittgenstein von Stephan Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 13.07.2021 ▲ |
| |
|
AntwortenThemenoptionen | 3.677 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |