Deutsch
Forum

Erweiterter Zeichensatz Unicode

 

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 X4
Schö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
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

07.07.2021  
 




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.
 
XProfan X2
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

07.07.2021  
 




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

7 kB
Hochgeladen:08.07.2021
Ladeanzahl84
Herunterladen
 
XProfan X4
Schö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
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

10.07.2021  
 




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 X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
13.07.2021  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.722 Betrachtungen

Unbenanntvor 0 min.
Georg Teles14.05.2024
Swissmade27.03.2024
E.T.14.01.2024
Stringray09.05.2022
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

Stephan Sonneborn (4x)
Georg Teles (3x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie