ListIconGadget - Mehrzeilige Einträge

Für allgemeine Fragen zur Programmierung mit PureBasic.
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

ListIconGadget - Mehrzeilige Einträge

Beitrag 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
Benutzeravatar
Gerhard
Beiträge: 37
Registriert: 29.09.2004 23:44
Wohnort: Zedtwitz

Beitrag 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
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

Beitrag 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
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag 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
enjoy life... while you can!
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

Beitrag 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
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten