GadgetList Spaltenbreite ändern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

GadgetList Spaltenbreite ändern

Beitrag von silbersurfer »

Hallo Leute,
Ich habe da mal wieder ein Problem zu meinen Projekt,
und zwar möchte ich eine Spaltenbreite vom ListGadget ändern, und diese
auf ein zweites ListGadget übertragen.

Soweit so Gut, mit Hilfe von WinApi kann ich die Spaltenbreitenänderung abfragen,
und diese Via PostEvent() meinen Programm übergeben

Code: Alles auswählen

Procedure ListCB(hWnd, Message, wParam, lParam)
	Protected *HD_NOTIFY.HD_NOTIFY
	Protected Result = CallWindowProc_(ListCB, hWnd, Message, wParam, lParam)
	Select Message
		Case #WM_NOTIFY
			*HD_NOTIFY = lParam	
			If 	*HD_NOTIFY\hdr\code = #HDN_ITEMCHANGED ; änderung auf Spaltenbreite abfragen
				MyData\Gadget=GetGadgetNr(hWnd)
				MyData\Parm01=*HD_NOTIFY\iItem
				MyData\Parm02=GetGadgetItemAttribute(GetGadgetNr(hWnd),0,#PB_ListIcon_ColumnWidth ,*HD_NOTIFY\iItem)
				PostEvent(#PB_Event_Gadget,#Pure_Commander,GetGadgetNr(hWnd),#ListHeaderSpaltennBreite)
				
			EndIf 	
	EndSelect
	ProcedureReturn Result
EndProcedure
wenn ich nun die Änderung auf das zweite ListGadget übertragen will gibt es das Problem, das diese auch einen Event für Veränderung der Spaltenbreite sendet,
was zur einer EndlosEventschleife führt sobald das übergeben auf beiden ListGadget ausgeführt wird.
Ich hoffe das war verständlich beschrieben

hierzu ein laufähiger Code

Code: Alles auswählen

EnableExplicit
; Import für auffinden der GadgetNr aus einer GadgetID
Import ""
  PB_Object_EnumerateStart(*object)
  PB_Object_EnumerateNext(*object,*id.Integer)
  PB_Object_EnumerateAbort(*object)
  PB_Gadget_Objects.i
EndImport

Structure MyData
	Gadget.i
	Parm01.l
	Parm02.l
EndStructure	

Enumeration ; hauptfenster 
	#Pure_Commander
	#List01
	#List02
EndEnumeration	
Enumeration #PB_EventType_FirstCustomValue
	#ListHeaderSpaltennBreite
EndEnumeration	

Global MyData.MyData,ListCB

;gibt die GadgetID zurück
Procedure GetGadgetNr(hWnd.i)
	Protected id
	PB_Object_EnumerateStart(PB_Gadget_Objects)
	While PB_Object_EnumerateNext(PB_Gadget_Objects, @id)
		If hWnd = GadgetID(id)
			PB_Object_EnumerateAbort(PB_Gadget_Objects)
			ProcedureReturn id
		EndIf
	Wend
	ProcedureReturn -1
EndProcedure
;callback für Listenbreite
Procedure ListCB(hWnd, Message, wParam, lParam)
	Protected *HD_NOTIFY.HD_NOTIFY
	Protected Result = CallWindowProc_(ListCB, hWnd, Message, wParam, lParam)
	Select Message
		Case #WM_NOTIFY
			*HD_NOTIFY = lParam	
			If 	*HD_NOTIFY\hdr\code = #HDN_ITEMCHANGED ; änderung auf Spaltenbreite abfragen
				MyData\Gadget=GetGadgetNr(hWnd)
				MyData\Parm01=*HD_NOTIFY\iItem
				MyData\Parm02=GetGadgetItemAttribute(GetGadgetNr(hWnd),0,#PB_ListIcon_ColumnWidth ,*HD_NOTIFY\iItem)
				PostEvent(#PB_Event_Gadget,#Pure_Commander,GetGadgetNr(hWnd),#ListHeaderSpaltennBreite)
				
			EndIf 	
	EndSelect
	ProcedureReturn Result
EndProcedure

If OpenWindow(#Pure_Commander,0,0,640,400,"ListIcon Demo",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	ListIconGadget(#List01, 10, 0, 300,300, "Spalte01", 100 , #PB_ListIcon_FullRowSelect )
	AddGadgetColumn(#List01,1,"Spalte02",100)
	AddGadgetColumn(#List01,2,"Spalte03",100)
	ListIconGadget(#List02, 320, 0, 300,300, "Spalte01", 100 , #PB_ListIcon_FullRowSelect )
	AddGadgetColumn(#List02,1,"Spalte02",100)
	AddGadgetColumn(#List02,2,"Spalte03",100)	
EndIf 
;starten des Callbacks für jedes ListGadget
ListCB = SetWindowLongPtr_(GadgetID(#List01), #GWL_WNDPROC, @ListCB())
ListCB = SetWindowLongPtr_(GadgetID(#List02), #GWL_WNDPROC, @ListCB())

Repeat
	Define event	=	WaitWindowEvent()
	Select  event 
		Case #PB_Event_CloseWindow
			Define exit=#True
		Case #PB_Event_Gadget	
			Select EventGadget()
				Case #List01 ; ListGadget 1
					Select EventType()
						Case #ListHeaderSpaltennBreite	
							Debug "Event List01 Spaltenbreite"
							Debug "ListGadget 1 ist GadgetNr="+Str(MyData\Gadget)
							Debug "SpaltenNr die verändert wird="+Str(MyData\Parm01)
							Debug "Größe der Spaltenbreite="+Str(MyData\Parm02)
							SetGadgetItemAttribute(#List02,0,#PB_Explorer_ColumnWidth,MyData\Parm02,MyData\Parm01)
					EndSelect		
				Case #List02 ;ListGadget 2
					Select EventType()
						Case #ListHeaderSpaltennBreite
							Debug "Event List02 Spaltenbreite"
							Debug "ListGadget 2 ist GadgetNr="+Str(MyData\Gadget)
							Debug "SpaltenNr die verändert wird="+Str(MyData\Parm01)
							Debug "Größe der Spaltenbreite="+Str(MyData\Parm02)	
							;SetGadgetItemAttribute(#List01,0,#PB_Explorer_ColumnWidth,MyData\Parm02,MyData\Parm01)
					EndSelect						
			EndSelect		
	EndSelect		
Until exit=#True
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Re: GadgetList Spaltenbreite ändern

Beitrag von andi256 »

Code: Alles auswählen

EnableExplicit
Define i.i, quit.i

#Window = 0
Enumeration
 #List01 
 #List02
EndEnumeration

OpenWindow(#Window,500,500,640,310,"TEST",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
 ListIconGadget (#List01,10, 0, 300,300, "Spalte01",98 , #PB_ListIcon_GridLines  )
 AddGadgetColumn(#List01, 1,             "Spalte02",98)
 AddGadgetColumn(#List01, 2,             "Spalte03",98)
 
 ListIconGadget (#List02,320, 0, 300,300, "Spalte01",98 , #PB_ListIcon_GridLines  )
 AddGadgetColumn(#List02, 1,              "Spalte02",98)
 AddGadgetColumn(#List02, 2,              "Spalte03",98)

For i = 1 To 15
 AddGadgetItem(#List01,-1, "Item 1"+Chr(10)+"Item 2"+Chr(10)+"Item 3")
 AddGadgetItem(#List02,-1, "Item 1"+Chr(10)+"Item 2"+Chr(10)+"Item 3")
Next

Procedure resize()
 Protected OrigW.i,OrigH.i,breite.i
 OrigW=WindowWidth (#Window) 
 OrigH=WindowHeight(#Window) 
 
 ResizeGadget(#List01,      #PB_Ignore,#PB_Ignore,    OrigW/2-20 ,     OrigH-10)
 breite = (OrigW-20) / 6 - 4
 SendMessage_(GadgetID(#List01), #LVM_SETCOLUMNWIDTH, 0, breite)
 SendMessage_(GadgetID(#List01), #LVM_SETCOLUMNWIDTH, 1, breite)
 SendMessage_(GadgetID(#List01), #LVM_SETCOLUMNWIDTH, 2, breite)
 
 ResizeGadget(#List02,      OrigW/2 ,#PB_Ignore,     OrigW/2-20 ,     OrigH-10)
 breite = (OrigW-20) / 6 - 4
 SendMessage_(GadgetID(#List02), #LVM_SETCOLUMNWIDTH, 0, breite)
 SendMessage_(GadgetID(#List02), #LVM_SETCOLUMNWIDTH, 1, breite)
 SendMessage_(GadgetID(#List02), #LVM_SETCOLUMNWIDTH, 2, breite)
EndProcedure

Repeat
 Select WindowEvent()
  Case 0 
   Delay(1)
  Case #PB_Event_CloseWindow
   quit = #True
  Case #PB_Event_SizeWindow  
   resize()
 EndSelect
Until quit = #True
Vielleicht hilft der Code

mfg
Andi
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: GadgetList Spaltenbreite ändern

Beitrag von silbersurfer »

@andi256
Vielleicht hilft der Code
Leider nicht Andi, der SendMessage Befehl hat die selbe Eigenschaft (führt auch ein event aus)
zudem möchte ich ja eine direkte Spaltenveränderung abfragen und übergeben
eine möglichkeit habe ich wenn ich MausUp abfrage, aber das ist unschön da die #WM_LBUTTONUP
nicht Offiziell unterstützt wird.

Code: Alles auswählen

	If MausUp
		If IsGadget(MyData\Gadget)
			If MyData\Gadget=#List01
				SetGadgetItemAttribute(#List02,0,#PB_Explorer_ColumnWidth,MyData\Parm02,MyData\Parm01)
			ElseIf MyData\Gadget=#List02
				SetGadgetItemAttribute(#List01,0,#PB_Explorer_ColumnWidth,MyData\Parm02,MyData\Parm01)
			EndIf 
			MyData\Gadget=-1
		EndIf 
		MausUp=0
		Debug "MausUp"
	EndIf 	
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: GadgetList Spaltenbreite ändern

Beitrag von RSBasic »

Um das Problem zu beheben, musst du nur abfragen, ob du innerhalb des jeweiligen Gadgets bist. Wenn du mit deiner Maus im ersten ListIconGadget bist, dann soll der Code danach nicht für ListIconGadget 2 ausgeführt werden.
Kleines Beispiel, welches du ja auf deinen Code übertragen kannst:

Code: Alles auswählen

EnableExplicit

Global ListCB

Procedure ListCB(hWnd, Message, wParam, lParam)
  Protected RECT.RECT
  Protected POINT.POINT
  Protected *HD_NOTIFY.HD_NOTIFY
  Protected Result = CallWindowProc_(ListCB, hWnd, Message, wParam, lParam)
 
  Select Message
    Case #WM_NOTIFY
      *HD_NOTIFY = lParam
      If *HD_NOTIFY\hdr\code = #HDN_ITEMCHANGED
        If hWnd = GadgetID(1)
          GetWindowRect_(GadgetID(1), RECT)
          GetCursorPos_(POINT)
          If PtInRect_(RECT, POINT\y << 32 + POINT\x) = 1
            SetGadgetItemAttribute(2, 0, #PB_ListIcon_ColumnWidth, GetGadgetItemAttribute(1, 0, #PB_ListIcon_ColumnWidth, *HD_NOTIFY\iItem), *HD_NOTIFY\iItem)
          EndIf
        ElseIf hWnd = GadgetID(2)
          GetWindowRect_(GadgetID(2), RECT)
          GetCursorPos_(POINT)
          If PtInRect_(RECT, POINT\y << 32 + POINT\x) = 1
            SetGadgetItemAttribute(1, 0, #PB_ListIcon_ColumnWidth, GetGadgetItemAttribute(2, 0, #PB_ListIcon_ColumnWidth, *HD_NOTIFY\iItem), *HD_NOTIFY\iItem)
          EndIf
        EndIf
      EndIf
  EndSelect
 
  ProcedureReturn Result
EndProcedure

If OpenWindow(0, 0, 0, 800, 600, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1, 0, 0, 400, 600, "Spalte 1", 100, 0)
  AddGadgetColumn(1, 1, "Spalte 2", 100)
  AddGadgetColumn(1, 2, "Spalte 3", 100)
 
  ListIconGadget(2, 400, 0, 400, 600, "Spalte 1", 100, 0)
  AddGadgetColumn(2, 1, "Spalte 2", 100)
  AddGadgetColumn(2, 2, "Spalte 3", 100)
 
  ListCB = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @ListCB())
  ListCB = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @ListCB())
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: GadgetList Spaltenbreite ändern

Beitrag von RSBasic »

Ich habe den Code angepasst, da ich vorhin nur die erste Spalte genommen habe. Jetzt werden alle Spalten abgefragt.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: GadgetList Spaltenbreite ändern

Beitrag von silbersurfer »

@RSBasic
Um das Problem zu beheben, musst du nur abfragen, ob du innerhalb des jeweiligen Gadgets bist.
Super Code RSBasic, da sieht man mal wieder das du der WinApi mächtig bist.

Danke :praise: :praise:
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: GadgetList Spaltenbreite ändern

Beitrag von RSBasic »

Der Code, den ich aber oben rasch zusammen geschrieben habe, ist aber nicht perfekt und sauber. Auf PostEvent usw. habe ich verzichtet, um dir eine schnelle Lösung zu geben. Aber den Code kannst du ja in deinem Projekt besser strukturieren.
Freut mich, dass ich dir helfen konnte.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten