Forum | | | | Nico Madysa | Einen Gruß allen daraußen.
Dies ist der offizielle Nachfolger hiervon: [...] . Diesmal taucht ein sehr seltsamer Fehler in quasi demselben Code auf. Zur Erinnerung sei er noch mal (in unwesentlich gekürzter Form) gezeigt: KompilierenMarkierenSeparieren $H Messages.ph
var id% = 1
Struct CREATESTRUCT = lpCreateParams&, hInstance&, hMenu&, hwndParent&, cy%, cx%, y%, x%, style&, lpszName&, lpszClass&, dwExStyle&
Struct LVCOLUMN = Mask&, FMT&, CX&, Text&, cchTextMaxLen&, Subitem&
Struct LVITEM = IMASK&, ITEM&, ISUBITEM&, State&, StateMask&, ITEXT&, ITEXTMAX&, IIMAGE&, ILPARAM&
proc CreateW
if %pCount > 10
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&,exstyle&
else
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&
var exstyle& = 0
endif
var cs# = New(CREATESTRUCT)
With cs#
.lpCreateParams& = SizeOf(cs#)
.hInstance& = hInst&
.hMenu& = if(u_IsMenu(id%),id%,0)
.hwndParent& = pWnd&
.cy% = dy%
.cx% = dx%
.y% = y%
.x% = x%
.style& = style&
.lpszName& = Addr(Name$)
.lpszClass& = Addr(Class$)
.dwExStyle& = exstyle&
EndWith
var handle& = u_CreateWindowExW(exstyle&,Addr(Class$),Addr(Name$),style&,x%,y%,dx%,dy%,pWnd&,id%,hInst&,cs#)
inc id%
ifnot handle&
Class$ = WinError$(%WinError)
MessageBox("Es trat folgender Fehler auf:
" + Class$,"F E H L E R !!!",4096)
endif
Dispose cs#
return handle&
endproc
subproc Create.GridBoxW
parameters pWnd&,def$,stl%,x%,y%,dx%,dy%
declare s$
var hList& = CreateW("SzyzszLzizsztzVzizezwz3z2zzz","",$50000009 + stl%,x%,y%,dx%,dy%,pWnd&,0,%hInstance,$200)
u_SendMessageW(hList&,$1036,0,$00000023)
var LVC# = New(LVCOLUMN)
With LVC#
.Subitem& = 0
.MASK& = $7
whileloop 0,(len(def$,";") 3) - 1
s$ = SubStr$(def$,3*&loop + 1,";")
.TEXT& = Addr(s$)
.FMT& = val(SubStr$(def$,3*&loop + 2,";"))
.CX& = val(SubStr$(def$,3*&loop + 3,";"))
.cchTextMaxLen& = len(s$)
u_SendMessageW(hList&,$1061,&loop,LVC#)
EndWhile
EndWith
Dispose LVC#
return hList&
endproc
proc InsertStringW
parameters pList&,s$,index%
declare ss$
var LVI# = New(LVITEM)
var d$ = Get("ListDel") + "z"
With LVI#
.IMASK&=$1
.ITEM& = index%
whileloop len(s$,d$)
ss$ = SubStr$(s$,&loop,d$)
.iText& = Addr(ss$)
.ITEXTMAX& = len(ss$)
.ISUBITEM& = &loop - 1
ifnot &loop - 1
u_SendMessageW(pList&,$104D,index%,LVI#)
else
u_SendMessageW(pList&,$104C,index%,LVI#)
endif
EndWhile
EndWith
Dispose LVI#
endproc
proc LoadText
parameters d$
declare a$
case d$ = "" : return
Die CSV-Datei wird eingelesen
declare b#,t$,tt$
Dim b#,FileSize(d$)
BlockRead(d$,b#,0,SizeOf(b#))
d$ = Char$(b#,2,SizeOf(b#)-2)
Dispose b#
Die Zeilen werden im Sortier-Listview alphabetisch geordnet
whileloop 0,len(d$,"x0Dzx0Az")-1
a$ = "Mzeziznz;zVzezrzszuzczhz!z"
a$ = SubStr$(d$,&loop+1,"x0Dzx0Az")
WindowTitle Translate$(a$,"z","|")
InsertStringW(hSortDP&,a$,&loop)
InsertStringW(hSortDP&,SubStr$(d$,&loop+1,"x0Dzx0Az"),&loop)
EndWhile
Die Substrings jeder Zeile sind mit einem Semikolon getrennt
Set("ListDel",";")
Das Sortier-Listview wird ins Anzeigelistview übertragen
Aus einer Spalte werden zwei
var LVI# = New(LVITEM)
LVI#.IMASK&= $1
LVI#.ITEXT&= LVI#+36
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0
whileloop 0, Getcount(hSortDP&) -1
LVI#.ITEM& = &loop
u_SendMessageW(hSortDP&,$1073,&loop,LVI#)Text auslesen
Dim b#,200
b# = LVI#.iText&
d$ = Char$(b#,0,SizeOf(b#))In Stringvariable schreiben
InsertStringW(hList&,d$,&loop)übertragen
Dispose b#
EndWhile
Dispose LVI#
endproc
declare hUser&,hGDI&,hKrnl&
declare hSortDP&,hList&
cls
var font& = Create("Font","Times New Roman",16,0,0,0,0)
hUser& = ImportDLL("USER32","u_")
hSortDP& = Create("GridBoxW",%hWnd,";0;100",$10,0,0,0,0)
ShowWindow(hSortDP&,0)
hList& = Create("GridBoxW",%hWnd,";0;300;;0;300",$00,0,0,width(%hWnd),height(%hWnd))
SetFont hList&,font&
WindowTitle "Bitte warten, Wortliste wird geladen ..."
Format
LoadText LoadFile$("Testdatei laden","Test.txt")
WindowTitle "Je 100 deutsche und polnische Wörter"
whilenot IsKey(27)
waitinput
wend
FreeDLL hUser&
FreeDLL hGDI&
FreeDLL hKrnl&
DeleteObject font&
end
Viel Text um wenig Seltsames, entscheiden sind nämlich die folgenden Zeilen: KompilierenMarkierenSeparieren
whileloop 0,len(d$,"x0Dzx0Az")-1
a$ = "Mzeziznz;zVzezrzszuzczhz!z"
a$ = SubStr$(d$,&loop+1,"x0Dzx0Az")
WindowTitle Translate$(a$,"z","|")
InsertStringW(hSortDP&,a$,&loop)
InsertStringW(hSortDP&,SubStr$(d$,&loop+1,"x0Dzx0Az"),&loop)
EndWhile
Hier stürzt der Code in der späteren Zeile KompilierenMarkierenSeparieren sang- und klanglos ab. Nun die eigentlich verwunderlichen Beobachtungen: 1. Das Kompilat arbeitet fehlerfrei. 2. Nehme ich nicht den Umweg über a$, sondern füge den Substring sofort ein (Zeile 2 und 4 weg, dafür Zeile 5), so gibt es keinen Fehler. 3. Nehme ich keine unterschiedlichen Texte, sondern einen festen Probetext (Zeile 2 weg, dafür Zeile 1), so gibt es ebenfalls keinen Fehler. 4. Item läuft alles fehlerfrei, wenn ich die die obige Zeile mit WindowTitle entkommentiere. An der Prozessorauslastun kann es jedoch nicht liegen, denn füge ich anstatt von WindowTitle Sleep ein, so stürzt der Kode ebenfalls ab.
Das waren jetzt vier Wege, diesen Fehler zu umgehen. Doch hat irgendjemand eine Ahnung, warum er überhaupt auftritt? Jede dieser vier Lösungen (außer vielleicht Nummer 3) sollte eigentlich gar keine Auswirkung haben und doch verhindern sie den Programmabsturz. Dietmar und ich sind mit unserem Latein am Ende, doch vielleicht sehen 46 Augen mehr als 4.
Es verbleibt ratlos
Nico Madysa |
| | | | |
| | Frank Abbing | Ich würde sagen, das Problem sind die Strings. Unicode-Strings benutzen als Endekennung doch zwei Nullbytes, Profan eines. |
| | | | |
| | Dietmar Horn | Ich würde meinen, hier hat Roland noch irgendwas übersehen, was im Interpreter zum Absturz führt aber als Compilat dagegen fehlerfrei funktioniert.
Falls das wirklich nur an den unterschiedlichen Endekennungen liegen sollte, dann müßten nach meinem Verständnis doch alle von Nico durchgespielten Varianten abstürzen, oder sich wenigstens im Interpreter und compiliert identisch verhalten (unabhängig davon, ob immer Absturz oder immer kein Absturz).
Gruß Dietmar |
| | | Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V. [...] Windows 95 bis Windows 7 Profan² 6.6 bis XProfan X2 mit XPSE Das große XProfan-Lehrbuch: [...] | 10.07.2009 ▲ |
| |
| | Thomas Freier | Alles merkwürdig. Die *.exe erzeugt mit profed32.exe läuft durch. Die *.exe mit XProfEd32.exe erzeugt bricht ab mit der Fehlermeldung : Zeile 26, a# nicht declariert. a# eingefügt und geht es mit dem ganzen Alphabet weiter???
Fehler kann ich nicht suchen, da momentan Trabbel mit dem Laptop. DVD-Laufwerk wird nur noch als CD-Laufwerk erkannt und die Tips im WEB und alte Abbilder konnten das Problem nicht beheben. Beim Aufräumen fand ich noch den Anhang (verwendbar?) und KilletSoft Data Conversion Freeware: [...] |
| | | | |
| | | Nur kurz überflogen, aber ich hoffe, Ihr überseht nicht, dass der Speicherbereich für die Klasse nach beenden der Funktion verflogen ist.
Vlt. besser hier mit z.B. globalAlloc ein Handle für einen Speicher holen und die Struktur dareinkopieren. |
| | | | |
| | Nico Madysa | Hmm, noch mehr Merkwürdigkeiten: 5. Mir ist aufgefallen, dass LVI# in InsertStringW am Ende nicht disposed wird. Also habe ich am Ende Dispose LVI# eingefügt. Ergebnis: Crash. 6. Danach ist mir aufgefallen, dass der benutzte Bereich in LoadText UND InsertStringW LVI# heißt, weswegen ich ihn in InsertStringW in p_LVI# umbenannt habe. Ergebnis: Crash; egal, ob p_LVI# disposed wird oder nicht.
Mein eigentliches Problem besteht darin, dass all solcherlei Änderungen wie z.B. Ausgabe mittels WindowTitle überhaupt keine Auswirkungen haben sollten. Auch, dass es im Interpreter hakt und als Exe durchläuft, lässt mich langsam glauben, dass der Fehler irgendwo in Profan selbst steckt. Roland wird sich dazu sicherlich bald zu Wort melden, gell?
@iF: Welche Klasse und welche Funktion meinst du denn? |
| | | | |
| | | Sorry, Strukturen sind für mich auch "nur" Klassen. ^^
Ich meine cs# in CreateW.
Nehmt doch nen globalAlloc und kopiert den Inhalt von cs# hinein und merkt Euch das Handle in z.B. einem dyn.Array und übergebt an u_CreateWindowExW das Handle statt cs#. (Weil ich mir jetzt nicht sicher bin, ob u_CreateWindowExW den Speicher für sich sichert oder diesen gerne erhalten sehen möchte.)
Wobei ich sehe grad, Strings wie class$ sollten nach Verlassen der Funktion ebenso "futsch" sein. |
| | | | |
| | Nico Madysa | So, wie ich die Win32.hlp lese, hat cs# gar nichts mit der Sache mit der Sache zu tun, denn das ist nur ein Bereich, der an die Message WM_CREATE weitergegeben wird. Der einzigen Nutzen ist, dass das erstellte Control begreift, was es ist. Danach sollte es eigentlich völlig unnötig sein. |
| | | | |
| | Frank Abbing | Stell sicher, dass deine Strings überall in deinem Code am Ende zwei Nullbytes haben, wo immer du XProfan-Strings zusammen mit Unicode-Strings benutzt. Dass es manchmal funktioniert und manchmal nicht, deutet für mich darauf hin, dass das nicht immer der Fall ist. Im Zweifelsfall stattdessen Speicherbereiche verwenden. Ob du bereich# oder GlobalAlloc-Memory benutzt ist eigentlich piepegal. Ist beides das Gleiche. |
| | | | |
| | Nico Madysa | So, also ich sehe, nichts, was ich noch machen kann: KompilierenMarkierenSeparieren $H Messages.ph
var id% = 1
Struct CREATESTRUCT = lpCreateParams&, hInstance&, hMenu&, hwndParent&, cy%, cx%, y%, x%, style&, lpszName&, lpszClass&, dwExStyle&
Struct LVCOLUMN = Mask&, FMT&, CX&, Text&, cchTextMaxLen&, Subitem&
Struct LVITEM = IMASK&, ITEM&, ISUBITEM&, State&, StateMask&, ITEXT&, ITEXTMAX&, IIMAGE&, ILPARAM&
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
if %pCount > 10
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&,exstyle&
else
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&
var exstyle& = 0
endif
Class$ = UTF(Class$)
Name$ = UTF(Name$)
var cs# = New(CREATESTRUCT)
With cs#
.lpCreateParams& = SizeOf(cs#)
.hInstance& = hInst&
.hMenu& = if(u_IsMenu(id%),id%,0)
.hwndParent& = pWnd&
.cy% = dy%
.cx% = dx%
.y% = y%
.x% = x%
.style& = style&
.lpszName& = Addr(Name$)
.lpszClass& = Addr(Class$)
.dwExStyle& = exstyle&
EndWith
var handle& = u_CreateWindowExW(exstyle&,Addr(Class$),Addr(Name$),style&,x%,y%,dx%,dy%,pWnd&,id%,hInst&,cs#)
inc id%
ifnot handle&
Class$ = WinError$(%WinError)
MessageBox(Es trat folgender Fehler auf:
+ Class$,F E H L E R !!!,4096)
endif
Dispose cs#
return handle&
endproc
subproc Create.GridBoxW
parameters pWnd&,def$,stl%,x%,y%,dx%,dy%
declare s$
var hList& = CreateW(SysListView32,,$50000009 + stl%,x%,y%,dx%,dy%,pWnd&,0,%hInstance,$200)
u_SendMessageW(hList&,$1036,0,$00000023)
var LVC# = New(LVCOLUMN)
With LVC#
.Subitem& = 0
.MASK& = $7
whileloop 0,(len(def$,;) 3) - 1
s$ = SubStr$(def$,3*&loop + 1,;)
.TEXT& = Addr(s$)
.FMT& = val(SubStr$(def$,3*&loop + 2,;))
.CX& = val(SubStr$(def$,3*&loop + 3,;))
.cchTextMaxLen& = len(s$)
u_SendMessageW(hList&,$1061,&loop,LVC#)
EndWhile
EndWith
Dispose LVC#
return hList&
endproc
proc InsertStringW
parameters pList&,s$,index%
declare ss$
var LVI# = New(LVITEM)
var d$ = UTF(Get(ListDel))
With LVI#
.IMASK&=$1
.ITEM& = index%
whileloop len(s$,d$)
ss$ = SubStr$(s$,&loop,d$)
.iText& = Addr(ss$)
.ITEXTMAX& = len(ss$)
.ISUBITEM& = &loop - 1
ifnot &loop - 1
u_SendMessageW(pList&,$104D,index%,LVI#)
else
u_SendMessageW(pList&,$104C,index%,LVI#)
endif
EndWhile
EndWith
endproc
proc LoadText
parameters d$
declare a$
case d$ = : return
Die CSV-Datei wird eingelesen
declare b#,t$,tt$
Dim b#,FileSize(d$)
BlockRead(d$,b#,0,SizeOf(b#))
d$ = Char$(b#,2,SizeOf(b#)-2)
Dispose b#
Die Zeilen werden im Sortier-Listview alphabetisch geordnet
whileloop 0,len(d$,x0Dzx0Az)-1
a$ = SubStr$(d$,&loop+1,x0Dzx0Az) DIES IST DIE BETROFFENE ZEILE
InsertStringW(hSort&,SubStr$(d$,&loop+1,x0Dzx0Az),&loop)
EndWhile
Die Substrings jeder Zeile sind mit einem Semikolon getrennt
Set(ListDel,;)
Das Sortier-Listview wird ins Anzeigelistview übertragen
Aus einer Spalte werden zwei
var LVI# = New(LVITEM)
LVI#.IMASK&= $1
LVI#.ITEXT&= LVI#+36
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0
whileloop 0, Getcount(hSort&) -1
LVI#.ITEM& = &loop
u_SendMessageW(hSort&,$1073,&loop,LVI#)Text auslesen
Dim b#,200
b# = LVI#.iText&
d$ = Char$(b#,0,SizeOf(b#))In Stringvariable schreiben
InsertStringW(hList&,d$,&loop)übertragen
Dispose b#
EndWhile
Dispose LVI#
endproc
declare hUser&,hGDI&,hKrnl&
declare hSort&,hList&
cls
var font& = Create(Font,Times New Roman,16,0,0,0,0)
hUser& = ImportDLL(USER32,u_)
hSort& = Create(GridBoxW,%hWnd,UTF(Sortieren)+;0;100,$10,0,0,0,0)
ShowWindow(hSort&,0)
hList& = Create(GridBoxW,%hWnd,UTF(Deutsch)+;0;300;+UTF(Polnisch)+;2;300,$00,0,0,width(%hWnd),height(%hWnd))
SetFont hList&,font&
WindowTitle Bitte warten, Wortliste wird geladen ...
Format
Wort1;Wort2
Wort3;Wort4;...
LoadText LoadFile$(Quelldatei laden ...,deupol.txt)
WindowTitle Je 100 deutsche und polnische Wörter (ESC um zu sichern)
whilenot IsKey(27)
waitinput
wend
FreeDLL hUser&
FreeDLL hGDI&
FreeDLL hKrnl&
DeleteObject font&
end
Die kuriose Zeile ist a$ = SubStr$(d$,&loop+1,x0Dzx0Az). Ist sie auskommentiert, so läuft alles wunderbar, arbeitet sie hingegen mit (obwohl sie gar keinen Einfluss haben sollte), so steht in der ersten Zeile Aaahen, statt Aachen. Ich sehe mich einfach nicht imstande, einen Fehler in einem chaotischen Kode zu finden. Wenn ich nicht gerade noch durch Zufalle darauf stoße, bin ich wirklich so weit, Windows oder Profan die Sache in die Schuhe zu schieben.
@Frank: Theoretisch sollten die zwei Abschlussbytes ohne Interesse sein, denn die Listviewmessages verlangen stets die genaue Pufferlänge, die in der Eigenschaft iTextMax& angegeben sein muss. Sie verlangen keine Abschlussbytes. Praktisch habe ich, um sicher zu gehen, dennoch folgende Zeile in InsertStringW geändert: KompilierenMarkierenSeparieren Ich habe dem String, der unmittelbar an die Message geht, noch zwei Nullbytes hinzugefügt. (Und viel mehr Unicode-Messages als in InsertStringW kommen im gesamten Code nicht vor.) Das Ergebnis hat mich nicht überrascht: Absturz. |
| | | | |
| | | Du solltest vielleicht einfach für die Speicher, die Du für Stringinhalte nutzt und an Apis übergibst, nicht XProfan-Strings verwenden. KompilierenMarkierenSeparieren |
| | | | |
| | Nico Madysa | Deinem Seelenfrieden zuliebe habe ichs getan. KompilierenMarkierenSeparieren $H Messages.ph
var id% = 1
Struct CREATESTRUCT = lpCreateParams&, hInstance&, hMenu&, hwndParent&, cy%, cx%, y%, x%, style&, lpszName&, lpszClass&, dwExStyle&
Struct LVCOLUMN = Mask&, FMT&, CX&, Text&, cchTextMaxLen&, Subitem&
Struct LVITEM = IMASK&, ITEM&, ISUBITEM&, State&, StateMask&, ITEXT&, ITEXTMAX&, IIMAGE&, ILPARAM&
Def GlobalAlloc(2) !"KERNEL32","GlobalAlloc"
Def GlobalFree(1) !"KERNEL32","GlobalFree"
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
if %pCount > 10
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&,exstyle&
else
parameters Class$,Name$,style&,x%,y%,dx%,dy%,pWnd&,pid%,hInst&
var exstyle& = 0
endif
Class$ = UTF(Class$)
Name$ = UTF(Name$)
var cs# = New(CREATESTRUCT)
With cs#
.lpCreateParams& = SizeOf(cs#)
.hInstance& = hInst&
.hMenu& = if(u_IsMenu(id%),id%,0)
.hwndParent& = pWnd&
.cy% = dy%
.cx% = dx%
.y% = y%
.x% = x%
.style& = style&
.lpszName& = Addr(Name$)
.lpszClass& = Addr(Class$)
.dwExStyle& = exstyle&
EndWith
var handle& = u_CreateWindowExW(exstyle&,Addr(Class$),Addr(Name$),style&,x%,y%,dx%,dy%,pWnd&,id%,hInst&,cs#)
inc id%
ifnot handle&
Class$ = WinError$(%WinError)
MessageBox("Es trat folgender Fehler auf:
" + Class$,"F E H L E R !!!",4096)
endif
Dispose cs#
return handle&
endproc
subproc Create.GridBoxW
parameters pWnd&,def$,stl%,x%,y%,dx%,dy%
declare s$
var hList& = CreateW("SysListView32","",$50000009 + stl%,x%,y%,dx%,dy%,pWnd&,0,%hInstance,$200)
u_SendMessageW(hList&,$1036,0,$00000023)
var LVC# = New(LVCOLUMN)
With LVC#
.Subitem& = 0
.MASK& = $7
whileloop 0,(len(def$,";") 3) - 1
s$ = SubStr$(def$,3*&loop + 1,";")
.TEXT& = Addr(s$)
.FMT& = val(SubStr$(def$,3*&loop + 2,";"))
.CX& = val(SubStr$(def$,3*&loop + 3,";"))
.cchTextMaxLen& = len(s$)
u_SendMessageW(hList&,$1061,&loop,LVC#)
EndWhile
EndWith
Dispose LVC#
return hList&
endproc
proc InsertStringW
parameters pList&,s$,index%
declare ss$,palloc&
var LVI# = New(LVITEM)
var d$ = UTF(Get("ListDel"))
With LVI#
.IMASK&=$1
.ITEM& = index%
whileloop len(s$,d$)
ss$ = SubStr$(s$,&loop,d$) + "zz"
palloc& = GlobalAlloc($40,len(ss$))
Char palloc&,0 = ss$
.iText& = palloc&
.ITEXTMAX& = len(ss$)
.ISUBITEM& = &loop - 1
ifnot &loop - 1
u_SendMessageW(pList&,$104D,index%,LVI#)
else
u_SendMessageW(pList&,$104C,index%,LVI#)
endif
GlobalFree(palloc&)
EndWhile
EndWith
endproc
proc LoadText
parameters d$
declare a$
case d$ = "" : return
Die CSV-Datei wird eingelesen
declare b#,t$,tt$ , alloc&
Dim b#,FileSize(d$)
BlockRead(d$,b#,0,SizeOf(b#))
d$ = Char$(b#,2,SizeOf(b#)-2)
Dispose b#
Die Zeilen werden im Sortier-Listview alphabetisch geordnet
whileloop 0,len(d$,"x0Dzx0Az")-1
a$ = SubStr$(d$,&loop+1,"x0Dzx0Az") DIES IST DIE BETROFFENE ZEILE
InsertStringW(hSort&,a$,&loop)
EndWhile
Die Substrings jeder Zeile sind mit einem Semikolon getrennt
Set("ListDel",";")
Das Sortier-Listview wird ins Anzeigelistview übertragen
Aus einer Spalte werden zwei
var LVI# = New(LVITEM)
LVI#.IMASK&= $1
LVI#.ITEXT&= LVI#+36
LVI#.ITEXTMAX& = 200
LVI#.ISUBITEM& = 0
whileloop 0, Getcount(hSort&) -1
LVI#.ITEM& = &loop
u_SendMessageW(hSort&,$1073,&loop,LVI#)Text auslesen
Dim b#,200
b# = LVI#.iText&
d$ = Char$(b#,0,SizeOf(b#))In Stringvariable schreiben
InsertStringW(hList&,d$,&loop)übertragen
Dispose b#
EndWhile
Dispose LVI#
endproc
declare hUser&,hGDI&,hKrnl&
declare hSort&,hList&
cls
var font& = Create("Font","Times New Roman",16,0,0,0,0)
hUser& = ImportDLL("USER32","u_")
hSort& = Create("GridBoxW",%hWnd,UTF("Sortieren")+";0;100",$10,0,0,0,0)
ShowWindow(hSort&,0)
hList& = Create("GridBoxW",%hWnd,UTF("Deutsch")+";0;300;"+UTF("Polnisch")+";2;300",$00,0,0,width(%hWnd),height(%hWnd))
SetFont hList&,font&
WindowTitle "Bitte warten, Wortliste wird geladen ..."
Format
"Wort1;Wort2
Wort3;Wort4;..."
LoadText LoadFile$("Quelldatei laden ...","deupol.txt")
WindowTitle "Je 100 deutsche und polnische Wörter (ESC um zu sichern)"
whilenot IsKey(27)
waitinput
wend
FreeDLL hUser&
FreeDLL hGDI&
FreeDLL hKrnl&
DeleteObject font&
end
Und ich muss sagen, dass mich die Überraschungen immer weniger überraschen. 7. Nachdem ich InsertStringW auf GlobalAlloc umgestellt hatte, hatten alle Einträge unsinnige Schwänzchen. 8. Nachdem ich dann auch noch die Einträge jeweils um zwei Nullbytes erweitert hatte, hatte es wieder so wie im Original funktioniert. (Kann mir irgendeiner den Unterschied zwischen der Adresse eines Speicherbereiches mit der Länge len(ss$) und der Adresse eines Profanstrings mit der Länge len(ss$) erklären?) 9. Nachdem ich die seltsame Zeile a$ = SubStr$(d$,&loop+1,"x0Dzx0A z") wieder eingefügt habe, hat sich kein Unterschied ergeben. Dieses normale Verhalten hat mich von allem am meisten überrascht. 10. Da a$ = SubStr$(d$,&loop+1,"x0Dzx0A z") gilt, habe ich mir kackfrech gedacht, ich könne das SubStr$(d$,&loop+1,"x0Dzx0A z") der folgenden Zeile mit a$ ersetzen -- wie es ursprünglich auch gedacht war. Irrtum! Mache ich dies, so lautet der erste Eintrag wieder "Aaahen" statt "Aachen" und einige andere Einträge werden auch verhunzt.
PS: Darf man die GlobalAllocs eigentlich genauso verschieben wie Profan-Bereiche, also nach dem Schema Bereich# = Long&, oder benötigen jene dafür einen entsprechenden Stil? |
| | | | |
|
AntwortenThemenoptionen | 9.930 Betrachtungen |
ThemeninformationenDieses Thema hat 7 Teilnehmer: |