Forum | | | | 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 |
| | | | |
| | | Funktion UTFToT fehlt. oO |
| | | | |
| | 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. |
| | | | |
| | | 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. |
| | | | |
| | 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. |
| | | | |
| | 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. ^^ |
| | | | |
| | 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.
|
| | | | |
|
AntwortenThemenoptionen | 2.273 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |