ListView Darstellungsproblem unter Windows XP

  • Hallo Zusammen

    Mein Testscript ist hier:

    [autoit]

    GUICreate("listview items", 400, 250, 100, 200)
    $listview = GUICtrlCreateListView("A ", 10, 10, 400, 150)
    GUICtrlCreateListViewItem("A" & @CRLF & "B", $listview)
    GUISetState()
    Do
    $msg = GUIGetMsg()
    Until $msg = -3
    Exit

    [/autoit]

    Führe ich das unter Windows 7 oder Windows 8 aus, sieht es einwandfrei aus.

    Unter Windows XP hingegen erhalte ich für das @CRLF Quadrate!


    Die Quadrate stören mich und sollen weg, aber wie?
    Das @CRLF löst diese aus. Aber ich benötige dieses @CRLF, damit ich im eigentlichen Programm erkenne, ob die letzte Zeile zu Ende war, oder nicht!
    Wenn sie zu Ende war, dann erstelle ich ein neues ListViewItem.

    Also, langer Rede, kurzer Sinn: Ich benötige das @CRLF im ListView String. Aber unter XP habe ich dann Darstellungsfehler. Wie lassen sich diese vermeiden?

    Gruss Veronesi

  • Wie ich umständlich zu erklären versuchte:
    Ich benötige das @CRLF für eine spätere Weiterverarbeitung.

    Ich schreibe die Daten später noch in ein File.
    Deshalb benötige ich dort noch das Return.

    Und ab Vista++ funktioniert es auch ja........

    • Offizieller Beitrag

    HI,

    habe dies gefunden:

    Spoiler anzeigen
    [autoit]

    ; by GreenCan

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

    #include <GUIConstants.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>

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

    Global $View_multiline_ToolTip = True
    Global $Baloon_ToolTip = 1 ; should be 0 or 1
    Global $Fly_Over = False
    Global $iLastItem = -1, $iLastsubitemNR = -1
    Global $hGUI_Multiline, $View_Multiline, $ColName ; Multiline cell viewer window

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

    MsgBox(0, "Demo", "Click on any cell, the cells containing multiple lines" & @CRLF & "will show a popup or ToolTip with the formatted text" & @CRLF & @CRLF & "Change '$NM_CLICK' to '$LVN_HOTTRACK'" & @CRLF & "for a fly-over effect", 10)

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

    $GUI = GUICreate("Listview with Pop-up for multiline cells")

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

    $hListView = GUICtrlCreateListView("Title 1", 10, 10, 380, 350, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))

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

    ; fill with example data
    ; Add columns
    _GUICtrlListView_AddColumn($hListView, "Title 2", 100)
    _GUICtrlListView_AddColumn($hListView, "Title 3", 150)

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

    ; Add some rows
    _GUICtrlListView_AddItem($hListView, "A1", 0)
    _GUICtrlListView_AddSubItem($hListView, 0, "A2" & @CRLF & "Example of multiline text", 1)
    _GUICtrlListView_AddSubItem($hListView, 0, "A3" & @CRLF & "Example of multiline text" & @CRLF & "3rd line", 2)

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

    _GUICtrlListView_AddItem($hListView, "B1", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "B2" & @CRLF & "Line 2" & @CRLF & "Line 3" & @CRLF & "Line 4", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "B3", 2)

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

    _GUICtrlListView_AddItem($hListView, "C1")
    _GUICtrlListView_AddSubItem($hListView, 2, "C2" & @CRLF & "Another multiline text", 1)
    _GUICtrlListView_AddSubItem($hListView, 2, "C3" & @CRLF & "Another Example of multiline text", 2)
    ; done

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

    ; configuration settings
    $multiline_ToolTip = GUICtrlCreateCheckbox("Tooltip", 10, 365, 70)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
    If $View_multiline_ToolTip = True Then
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlSetTip($multiline_ToolTip, "Checked, Tooltip will be shown")
    Else
    GUICtrlSetTip($multiline_ToolTip, "Unchecked, Pop-Up will be shown")
    EndIf

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

    $Baloon_Tip = GUICtrlCreateCheckbox("Baloon", 80, 365, 70)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
    If $Baloon_ToolTip = 1 Then
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlSetTip($Baloon_Tip, "Checked, Display as Balloon Tip Requires IE5+")
    Else
    GUICtrlSetTip($Baloon_Tip, "Unchecked, Normal Tooltip")
    EndIf

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

    $FlyOver = GUICtrlCreateCheckbox("Fly-Over effect", 150, 365, 100)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
    If $Fly_Over = True Then
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlSetTip($FlyOver, "Checked, Fly-Over effect ")
    Else
    GUICtrlSetTip($FlyOver, "Unchecked, Click on Cell")
    EndIf

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

    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ToolTip("") ; clean remaining ToolTip from WM_NOTIFY if necessary
    GUIDelete($GUI)
    Exit

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

    Case $msg = $multiline_ToolTip
    If $View_multiline_ToolTip = True Then
    $View_multiline_ToolTip = False
    GUICtrlSetTip($multiline_ToolTip, "Unchecked, Pop-Up will be shown")
    ToolTip("") ; clean remaining ToolTip from WM_NOTIFY if necessary
    Else
    $View_multiline_ToolTip = True
    GUICtrlSetTip($multiline_ToolTip, "Checked, Tooltip will be shown")
    View_MultilineCell("") ; clean remaining Pop-up from WM_NOTIFY if necessary
    EndIf

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

    Case $msg = $Baloon_Tip
    If $Baloon_ToolTip = 1 Then
    $Baloon_ToolTip = 0
    GUICtrlSetTip($Baloon_Tip, "Unchecked, Normal Tooltip")
    Else
    $Baloon_ToolTip = 1
    GUICtrlSetTip($Baloon_Tip, "Checked, Display as Balloon Tip Requires IE5+")
    EndIf

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

    Case $msg = $FlyOver
    If $Fly_Over = True Then
    $Fly_Over = False
    GUICtrlSetTip($FlyOver, "Unchecked, Click on Cell")
    Else
    $Fly_Over = True
    GUICtrlSetTip($FlyOver, "Checked, Fly-Over effect ")
    EndIf

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

    EndSelect
    WEnd
    #FUNCTION# ==============================================================
    Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

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

    Switch $hWndFrom
    Case $hWndListView
    If $Fly_Over = False Then
    Switch $iCode
    Case $NM_CLICK ; when clicking on a cell that is multiline, a tooltip will display the content

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

    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
    Local $iItem = DllStructGetData($tInfo, "Item")
    Local $subitemNR = DllStructGetData($tInfo, "SubItem")
    $Column_attribute = _GUICtrlListView_GetColumn($hListView, $subitemNR)
    ; if no cell change return without doing anything
    If $iLastItem = $iItem And $iLastsubitemNR = $subitemNR Then Return 0
    $iLastItem = $iItem
    $iLastsubitemNR = $subitemNR

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

    Local $sToolTipData = _GUICtrlListView_GetItemText($hListView, $iItem, $subitemNR)
    $Mypos = StringInStr($sToolTipData, @CRLF)
    If $Mypos > 0 Then
    If $View_multiline_ToolTip = True Then
    ToolTip($sToolTipData, MouseGetPos(0) + 20, MouseGetPos(1) + 20, "", 0, $Baloon_ToolTip)
    Else
    View_MultilineCell($sToolTipData, $Column_attribute[5] & " Row " & $iItem + 1)
    EndIf
    Else
    If $View_multiline_ToolTip = True Then
    ToolTip("")
    Else
    View_MultilineCell("")
    EndIf
    ;ConsoleWrite("R" & $iItem & "C" & $subitemNR & " No tip" & @CR)
    EndIf
    EndSwitch
    Else
    Switch $iCode
    Case $Fly_Over = True And $LVN_HOTTRACK; Sent by a list-view control when the user moves the mouse over an item
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
    Local $iItem = DllStructGetData($tInfo, "Item")
    Local $subitemNR = DllStructGetData($tInfo, "SubItem")
    $Column_attribute = _GUICtrlListView_GetColumn($hListView, $subitemNR)
    ; if no cell change return without doing anything
    If $iLastItem = $iItem And $iLastsubitemNR = $subitemNR Then Return 0
    $iLastItem = $iItem
    $iLastsubitemNR = $subitemNR

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

    Local $sToolTipData = _GUICtrlListView_GetItemText($hListView, $iItem, $subitemNR)
    $Mypos = StringInStr($sToolTipData, @CRLF)
    If $Mypos > 0 Then
    If $View_multiline_ToolTip = True Then
    ToolTip($sToolTipData, MouseGetPos(0) + 20, MouseGetPos(1) + 20, "", 0, $Baloon_ToolTip)
    Else
    View_MultilineCell($sToolTipData, $Column_attribute[5] & " Row " & $iItem + 1)
    EndIf
    Else
    If $View_multiline_ToolTip = True Then
    ToolTip("")
    Else
    View_MultilineCell("")
    EndIf
    ;ConsoleWrite("R" & $iItem & "C" & $subitemNR & " No tip" & @CR)
    EndIf
    EndSwitch
    EndIf
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY
    #FUNCTION# ==============================================================
    Func View_MultilineCell($Cell_content, $Column_name = "")
    Local $Msg2

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

    If $Cell_content = "" Then
    ; clicked on nonmultiline cell, so close the window
    $window_open = WinList("Cell Content")
    If $window_open[0][0] > 0 Then GUIDelete($hGUI_Multiline)
    Return
    Else
    $window_open = WinList("Cell Content") ; check if window already exists
    If $window_open[0][0] = 0 Then
    ; if the window does not exist yet, create it
    Local $window_width = 300
    Local $window_heigth = 300
    $hGUI_Multiline = GUICreate("Cell Content", $window_width, $window_heigth, 1, 1, ($WS_POPUPWINDOW), $WS_EX_TOPMOST, $GUI)
    $ColName = GUICtrlCreateLabel("Content of " & $Column_name, 10, 2, $window_width)
    $View_Multiline = GUICtrlCreateEdit($Cell_content, 5, 20, $window_width - 10, $window_heigth - 40, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKBOTTOM)
    GUICtrlSetColor(-1, 0x2601D3)
    GUICtrlSetBkColor(-1, 0xEAFFE8)
    GUICtrlCreateLabel("Click on any non-multiline cell to hide this pop-up", 35, $window_heigth - 15, $window_width)
    GUICtrlSetFont(-1, 7, 400)
    Else
    ; window already exist so only change the content
    GUICtrlSetData($ColName, "Content of " & $Column_name) ; column title
    GUICtrlSetData($View_Multiline, $Cell_content) ; cell content
    EndIf
    GUISetState()
    Return

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

    EndIf
    EndFunc ;==>View_MultilineCell
    ;~ #FUNCTION# ==============================================================

    [/autoit]

    Ansonsten ersetzen und danach zurückübersetzen.

  • Hallo!

    Leider hat auch diese Variante diesen Fehler unter XP.

    Das mit Ersetzen ist etwas schwierig. Da ich in der Lage sein sollte, alle nur denkbaren (auch nicht druckbare) Zeichen zu speichern.
    Gespeichert wird sowieso im Binary Modus.

    Aber mit welchem Zeichen kann ich das ersetzen, damit ich mir meinen "Zeichnsatz" nicht einschränke?

  • Ja, es ist "nur" ein Darstellungsproblem.
    Ich "brauche" das Listview, weil ich zeilenweise Daten für die Darstellung einfärben muss.
    Klar, ginge das auch mit einem RichEdit, aber ich muss auch noch verschiedene Icons in der ersten Spalte darstellen.
    Alles in allem ist das Listview deshalb einfacher.

    Aber richtig, es ist "nur" ein optisches Problem. Der Kunde möchte das aber irgendwie weg haben....
    Ich suche mal noch etwas.

    Danke trotzdem!

  • Leider nicht.
    Der Kunde hat genaue Vorstellungen, wann die Zeile umgebrochen werden darf, und wann nicht.
    Alles leider etwas komplizierter.

    Aber mal sehen. Vielleicht lässt sich mit Ersetzen doch etwas machen.

    Ich schaue mir das nächste Woche nochmals an.
    Danke für die Inputs!

  • Speicher doch einfach die ListView in einem Array.
    Dann füllst du diese mit den Werten aus dem Array, und löscht jeweils das @CRLF beim hereinzuschreibenden String.

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D