Deutsch
Forum

Erledigt: Unicode: Seltsames Verhalten

 

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
b# = LVI#.iText&
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
 
Nico Madysa
10.07.2009  
 




Frank
Abbing
Ich würde sagen, das Problem sind die Strings. Unicode-Strings benutzen als Endekennung doch zwei Nullbytes, Profan eines.
 
10.07.2009  
 




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: [...] 

275 kB
Hochgeladen:10.07.2009
Ladeanzahl64
Herunterladen
 
Gruß Thomas
Windows XP SP2, XProfan X2
10.07.2009  
 



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.
 
10.07.2009  
 




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?
 
Nico Madysa
11.07.2009  
 



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.
 
11.07.2009  
 




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.
 
Nico Madysa
11.07.2009  
 




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.
 
11.07.2009  
 




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
aus
ss$ = SubStr$(s$,&loop,d$)
wurde
ss$ = SubStr$(s$,&loop,d$) + zz

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.
 
Nico Madysa
12.07.2009  
 



Du solltest vielleicht einfach für die Speicher, die Du für Stringinhalte nutzt und an Apis übergibst, nicht XProfan-Strings verwenden.
KompilierenMarkierenSeparieren
 
12.07.2009  
 




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?
 
Nico Madysa
12.07.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

10.001 Betrachtungen

Unbenanntvor 0 min.
Sven Bader25.02.2021
Manfred Barei23.02.2020
gerd05.10.2013
Christian Hahn28.12.2012
Mehr...

Themeninformationen



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