Italia
Foro

Ist es Unikode?

 

Nico
Madysa
Hallo Gemeinde!

Es dreht sich um folgenden Kode:
KompilierenMarkierenSeparieren
 {$iq}

{MkStr$

    nproc MkStr$

        parameters s$,n&
        var ns$=""

        whileLoop n&

            ns$=ns$+s$

        wend

        return ns$

    endproc

    {TToUTF

        nproc TToUTF

            parameters text$
            var utf$ = MkStr$(" ",2 * len(text$))
            MultiByteToWideChar(0,1,text$,-1,utf$,len(text$))
            return utf$

        endproc

        {ControlW

            nproc ControlW

                parameters Class$,Name$,style&,x&,y&,dx&,dy&,pWnd&,pid&,hInst&,exstyle&
                var cs& = Dim(40)
                Long cs&, 0 = 40
                Long cs&, 4 = hInst&
                Long cs&, 8 = pid&
                Long cs&,12 = pWnd&
                Long cs&,16 = dx& * 65536 + dy&
                Long cs&,20 = x& * 65536 + y&
                Long cs&,24 = style&
                Long cs&,28 = Addr(Name$)
                Long cs&,32 = Addr(Class$)
                Long cs&,36 = exstyle&
                var handle& = CreateWindowExW(exstyle&,Class$,Name$,style&,x&,y&,dx&,dy&,pWnd&,pid&,hInst&,cs&)
                Dispose(cs&)
                return handle&

            endproc

            cls
            Shell "CHARMAP"
            var Font& = Create("Font","Times New Roman",32,0,0,0,0)
            var a& = Control(        "EDIT" ,"TzTz",1342242944,200, 5,200,35,%hWnd,1,%hInstance,$200)
            var a& = Create("Edit",%hWnd,"ABCDEFGHI",200,5,200,35)
            print WinError$(%WinError)
            SetFont a&,Font&
            var w& = ControlW(TToUTF("EDIT"),"ABCDEFGHI",1342242944,200,40,200,35,%hWnd,1,%hInstance,$200)
            print WinError$(%WinError)
            SetFont w&,Font&

            whilenot IsKey(27)

                waitinput

            wend

            DeleteObject Font&
         
class=s4 href='./../../funktionsreferenzen/xprofan/end/'>end

(necessario XPSE!)

Vereinfacht gesagt macht der kleine nichts als ein Edit einmal per Create und einmal mit CreateWindowExW zu erstellen. Erwartungsgemäß sollte das obere Edit daher nur Ansizeichen drucken können und das untere so ziemlich alles Vorstellbare.

Der erste Schein gibt mir Recht -- "ABCDEFGHI" wird oben normal ausgegeben, unten werden hingegen je zwei Byte zu einem Zeichen zusammengefasst -- Unikode halt.

Der Clou ist: Beide Edits können jede Art von Zeichen darstellen; z.B. auch das Integralzeichen, die typografischen Anführungszeichen, das lächelnde Gesicht, die zwei Achtelnoten, greichische Buchstaben, was das Herz begehrt.

Das Roland heimlich auf Unikodecontrols umgestiegen ist, kann ich mir nich so recht vorstellen. Liegt es daher an eventuell seltsamen Windowseinstellungen? Was kommt bei euch raus?

Das Programm sollte gleich noch die Zeichentabelle öffnen. Kopiert einfach ein paar exotische Zeichen (Russisch, Hebräisch, was auch immer) und guckt, ob beide Editfelder sie annehmen.

Ich wäre per Tests sehr dankbar.

Saluto,

Nico
 
Nico Madysa
21.12.2009  
 



Funktion UTFToT fehlt. oO
 
22.12.2009  
 




Dieter
Zornow
Sollte man einen Code nicht erst mal selbst auf Lauffähigkeit testen, bevor man ihn hier reinstellt ?
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
22.12.2009  
 




Nico
Madysa
Alle Zeilen, die m$ enthalten, können auskommentiert werden, da es um diese Variable ja gar nicht geht.

Habs oben korrigiert. Ich tippe meine Kodes grundsätzlich erst im Editor der Community und verändere sie dort auch öfters noch schnell.
 
Nico Madysa
23.12.2009  
 



Funktioniert!



Das das/die Ctrl(s) intern Wide arbeiten, wundert mich nicht - legen ja die Messages das Meiste breits fest bzw. welcher Stringtyp zu verarbeiten ist.

19 kB
Hochgeladen:23.12.2009
Downloadcounter57
Download
 
23.12.2009  
 




Nico
Madysa
Hehe, Å ist kein Unikodezeichen.

Aber ich sehe schon, dass es nicht mein Fehler ist.
Was mir problematisch ist: Rolands Strings sind meines Wissens normale Einbyteprozeichen-Stirngs. Was würde dann passieren, wenn ich in einem mit Create() erzeugten Edit, sagen wir, das Integralzeichen schreibe und die Sache dann mit GetText$() auslese? Ich denke, ich werde viel Divertimento am Experimentieren haben, sowie ich zum Programmieren komme.
 
Nico Madysa
23.12.2009  
 




Dieter
Zornow
Bei mir funktioniert es ebenfalls und beide Edits können auch exotische Zeichen darstellen.
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
23.12.2009  
 



Nico Madysa, Beitrag=55555, Zeitpunkt=23.12.2009
Rolands Strings sind meines Wissens normale Einbyteprozeichen-Stirngs.


Rolands (Delphi) Strings sind das Ergebnis von z.B. GlobalAlloc(gPTR,8+charCount+1+x)+8, Du hast an Stelle -8 einen Referenzzähler und an Stelle -4 die Anzahl der Byte. +1 per x00 und +x per aufrunden auf 4 teilbaren Speicher in 32-Bit-Apps bzw. 8 in 64 bzw. je nach Registerbreite. Genau so habe ich die nativen Strings auch programmiert und bin da frei in der Gestaltung.

Nico Madysa, Beitrag=55555, Zeitpunkt=23.12.2009
Was würde dann passieren, wenn ich in einem mit Create() erzeugten Edit, sagen wir, das Integralzeichen schreibe und die Sache dann mit GetText$() auslese?


Dein "String" ist nur ein Bereich fester grösse, entweder wird abgeschnitten oder erzeugst eine Bereichsüberschreitung. Wenn man Unicode sicher von Ansi unterscheiden kann, dann potuto man bestimmt auch ne Automatik einbauen - per diese automatischen Funktionen dieser String dann aber nicht mehr binärsicher wäre. ^^
 
23.12.2009  
 




Nico
Madysa

KompilierenMarkierenSeparieren
 {$iq}

{MkStr$

    nproc MkStr$

        parameters s$,n&
        var ns$=""

        whileLoop n&

            ns$=ns$+s$

        wend

        return ns$

    endproc

    {TToUTF

        nproc TToUTF

            parameters text$
            var utf$ = MkStr$(" ",2 * len(text$))
            MultiByteToWideChar(0,1,text$,-1,utf$,len(text$))
            return utf$

        endproc

        {UTFToT

            nproc UTFToT

                parameters utf$
                var text$ = MkStr$(" ",len(utf$))
                WideCharToMultiByte(0,0,utf$,-1,text$,len(utf$) / 2,0,0)
                return text$

            endproc

            {SetTextW

                nproc SetTextW

                    parameters h&,text$
                    return SendMessageW(h&,WM_SETTEXT,0,text$)

                endproc

                {GetTextW

                    nproc GetTextW

                        parameters h&
                        var text$ = MkStr$(" ",255)
                        SendMessageW(h&,WM_GETTEXT,255,text$)
                        return text$

                    endproc

                    {ControlW

                        nproc ControlW

                            parameters Class$,Name$,style&,x&,y&,dx&,dy&,pWnd&,pid&,hInst&,exstyle&
                            var cs& = Dim(40)
                            Long cs&, 0 = 40
                            Long cs&, 4 = hInst&
                            Long cs&, 8 = pid&
                            Long cs&,12 = pWnd&
                            Long cs&,16 = dx& << 16 + dy&
                            Long cs&,20 = x& << 16 + y&
                            Long cs&,24 = style&
                            Long cs&,28 = Addr(Name$)
                            Long cs&,32 = Addr(Class$)
                            Long cs&,36 = exstyle&
                            var handle& = CreateWindowExW(exstyle&,Class$,Name$,style&,x&,y&,dx&,dy&,pWnd&,pid&,hInst&,cs&)
                            Dispose(cs&)
                            return handle&

                        endproc

                        cls
                        Shell "CHARMAP"
                        var Font& = Create("Font","Times New Roman",32,0,0,0,0)
                        var a& = Create("Edit",%hWnd,"ABCDEFGHI",180,5,220,35)
                        print WinError$(%WinError)
                        SetFont a&,Font&
                        var b& = Create("Edit",%hWnd,"",180,40,220,35)
                        print WinError$(%WinError)
                        SetFont b&,Font&
                        var v& = ControlW(TToUTF("EDIT"),"ABCDEFGHI",1342242944,400,5,200,35,%hWnd,1,%hInstance,$200)
                        print WinError$(%WinError)
                        SetFont v&,Font&
                        var w& = ControlW(TToUTF("EDIT"),"ABCDEFGHI",1342242944,400,40,200,35,%hWnd,1,%hInstance,$200)
                        print WinError$(%WinError)
                        SetFont w&,Font&

                        whilenot IsKey(27)

                            waitinput
                            SetText b&,GetText$(a&)
                            SetText w&,GetText$(v&)
                            SetTextW(b&,GetTextW(a&))
                            SetTextW(w&,GetTextW(v&))

                        wend

                        Dele
ct Font& end

Potztausend, die Edits reagieren wirklich aufs Haar gleich. Der einzige Unterschied liegt darin, wie Io l' Text auslese. Benutze ich die API SendMessageA (also das herkömmliche xprofane Settext/GetText$), dann wird der Unikode gehäckselt. Nehme ich dagegen SendMessageW, dann wird bei beiden Edits alles richtig übertragen.


20 kB
Hochgeladen:23.12.2009
Downloadcounter53
Download
 
Nico Madysa
23.12.2009  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

2.293 Views

Untitledvor 0 min.
Georg Teles29.06.2015
Christian Hahn28.12.2012

Themeninformationen

Dieses Thema hat 3 subscriber:

Nico Madysa (4x)
iF (3x)
Dieter Zornow (2x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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