Unerklärliche Herkunft von Zeichen in Listview

  • Hallo Leute,

    in meiner Listview habe ich mit folgenden Funktionen, Einträge erstellt:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Func arraysearch2()
    Global $aListe2[1]
    $iColumn = _GUICtrlListView_GetColumnCount(GUICtrlGetHandle ($Liste))
    $iRow = _GUICtrlListView_GetItemCount(GUICtrlGetHandle ($Liste))
    If $iRow > 0 Then

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $iRow - 1
    For $k = 7 To $iColumn -2
    $sItem = _GUICtrlListView_GetItemText(GUICtrlGetHandle ($Liste), $i, $k)
    For $j = 2 to 2
    $sItem2 = _GUICtrlListView_GetItemText(GUICtrlGetHandle ($Liste), $i, $j)

    [/autoit] [autoit][/autoit] [autoit]

    If $sItem <> "" Then
    $iArraySearch = _ArraySearch($aListe2, $sItem & $sItem2)
    If $iArraySearch = -1 Then
    ReDim $aListe2[UBound($aListe2) + 1][4]
    $aListe2[UBound($aListe2) - 1][0] = $sItem2
    $aListe2[UBound($aListe2) - 1][1] = 1
    $aListe2[UBound($aListe2) - 1][2] = "Stk. " & $sItem
    $aListe2[UBound($aListe2) - 1][3] = $sItem & $sItem2
    Else
    $aListe2[$iArraySearch][1] += 1
    EndIf
    EndIf
    Next
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArraySort($aListe2, 0, 0, 0, 0)
    ReDim $aListe2[UBound($aListe2)][3]
    $stanz_2 =_Array2D_ToString($aListe2,1,-1,@TAB)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func stk_hinzufuegen2()
    FileWrite(@TempDir&"\stanz.txt",$stanz_2)
    For $i = 1 To _FileCountLines(@TempDir&"\stanz.txt")
    $sText=StringStripWs (StringLeft (FileReadLine (@TempDir&"\stanz.txt",$i),4),8)
    $pasteindex = _GUICtrlListView_FindText($ListView1,$sText)

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 1 To _FileCountLines(@TempDir&"\stanz.txt")
    $sText2=StringTrimLeft(FileReadLine(@TempDir&"\stanz.txt",$i),4)
    _GUICtrlListView_SetItemText(GUICtrlGetHandle($ListView1), $pasteindex,$sText2,2)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Next
    FileDelete(@TempDir&"\stanz.txt")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; by BugFix:
    Func _Array2D_ToString(ByRef $aArray, $iStart=0, $iEnd=-1, $sDelimItem='|', $sDelimRow=@CRLF)
    If Not IsArray($aArray) Then Return SetError(1,0,'')
    Local $sOut = '', $iUbound = UBound($aArray)
    If $iStart < 0 Or $iStart > $iUbound -1 Then Return SetError(2,0,'')

    [/autoit] [autoit][/autoit] [autoit]

    If $iEnd = -1 Or $iEnd > $iUbound -1 Then $iEnd = $iUbound -1
    If $iEnd < $iStart Then Return SetError(3,0,'')
    For $i = $iStart To $iEnd
    For $j = 0 To UBound($aArray,2) -1
    $sOut &= $aArray[$i][$j] & $sDelimItem
    Next
    $sOut = StringTrimRight($sOut, StringLen($sDelimItem)) & $sDelimRow
    Next
    Return StringTrimRight($sOut, StringLen($sDelimRow))
    EndFunc ;==>_Array2D_ToString

    [/autoit]

    nun habe ich das Problem das bei Stk. (lt.Bild) diese quadratischen ASCII Zeichen kommen anstatt einer leerstelle, warum nur :?:

  • An dem kann es nicht liegen... Das Phänomen tritt auch nur bei XP Sp3 32bit auf
    unter 64bit bzw. win7 vista wird es normal dargestellt ohne diesem quadrat...

    Bin jetzt wirklich mal ratlos....

    Spoiler anzeigen
    Zitat

    Ich weiß wo dein Haus wohnt... 8o

  • Dann würde aber "Länge" im Listview auch falsch angezeigt werden. ;)

    Stimmt, klar...

    Zitat

    Könnte es vielleicht daran liegen, dass XP kein Unicode unterstützt (bin
    XP noob) ^^

    Ja könnte ich mir auch vorstellen, vielleicht mal als .exe versuchen?

  • Zitat

    Ja könnte ich mir auch vorstellen, vielleicht mal als .exe versuchen?


    Bin mir nicht sicher ob das viel bringt. Du könntest auch mal die Spracheinstellungen durchgehen...
    Bevor du dein System zerlegst solltest du vielleicht erst einmal prüfen, ob dein Script den selben Fehler bei anderen Texten macht. ^^

  • Hab nun rausgefunden an was es liegt, jedoch weiß ich mir keinen Helfer dies zu umgehen....
    ...Also:
    Grund dafür ist _

    [autoit]

    _GUICtrlListView_SetItemText()

    [/autoit]


    ich lese die daten aus einer textdatei=utf8
    meine listview ist jedoch keine unicode formatierte...
    ich setze nur die subitems neu mit o.g. Funktion. Dieser Schönheitsfehler ist nur mit Windows XP reproduzierbar...

    Vielleicht hat einer von euch einen guten Rat für mich oder auch gleich ein Beispiel....????

    Danke...
    edit: der grund dafür:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlListView_SetItemText
    ; Description ...: Changes the text of an item or subitem
    ; Syntax.........: _GUICtrlListView_SetItemText($hWnd, $iIndex, $sText[, $iSubItem = 0])
    ; Parameters ....: $hWnd - Handle to the control
    ; $iIndex - Zero based index of the item
    ; $sText - Item or subitem text
    ; $iSubItem - One based index of the subitem or 0 to set the item
    ; Return values .: Success - True
    ; Failure - False
    ; Author ........: Paul Campbell (PaulIA)
    ; Modified.......: Gary Frost (gafrost), added code by Ultima to set row text
    ; Remarks .......: If $iSubItem = -1 row is set
    ; Related .......: _GUICtrlListView_GetItemText, _GUICtrlListView_GetItemTextArray, _GUICtrlListView_GetItemTextString, _GUICtrlListView_InsertItem
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _GUICtrlListView_SetItemText($hWnd, $iIndex, $sText, $iSubItem = 0)
    If $Debug_LV Then __UDF_ValidateClassName($hWnd, $__LISTVIEWCONSTANT_ClassName)

    [/autoit] [autoit][/autoit] [autoit]

    Local $fUnicode = _GUICtrlListView_GetUnicodeFormat($hWnd)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iRet

    [/autoit] [autoit][/autoit] [autoit]

    If $iSubItem = -1 Then
    Local $SeparatorChar = Opt('GUIDataSeparatorChar')
    Local $i_cols = _GUICtrlListView_GetColumnCount($hWnd)
    Local $a_text = StringSplit($sText, $SeparatorChar)
    If $i_cols > $a_text[0] Then $i_cols = $a_text[0]
    For $i = 1 To $i_cols
    $iRet = _GUICtrlListView_SetItemText($hWnd, $iIndex, $a_text[$i], $i - 1)
    If Not $iRet Then ExitLoop
    Next
    Return $iRet
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $iBuffer = StringLen($sText) + 1
    Local $tBuffer
    If $fUnicode Then
    $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
    $iBuffer *= 2
    Else
    $tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]")
    EndIf
    Local $pBuffer = DllStructGetPtr($tBuffer)
    Local $tItem = DllStructCreate($tagLVITEM)
    Local $pItem = DllStructGetPtr($tItem)
    DllStructSetData($tBuffer, "Text", $sText)
    DllStructSetData($tItem, "Mask", $LVIF_TEXT)
    DllStructSetData($tItem, "item", $iIndex)
    DllStructSetData($tItem, "SubItem", $iSubItem)
    If IsHWnd($hWnd) Then
    If _WinAPI_InProcess($hWnd, $_lv_ghLastWnd) Then
    DllStructSetData($tItem, "Text", $pBuffer)
    $iRet = _SendMessage($hWnd, $LVM_SETITEMW, 0, $pItem, 0, "wparam", "ptr")
    Else
    Local $iItem = DllStructGetSize($tItem)
    Local $tMemMap
    Local $pMemory = _MemInit($hWnd, $iItem + $iBuffer, $tMemMap)
    Local $pText = $pMemory + $iItem
    DllStructSetData($tItem, "Text", $pText)
    _MemWrite($tMemMap, $pItem, $pMemory, $iItem)
    _MemWrite($tMemMap, $pBuffer, $pText, $iBuffer)
    If $fUnicode Then
    $iRet = _SendMessage($hWnd, $LVM_SETITEMW, 0, $pMemory, 0, "wparam", "ptr")
    Else
    $iRet = _SendMessage($hWnd, $LVM_SETITEMA, 0, $pMemory, 0, "wparam", "ptr")
    EndIf
    _MemFree($tMemMap)
    EndIf
    Else
    DllStructSetData($tItem, "Text", $pBuffer)
    If $fUnicode Then
    $iRet = GUICtrlSendMsg($hWnd, $LVM_SETITEMW, 0, $pItem)
    Else
    $iRet = GUICtrlSendMsg($hWnd, $LVM_SETITEMA, 0, $pItem)
    EndIf
    EndIf
    Return $iRet <> 0
    EndFunc ;==>_GUICtrlListView_SetItemText

    [/autoit]
    Spoiler anzeigen
    Zitat

    Ich weiß wo dein Haus wohnt... 8o

    Einmal editiert, zuletzt von stinger2k (1. Mai 2010 um 18:04)

  • Setzt erst mal deine Listview auf Unicode ;) (...SetUnicodeFormat)
    Dann öffne deine Datei im UTF8-Modus, damit Autoit die UTF8-Kodierung automatisch in die wchar-Kodierung umwandelt. Damit sollte alles korrekt dargestellt werden.

    Wenn noch Kästchen da sind könnten das Tabs oder Zeilenumbrüche sein (@TAB, @CR oder @LF)

  • Danke Progandy, :thumbup:
    hatte ich schon versucht, aber da ich in der ersten Spalte, Daten aus 2 anderen Listview´s setze (welche auch nicht unicode sind...) bekomme ich hierdurch nur ein umgedrehtes bild(vorige Daten werden durch Unicode ersetzt...)

    Hab´s nun trotzdem über einen kleinen Umweg (StringReplace) hingekriegt:
    Nachdem ich die Daten aus der Datei lese und bevor diese in die neue Listview eingetragen werden, ersetze ich alle Sonderzeichen (inkl. TAB etc.) und füge diese in einem neuen string wieder hinzu..

    funktioniert auch, nur wieder 8-10 Codezeilen die meiner MEinung nach nicht sein müssten.
    Trotzdem danke :thumbup:

    Spoiler anzeigen
    Zitat

    Ich weiß wo dein Haus wohnt... 8o

  • Danke Progandy, :thumbup:
    hatte ich schon versucht, aber da ich in der ersten Spalte, Daten aus 2 anderen Listview´s setze (welche auch nicht unicode sind...) bekomme ich hierdurch nur ein umgedrehtes bild(vorige Daten werden durch Unicode ersetzt...)

    Hab´s nun trotzdem über einen kleinen Umweg (StringReplace) hingekriegt:
    Nachdem ich die Daten aus der Datei lese und bevor diese in die neue Listview eingetragen werden, ersetze ich alle Sonderzeichen (inkl. TAB etc.) und füge diese in einem neuen string wieder hinzu..

    funktioniert auch, nur wieder 8-10 Codezeilen die meiner MEinung nach nicht sein müssten.
    Trotzdem danke :thumbup:


    Das kannst du mit einer Zeile ersetzen ;)

    [autoit]

    StringRegExpReplace($sString, "\v|\t|[[:cntrl:]]", "")

    [/autoit]