ListView Checkbox ermitteln ohne select der Zeile Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

ListView Checkbox ermitteln ohne select der Zeile

Post by Ahk_fan » 26 Jan 2023, 05:34

Hallo z'amme,

hat jemand eine Tip wie man die gewählte Checkbox aus einer ListView ermittelt ohne dass die Row selektiert wurde? Wenn man einmal die Zeile selectiert hatte geht es, aber die User denken nie dran. Außerdem habe ich im GUI 5 LVs, d.h. per Select oder Focus wird es schwierig, da es unterschiedliche Einstiegsszenarien und Vorgehensweisen gibt.

Vorgehensweise Soll:
1 - keine Zeile anwählen
2 - Checkbox klicken
3 - ermitteln der jeweiligen Zeile

bsp (siehe LV 2):

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
	
	Gui, 70:Destroy
	Gui, 70:New
	Gui, 70:Font, bold s16
	gui, 70:add, Text, x5, Liste der vorhandenen Arbeitspläne:
	Gui, 70:Font, norm s10
	Gui, 70:Add, Text, Section ,Artikel:
	Gui, 70:add, ListView, % "xs Section w550 h550 HWNDhHLVAllBetrA grid gResultsLVAllBetrAClick AltSubmit vResultsLVAllBetrA  +LV0x10000", Artikel|Bezeichnung
	Loop, 10
	{
		rowNum := LV_Add("", "Artikel " A_Index,"test Bez " A_Index)
	}
	Gui, 70:add, ListView, % "xs Section w900 h160 HWNDhHLVAllBAMat grid AltSubmit gResultsLVGetDataAllBAKlickListeMat Checked NoSort vResultsLVGetDataAllBAListeMat  +LV0x10000 -multi", lfdnr|Artikel-Nr(E)|Bez(E)
	gosub, MaterialNeuaufbauen
	gui, 70:Show, ,Arbeitsplan 
	
return

70GuiClose:
	ExitApp
return

MaterialNeuaufbauen:
	Gui, 70:Default
	Gui, 70:
	Gui, ListView, ResultsLVGetDataAllBAListeMat
	LV_Delete()
	Random, anzahl , 4, 10
	Loop, %anzahl%
	{
		rowNum := LV_Add("", A_Index,"test " A_Index,A_Now)
	}
return

ResultsLVGetDataAllBAKlickListeMat:
	Critical, on
	If (A_GuiControl != "ResultsLVGetDataAllBAListeMat")
		return
	Gui, 70:Default
	Gui, 70:
	Gui, ListView, ResultsLVGetDataAllBAKlickListeMat
	
	;MsgBox %A_GuiEvent% / %A_GuiControl% / %A_DefaultListView%
	ItemsSelected :=LV_GetCount("S")
        if (ItemsSelected=0)
		{	
			BAMatLfdnrNr := 0
			xRowSelMat := 0
			xRowMat := 0
			return
		}
	If (A_GuiEvent == "Normal") {
		Gui, 70:Default
		Gui, 70:
		Gui, ListView, ResultsLVGetDataAllBAListeMat
		xRowSelMat := A_EventInfo
		
		LV_GetText(BAMatLfdnrNr, A_EventInfo, 1)
	}

	If (A_GuiEvent == "F") {
		
	}
	if (A_GuiEvent = "I")
	{
		xRowSelMat := A_EventInfo
		Gui, 70:Default
		Gui, 70:
		Gui, ListView, ResultsLVGetDataAllBAListeMat

		if (InStr(ErrorLevel, "c", true))
		{
			LV_Modify(A_EventInfo, "+Select")
			LV_GetText(BAMatLfdnrNr, A_EventInfo, 1)
			MsgBox, %BAMatLfdnrNr% / %A_EventInfo% / %ErrorLevel%
			sQry := "UPDATE BetrAuftrMaterial SET Standard = 'N' where lfdnr = " . BAMatLfdnrNr . ";"
			;MsgBox c
			
			;DB.Exec("BEGIN TRANSACTION;")
			;DB.Exec(sQry)
			;DB.Exec("COMMIT TRANSACTION;")
				;###################################################################
				;LogoDataDB(db, A_UserName, A_Now, sQry, 1, "BetrAuftrMaterialSpeichern")
				;###################################################################
			;gosub, DatensubBAMat
		}
		if (InStr(ErrorLevel, "C", true))
		{
			LV_Modify(A_EventInfo, "+Select")
			LV_GetText(BAMatLfdnrNr, A_EventInfo, 1)
			MsgBox, %BAMatLfdnrNr% / %A_EventInfo% / %ErrorLevel%
			;DB.Exec("BEGIN TRANSACTION;")
			;sQry := "UPDATE BetrAuftrMaterial SET Standard = 'N' where artikelnr = '" . GeklicktFMAllBAArtikelNr . "';"
			;DB.Exec(sQry)
			;sQry := "UPDATE BetrAuftrMaterial SET Standard = 'J' where lfdnr = " . BAMatLfdnrNr . ";"
			;DB.Exec(sQry)
			;DB.Exec("COMMIT TRANSACTION;")
				;###################################################################
				;LogoDataDB(db, A_UserName, A_Now, sQry, 1, "BetrAuftrMaterialSpeichern")
				;###################################################################
			;gosub, DatensubBAMat
		}

	}
	Critical, off
return

ResultsLVAllBetrAClick:
Critical, on
	Gui, 70:Submit, nohide
	if (A_GuiEvent = "Normal")
	{
		Gui, 70:Default
		Gui, 70:
		Gui, ListView, ResultsLVAllBetrA
		MsgBox %A_GuiEvent% / %A_GuiControl% / %A_DefaultListView%
		gosub, MaterialNeuaufbauen
	}
	Critical, off
return
regards,
AHK_fan :)
https://hr-anwendungen.de

just me
Posts: 9456
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Checkbox ermitteln ohne select der Zeile

Post by just me » 26 Jan 2023, 07:06

Moin, einige Anmerkungen:

Code: Select all

ResultsLVGetDataAllBAKlickListeMat:
	Critical, on
	If (A_GuiControl != "ResultsLVGetDataAllBAListeMat")
		return
	Gui, 70:Default
	Gui, 70:
	Gui, ListView, ResultsLVGetDataAllBAKlickListeMat
Wenn Du das Label nur einem ListView-Control zugeordnet hast, kann es in der Regel auch nur von diesem aufgerufen werden. Das GUI, das das Control enthält, wird in AHK 1.1 automatisch zum Default-GUI. Der Name in Gui, ListView, ResultsLVGetDataAllBAKlickListeMat ist falsch. Das Ganze kann deshalb geschrumpft werden:

Code: Select all

ResultsLVGetDataAllBAKlickListeMat:
	Critical, on
	Gui, ListView, %A_GuiControl%
Und diese Zuordnung brauchst Du im Label auch nur einmal.

Code: Select all

	;MsgBox %A_GuiEvent% / %A_GuiControl% / %A_DefaultListView%
	ItemsSelected :=LV_GetCount("S")
        if (ItemsSelected=0)
		{
			BAMatLfdnrNr := 0
			xRowSelMat := 0
			xRowMat := 0
			return
		}
Wenn Du das geich am Anfang machst, kannst Du auf die anderen Ereignisse nicht mehr reagieren, solange kein Reihe selektiert ist. Bis zum Ereignis "I" kommst Du dann nicht mehr.

Noch eine Frage: Willst Du nur reagieren, wenn eine Zeile 'gecheckt' wird, oder auch dann, wenn sie wieder 'entcheckt' wird?

Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Re: ListView Checkbox ermitteln ohne select der Zeile

Post by Ahk_fan » 26 Jan 2023, 07:57

Hallo @just me , danke für die Anmerkungen, die Punkte 1 und 2 sind in der Eile den Gefechts und Probierens drin geblieben. Punkt 3 ist richtig!
Was mir aber bei A_GuiControl nicht klar ist: Warum wird die Routine ResultsLVGetDataAllBAKlickListeMat aufgerufen, obwohl ich gar nicht in die untere LV klicke. Wenn ich eine MsgBox gnaz an Anfang in ResultsLVGetDataAllBAKlickListeMat aktiviere wird sie gleich angezeigt.

Außerdem ist das Critical komisch, wenn ich es in beiden aktiviere, werden alle Event dauerhaft ausgelöst....

Zu deiner Frage: ja, es soll sowohl auf Checked als auch unchecked reagieren.

So scheint es zu gehen:

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
	
	Gui, 70:Destroy
	Gui, 70:New
	Gui, 70:Font, bold s16
	gui, 70:add, Text, x5, Liste der vorhandenen Arbeitspläne:
	Gui, 70:Font, norm s10
	Gui, 70:Add, Text, Section ,Artikel:
	Gui, 70:add, ListView, % "xs Section w550 h550 HWNDhHLVAllBetrA grid gResultsLVAllBetrAClick AltSubmit vResultsLVAllBetrA  +LV0x10000", Artikel|Bezeichnung
	Loop, 10
	{
		rowNum := LV_Add("", "Artikel " A_Index,"test Bez " A_Index)
	}
	Gui, 70:add, ListView, % "xs Section w900 h160 HWNDhHLVAllBAMat grid AltSubmit gResultsLVGetDataAllBAKlickListeMat Checked NoSort vResultsLVGetDataAllBAListeMat  +LV0x10000 -multi", lfdnr|Artikel-Nr(E)|Bez(E)
	gosub, MaterialNeuaufbauen
	gui, 70:Show, ,Arbeitsplan 
	
return

70GuiClose:
	ExitApp
return

MaterialNeuaufbauen:
	Gui, 70:Default
	Gui, 70:
	Gui, ListView, ResultsLVGetDataAllBAListeMat
	LV_Delete()
	Random, anzahl , 4, 10
	Loop, %anzahl%
	{
		rowNum := LV_Add("", A_Index,"test " A_Index,A_Now)
	}
return

ResultsLVGetDataAllBAKlickListeMat:
	Critical, on
	
	If (A_GuiEvent == "Normal") {
		xRowSelMat := A_EventInfo
		
		LV_GetText(BAMatLfdnrNr, A_EventInfo, 1)
	}

	If (A_GuiEvent == "F") {
		
	}
	if (A_GuiEvent = "I")
	{
		xRowSelMat := A_EventInfo

		if (InStr(ErrorLevel, "c", true))
		{
			LV_Modify(A_EventInfo, "+Select")
			LV_GetText(BAMatLfdnrNr, A_EventInfo, 1)
			MsgBox, %BAMatLfdnrNr% / %A_EventInfo% / %ErrorLevel%
		}
		if (InStr(ErrorLevel, "C", true))
		{
			LV_Modify(A_EventInfo, "+Select")
			LV_GetText(BAMatLfdnrNr, A_EventInfo, 1)
			MsgBox, %BAMatLfdnrNr% / %A_EventInfo% / %ErrorLevel%
		
		}

	}
	Critical, off
return

ResultsLVAllBetrAClick:

;Critical, on
	Gui, 70:Submit, nohide
	MsgBox %A_GuiEvent% / %A_GuiControl% / %A_DefaultListView%
	if (A_GuiEvent = "Normal")
	{
		;MsgBox %A_GuiEvent% / %A_GuiControl% / %A_DefaultListView%
		gosub, MaterialNeuaufbauen
	}
	;Critical, off
return
regards,
AHK_fan :)
https://hr-anwendungen.de

just me
Posts: 9456
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Checkbox ermitteln ohne select der Zeile  Topic is solved

Post by just me » 26 Jan 2023, 09:58

Hi @Ahk_fan,

durch Critical On werden alle Ereignisse gepuffert, die während des Ablaufs der Listviewroutine ausgelöst werden, und dann nach Ende der Routine verarbeitet. In Deiner Routine sind mehrere Kanditaten:

Die MsgBoxen sorgen zumindest für ein f (Fokus verloren), nach Bestätigung für ein F (Fokus erhalten) und eventuell auch für ein C (Maus freigegeben).

Die LV_Modify(A_EventInfo, "+Select") erzeugt folgende Ereignisse:
Wenn vorher eine andere Zeile selektiert war, ein Is (Reihe deselektiert) und vielleicht zusätzlich ein If (Fokus verloren).
Die neu selektierte Zeile kann dann noch ein IS (Reihe selektiert) und vielleicht zusätzlich ein IF (Fokus erhalten).

Wenn man nicht will, dass die Listviewroutine aufgrund von Änderungen innerhalb der Routine aufgerufen wird, entfernt man vorübergehend das g-Label und aktiviert es später wieder:

Code: Select all

ResultsLVGetDataAllBAKlickListeMat:
   Critical, on
   ...
   GuiControl, -g, %A_GuiControl% ; g-Label entfernen
   ...
   dies und das tun
   ...
   GuiControl, +g%A_ThisLabel%, %A_GuiControl% ; g-Label aktivieren
   ...
Return

Ahk_fan wrote:Warum wird die Routine ResultsLVGetDataAllBAKlickListeMat aufgerufen, obwohl ich gar nicht in die untere LV klicke. Wenn ich eine MsgBox gnaz an Anfang in ResultsLVGetDataAllBAKlickListeMat aktiviere wird sie gleich angezeigt.
Wie gesagt, die Listviewroutine wird auch aufgerufen, wenn das Skript das Control bearbeitet. Hier geschieht das gleich zu Beginn in der Routine MaterialNeuaufbauen:.

Edit: Einige Tippfehler korrigiert, u.a. GuiControl, +g%A_ThisLabel%, war aber wohl trotzdem soweit verständlich.
Last edited by just me on 27 Jan 2023, 03:59, edited 1 time in total.

Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Re: ListView Checkbox ermitteln ohne select der Zeile

Post by Ahk_fan » 26 Jan 2023, 11:40

ah! :idea: :thumbup: Danke, das erklärt so einiges. Ein Wunder, das so einige meiner Programme funktionieren :lol:
regards,
AHK_fan :)
https://hr-anwendungen.de

Post Reply

Return to “Ich brauche Hilfe”