Deutsch
Forum

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&
            end

(benötigt 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 für Tests sehr dankbar.

Gruß,

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
Ladeanzahl57
Herunterladen
 
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 Spaß 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 für x00 und +x für 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 könnte man bestimmt auch ne Automatik einbauen - für 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

                        DeleteObject Font&
                        end

Potztausend, die Edits reagieren wirklich aufs Haar gleich. Der einzige Unterschied liegt darin, wie ich den 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
Ladeanzahl53
Herunterladen
 
Nico Madysa
23.12.2009  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.272 Betrachtungen

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

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

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


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