ListIconGadget - Mehrzeilige Einträge
ListIconGadget - Mehrzeilige Einträge
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
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
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
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
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
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
Hi,
also ich weiß nicht so genau was dein Problem ist, aber das ist ein Beispiel mit mehreren Zeilen:
mfG
Basti
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
Basti
enjoy life... while you can!
- 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:
Christian fragt sicherlich danach, ob er auch mehrzeilige Einträge in einem ListIcon verwenden kann.
So sieht dies aus:
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.
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
---------------------------------------------
Ich habe so etwas allerdings auch noch nicht gesehen und bezweifle daher mal fast, dass dies von Windows unterstützt wird.
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Ich habs mal gesehen, dass es geht, nur nichtmehr wo.
Sowas könnte eine Lösung sein:
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.
@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
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
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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.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
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.
- 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:
Nachdem Christian seine weiteren Fragen auf das englische Forum verlegt hat, will ich hier mal wenigstens das erfreuliche (Zwischen-) Ergebnis zeigen:
Dabei handelt es sich um den letzten Stand, nur geringfügig von mir angepasst. 
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
