Seite 1 von 2

ListIconGadget - Mehrzeilige Einträge

Verfasst: 27.11.2004 12:50
von Christian
Hallo,

ich habe ein ListIconGadget, dessen Einträge ja immer nur einzeilige sind. Die Verwendung von "Chr(13)+Chr(10)" funktioniert leider nicht, um in einem Eintrag eine zweite Zeile zu eröffnen.
Kennt jemand eine Möglichkeit um mehrzeilige Einträge in einem ListIconGadget zu erstellen?

Danke schonmal!

Gruß
Christian

Verfasst: 27.11.2004 17:43
von Gerhard
Hallo Christian,
das Zeichen chr(13) brauchst Du beim ListIconGadget() nicht!
Wenn man eine Zeile mit mehreren Spalten (Zellen oder Feldern) hat,
dann muss man einfach nur 1.Spalte$+chr(10)+2.Spalte$+chr(10)+....
für diese eine Zeile angeben.

Wenn man eine neue Zeile hinzufügen möchte, dann muss man den
Befehl AddGadgetItem(#Gadget, Position, Text$ [, ImageID]) erneut
anwenden. Dann wird jedesmal automatisch eine neue Zeile angelegt. OK?

Gruss Gerhard

Verfasst: 27.11.2004 18:36
von Christian
Hallo Gerhard,

ersteinmal Danke für die Antwort, aber das ist leider nicht die Lösung für mein Problem. Ich möchte nicht Text in mehrere Spalten schreiben, wie das geht weiß ich, sondern ich möchte einen Eintrag mit mehreren Zeilen erzeugen. Also so:

1. Spalte
1. Eintrag Zeile 1
1. Eintrag Zeile 2
2. Eintrag Zeile 1
2. Eintrag Zeile 2

Hoffe nun ist klarer, was ich meine!

Gruß
Christian

Verfasst: 27.11.2004 21:44
von sbehrens
Hi,
also ich weiß nicht so genau was dein Problem ist, aber das ist ein Beispiel mit mehreren Zeilen:

Code: Alles auswählen

hWnd=OpenWindow(1,0,0,250,250,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"test")
  CreateGadgetList(hWnd)
    ListIconGadget(1,5,5,240,240,"test1",118)
      AddGadgetColumn(1,1,"test2",118)
  
  AddGadgetItem(1,0,"1.1"+Chr(10)+"1.2")
  AddGadgetItem(1,1,"2.1"+Chr(10)+"2.2")
  AddGadgetItem(1,2,"3.1"+Chr(10)+"3.2")
  
Repeat
 Delay(10)
Until WindowEvent()=#PB_Event_CloseWindow
mfG
Basti

Verfasst: 27.11.2004 22:40
von Andre
Christian fragt sicherlich danach, ob er auch mehrzeilige Einträge in einem ListIcon verwenden kann.

So sieht dies aus:

Code: Alles auswählen

---------------------------------------------
Eintrag1 - hat nur eine Zeile
---------------------------------------------
Eintrag2 - hat mehrere Zeilen
 ....... 2. Zeile von Eintrag2
 ....... 3. Zeile von Eintrag2
---------------------------------------------
Eintrag3 - wieder nur eine Zeile
---------------------------------------------
Damit wird das Anliegen wohl deutlicher.

Ich habe so etwas allerdings auch noch nicht gesehen und bezweifle daher mal fast, dass dies von Windows unterstützt wird.

Verfasst: 28.11.2004 09:49
von DarkDragon
Ich habs mal gesehen, dass es geht, nur nichtmehr wo.
Sowas könnte eine Lösung sein:

Code: Alles auswählen

hWnd=OpenWindow(1,0,0,250,250,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"test")
  CreateGadgetList(hWnd)
    ListIconGadget(1,5,5,240,240,"test1",118)
      AddGadgetColumn(1,1,"test2",118)
 
  AddGadgetItem(1,0,"1.1"+Chr(10)+"Blubb Blu")
  AddGadgetItem(1,1,""+Chr(10)+"bb Blubbel")
  AddGadgetItem(1,2,""+Chr(10)+"dibubb")
 
Repeat
 Delay(10)
Until WindowEvent()=#PB_Event_CloseWindow

Verfasst: 28.11.2004 12:46
von Christian
@Andre:
Das ist es was ich meinte! :)
Klingt allerdings nicht gut, dass es sein könnte, dass dies von Windows nicht unterstützt wird.

@Darkdragon:
Die Idee hatte ich auch schon und optisch sieht es ja ... (zumindest ohne GridLines) erstmal so aus, wie ein mehrzeiliger Eintrag, aber beim Klick auf eine dieser Reihen selektiert dann leider auch nur einen Eintrag und nicht alle.
Habe auch versucht mit MultiSelection einfach alle Einträge auf ausgewählt zu setzen, sobald einer der Einträge angeklickt wird, aber das gibt eine unschöne zeitverzögerung, sodass man sieht, dass jeder Eintrag nacheinander ausgewählt wird.

Sollte jemand doch noch eine Möglichkeit kennen um echte mehrzeilige Einträge zu erstellen, wäre ich sehr dankbar dafür, wenn er mir helfen könnte!

Gruß
Christian

Verfasst: 28.11.2004 13:07
von DarkDragon
Christian hat geschrieben:@Darkdragon:
Die Idee hatte ich auch schon und optisch sieht es ja ... (zumindest ohne GridLines) erstmal so aus, wie ein mehrzeiliger Eintrag, aber beim Klick auf eine dieser Reihen selektiert dann leider auch nur einen Eintrag und nicht alle.
Habe auch versucht mit MultiSelection einfach alle Einträge auf ausgewählt zu setzen, sobald einer der Einträge angeklickt wird, aber das gibt eine unschöne zeitverzögerung, sodass man sieht, dass jeder Eintrag nacheinander ausgewählt wird.

Sollte jemand doch noch eine Möglichkeit kennen um echte mehrzeilige Einträge zu erstellen, wäre ich sehr dankbar dafür, wenn er mir helfen könnte!

Gruß
Christian
hmm... vielleicht kann man per WinAPI genau wie beim EditorGadget(EM_HIDESELECTION) die Auswahl verstecken. Kennt da jemand was? Dann kann man die während der Zeitverzögerung einfach verstecken und danach wieder zeigen, wenn alles ausgewählt ist.

Verfasst: 28.11.2004 13:09
von Christian
Müsste man schauen, aber selbst das wäre noch keine optimale Lösung, da beim Auswählen eines Eintrags neben dem erzeugten blauen Hintergund auch immer noch ein gestricheltes (oder gepunktetes?) Kästchen um den Enitrag herum erscheint.

Gruß
Christian

Verfasst: 07.12.2004 19:57
von Andre
Nachdem Christian seine weiteren Fragen auf das englische Forum verlegt hat, will ich hier mal wenigstens das erfreuliche (Zwischen-) Ergebnis zeigen:

Code: Alles auswählen

; English forum: http://purebasic.myforums.net/viewtopic.php?t=13226&highlight=
; Author: Sparkie
; Date: 06. December 2004


; Basics for drawing a custom multiline ListIconGadget
; ****************************************************
; You can specify wordwrap for each column as necessary. 
; Here I use wordwrap in Column 0 and single line with ellipsis (...) as needed.

; Still To-Do list: 
; ------------------
; Support #PB_ListIcon_CheckBoxes 
; Support #PB_ListIcon_AlwaysShowSelection 
; Support #PB_ListIcon_MultiSelect 
; Support icons 

; --> Constants 
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56 

#DT_WORD_ELLIPSIS = $40000 
#DT_END_ELLIPSIS = $8000 
#DT_PATH_ELLIPSIS = $4000 
#DT_MODIFYSTRING = $10000 

#CDIS_CHECKED = 8 
#CDIS_DEFAULT = $20 
#CDIS_DISABLED = 4 
#CDIS_FOCUS = $10 
#CDIS_GRAYED = 2 
#CDIS_HOT = $40 
#CDIS_INDETERMINATE = $100 
#CDIS_MARKED = $80 
#CDIS_SELECTED = 1 
#CDIS_SHOWKEYBOARDCUES = $200 

#CDDS_ITEM = $10000 
#CDDS_MAPPART = 5 
#CDDS_POSTERASE = 4 
#CDDS_POSTPAINT = 2 
#CDDS_PREERASE = 3 
#CDDS_PREPAINT = 1 
#CDDS_ITEMPOSTERASE = #CDDS_ITEM | #CDDS_POSTERASE 
#CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT 
#CDDS_ITEMPREERASE = #CDDS_ITEM | #CDDS_PREERASE 
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT 
#CDDS_SUBITEM = $20000 

#CDRF_DODEFAULT = 0 
#CDRF_NEWFONT = 2 
#CDRF_NOTIFYITEMDRAW = $20 
#CDRF_NOTIFYPOSTERASE = $40 
#CDRF_NOTIFYPOSTPAINT = $10 
#CDRF_NOTIFYSUBITEMDRAW = $20 
#CDRF_SKIPDEFAULT = 4 

; --> Create assorted brushes for passing on to device context 
Dim brush(4) 

Enumeration 
  #C0Brush 
  #C1Brush 
  #C2Brush 
  #SelectedBrush 
EndEnumeration 

brush(#C0Brush) = CreateSolidBrush_(RGB(255, 155, 155))       ; column 0 brush 
brush(#C1Brush) = CreateSolidBrush_(RGB(155, 255, 155))       ; column 1 brush 
brush(#C2Brush) = CreateSolidBrush_(RGB(155, 155, 255))       ; column 2 brush 
brush(#SelectedBrush) = CreateSolidBrush_(RGB(255, 255, 155)) ; selected row brush 

; --> Windowcallback 
Procedure myWindowCallback(hwnd, msg, wparam, lparam) 
  result = #PB_ProcessPureBasicEvents 
  Select msg 
     Case #WM_NOTIFY 
      *nmhdr.NMHEADER = lparam 
      ; --> Lock column 0 width 
      If *nmhdr\hdr\code = #HDN_ITEMCHANGING  And *nmhdr\iItem = 0 
        result = #True 
      EndIf 
      *lvCD.NMLVCUSTOMDRAW = lparam 
      If *lvCD\nmcd\hdr\hwndFrom=GadgetID(0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW    
        Select *lvCD\nmcd\dwDrawStage 
          Case #CDDS_PREPAINT 
            result = #CDRF_NOTIFYITEMDRAW 
          Case #CDDS_ITEMPREPAINT 
            result = #CDRF_NOTIFYSUBITEMDRAW; 
          Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM 
            thisItem = *lvCD\nmcd\dwItemSpec 
            ; --> Define rect for text 
            subItemRect.RECT\left = #LVIR_LABEL 
            subItemRect.RECT\top = *lvCD\iSubItem 
            ; --> Get the subitem rect 
            SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, thisItem, @subItemRect) 
            subItemText$ = GetGadgetItemText(0, *lvCD\nmcd\dwItemSpec, *lvCD\iSubItem) 
            sitLen = Len(subItemText$) 
            Select *lvCD\iSubItem 
              Case 0 
                ; --> Define text and background colors for column 0 and set Drawtext_() flags 
                lvFlags =  #DT_END_ELLIPSIS | #DT_WORDBREAK;| #DT_MODIFYSTRING 
                ; --> Paint over unused icon rect 
                subItemRect\left = 0 
                If GetGadgetState(0) = thisItem 
                  ; --> If item is selected, colorize column 0 
                  FillRect_(*lvCD\nmcd\hDC, subItemRect, brush(#SelectedBrush)) 
                Else 
                  ; --> If item is not selected, colorize column 0 
                  FillRect_(*lvCD\nmcd\hDC, subItemRect, brush(#C0Brush)) 
                EndIf 
              ; --> Text color for column 0 
              SetTextColor_(*lvCD\nmcd\hDC, RGB(100, 0, 0)) 
              Case 1 
                ; --> Define text and background colors for column 1 and set Drawtext_() flags 
                lvFlags = #DT_END_ELLIPSIS | #DT_SINGLELINE | #DT_VCENTER 
                If GetGadgetState(0) = thisItem 
                  ; --> If item is selected, colorize column 1 
                  FillRect_(*lvCD\nmcd\hDC, subItemRect, brush(#SelectedBrush)) 
                Else 
                  ; --> If item is not selected, colorize column 1 
                  FillRect_(*lvCD\nmcd\hDC, subItemRect, brush(#C1Brush)) 
                EndIf 
                ; --> Text color for column 1 
                SetTextColor_(*lvCD\nmcd\hDC, RGB(0, 100, 0)) 
              Case 2 
                ; --> Define text and background colors for column 2 and set Drawtext_() flags 
                lvFlags = #DT_END_ELLIPSIS | #DT_SINGLELINE | #DT_VCENTER 
                If GetGadgetState(0) = thisItem 
                  ; --> If item is selected, colorize column x 
                  FillRect_(*lvCD\nmcd\hDC, subItemRect, brush(#SelectedBrush)) 
                Else 
                  ; --> If item is not selected, colorize column x 
                  FillRect_(*lvCD\nmcd\hDC, subItemRect, brush(#C2Brush)) 
                EndIf 
                ; --> Text color for column x 
                SetTextColor_(*lvCD\nmcd\hDC, RGB(0, 0, 100)) 
            EndSelect 
            ; --> Adjust rect for text margins 
            subItemRect\left +3 
            subItemRect\right -3 
            subItemRect\bottom -3 
            ; --> Draw our text 
            DrawText_(*lvCD\nmcd\hDC, subItemText$, sitLen, subItemRect, lvFlags) 
            result = #CDRF_SKIPDEFAULT 
        EndSelect 
      EndIf 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

If OpenWindow(0, 0, 0, 480, 260,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Sparkies Multiline ListIconGadget") And CreateGadgetList(WindowID(0)) 
  SetWindowCallback(@myWindowCallback()) 
  CreateStatusBar(0, WindowID(0)) 
  ListIconGadget(0, 10, 10, 470, 225, "Column 0", 150,#PB_ListIcon_FullRowSelect) 
  AddGadgetColumn(0, 1, "Column 1", 150) 
  AddGadgetColumn(0, 2, "Column 2", 150) 
  ; --> Create a new imagelist (1x30) to increase row hieght 
  imageList = ImageList_Create_(1, 30, #ILC_COLOR32, 0, 30) 
  SendMessage_(GadgetID(0), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList) 
  For a=0 To 9
    addtext$ = "Locked Column 0 item #" + Str(a) + Chr(13) + "on 2 lines of text." + Chr(10) + "Column 1 item #" + Str(a) + " on 1 line" + Chr(10) + "Column 2 item #" + Str(a) + " on 1 line" 
    atLen = Len(addtext$) 
    AddGadgetItem(0,-1, addtext$) 
  Next 
  Repeat 
    event = WaitWindowEvent() 
    Select event 
      Case #PB_EventGadget 
        Select EventGadgetID() 
          Case 0 
            ; --> Display selected ListIconGadget index in statusbar 
            StatusBarText(0, 0, "Selected item index is: " + Str(GetGadgetState(0))) 
        EndSelect 
    EndSelect 
  Until event = #PB_Event_CloseWindow 
EndIf 
End 
Dabei handelt es sich um den letzten Stand, nur geringfügig von mir angepasst. :wink: