In Listview suchen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

KHA
Posts: 160
Joined: 21 Aug 2018, 11:11

In Listview suchen

04 Sep 2019, 16:04

Guten Abend,
Ich komme mit mein vorhaben irgendwie nicht weiter, möchte gerne in ListView eine Suchfunktion einbauen.
Die Suche an sich funktioniert, aber sobald ich den Suchfeld lösche vervielfachen sich die Einträge. Dabei will ich das der ursprügliche zustand wiederhergestellt wird.

Danke im Voraus.
LG

Code: Select all

#SingleInstance force
Daten=
(
join`n
Nr.|LagerNr|EAN|ProduktNr|Interne-Nr|Titel|Bestand|VK-preis
A1842|5424450148495|3819429075||Televes|1|69,95
A1409|4250157710956|632706369||Kreiling|5|78,3
A2068|8034427016774|3788599890||Fuba|0|219,95
A1784|8034427006195|788737489||Fuba 780G|0|119,95
A1974|8034427006263|2632715276||Fuba 850R|0|329,95
A2065|8034427013018|632740614||Fuba DAA110 G|5|219,95
A2135|8716184056535|632761407| 1112705|One for All S9|9|67,9


)
Gui, New
Gui, Add, Edit,  w820 vSuchText gSuche
Gui, add, listview, Checked Grid w820 r30 gGlager vVlager, Nr.|LagerNr|EAN|ProduktNr|Interne-Nr|Titel|Bestand|VK-preis
Gui, Show, , Bestand Auswerten!

;FileRead, Daten, aufLager.txt
Maxi := StrSplit(Daten, "`n").MaxIndex()

i := 1
y := []

Loop, Parse, Daten, `n
{
if (A_index = 1)
continue
if (A_LoopField = "")
continue

x :=[]
y.push(A_LoopField)



Loop, Parse, A_LoopField, "|"
{
x.push(A_LoopField)
}
LV_Add("", i, x*)
i++
ToolTip, % "Es wird geladen " i " von " Maxi
}
ToolTip
Return

Glager:
Return


Suche:
GuiControlGet, SuchText
LV_Delete()

For k, v In y
{
   If (SuchText != "")
   {
       If InStr(v, SuchText)
{
erg := StrSplit(v, "|")         
LV_Add("", k, erg*)
}
 }
   Else
{
For ke, va In y
{
berg := StrSplit(va, "|")   
LV_Add("", ke, berg*)
   }
   }

}
Return


hd0202
Posts: 140
Joined: 04 Oct 2013, 03:07
Location: Germany near Cologne

Re: In Listview suchen  Topic is solved

04 Sep 2019, 23:36

Hallo KHA,
nachdem ich Deine Source durch Einrücken übersichtlich gemacht habe, war es ein Leichtes, das Problem zu lösen. Deshalb hier meine Version, meine Änderungen sind mit "<===" markiert:

Code: Select all

#SingleInstance force
Daten=
(join`n Comment		; <===
Nr.|LagerNr|EAN|ProduktNr|Interne-Nr|Titel|Bestand|VK-preis
A1842|5424450148495|3819429075||Televes|1|69,95
A1409|4250157710956|632706369||Kreiling|5|78,3
A2068|8034427016774|3788599890||Fuba|0|219,95
A1784|8034427006195|788737489||Fuba 780G|0|119,95
A1974|8034427006263|2632715276||Fuba 850R|0|329,95
A2065|8034427013018|632740614||Fuba DAA110 G|5|219,95
A2135|8716184056535|632761407| 1112705|One for All S9|9|67,9


)
Gui, New
Gui, Add, Edit,  w820 vSuchText gSuche
Gui, add, listview, Checked Grid w820 r30 gGlager vVlager, Nr.|LagerNr|EAN|ProduktNr|Interne-Nr|Titel|Bestand|VK-preis
Gui, Show, , Bestand Auswerten!

;FileRead, Daten, aufLager.txt
Maxi := StrSplit(Daten, "`n").MaxIndex()

i := 1
y := []

Loop, Parse, Daten, `n
{
	if (A_index = 1)
		continue
	if (A_LoopField = "")
		continue

	x :=[]
	y.push(A_LoopField)

	Loop, Parse, A_LoopField, "|"
	{
		x.push(A_LoopField)
	}
	LV_Add("", i, x*)
	i++
	ToolTip, % "Es wird geladen " i " von " Maxi
}
lv_modifycol()		; <===
ToolTip
Return

Glager:
Return


Suche:
GuiControlGet, SuchText
LV_Delete()

For k, v In y
{
   If (SuchText != "")
   {
       If InStr(v, SuchText)
		{
			erg := StrSplit(v, "|")         
			LV_Add("", k, erg*)
		}
   }
   Else
   {
		For ke, va In y
		{
			berg := StrSplit(va, "|")   
			LV_Add("", ke, berg*)
		}
		break		; <===  <===
   }
}
Return
Hubert
just me
Posts: 6517
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: In Listview suchen

05 Sep 2019, 04:16

Moin,

das ist mein Vorschlag mit zwei Anmerkungen.

Wenn man in einem ListView Control umfangreiche Änderungen vornehmen will, schaltet man das "Neuzeichnen" des Controls besser aus. Das bewirkt,
  1. dass das Control während des Änderns nicht so stark vor sich hin flackert.
  2. dass das Ändern deutlich schneller ausgeführt wird.
Erreicht wird das durch die Anweisungsfolge

Code: Select all

GuiControl, -Redraw, MeinListView ; Neuzeichnen abschalten
... ; Änderungsanweisungen
... ; Änderungsanweisungen
GuiControl, +Redraw, MeinListView ; Neuzeichnen wieder einschalten


Ich habe aus den Lagerdaten zwei Arrays erstellt. BestandsZeilen enthält die Originalzeilen der Datei. BestandsFelder enthält die aufgesplitteten Zeilen, d.h. die Felder. Das Zeilenarray beschleunigt die Suche per InStr(), das Feldarray sorgt dafür, dass die Zeilen nicht immer wieder neu gesplittet werden müssen. Wenn das für Dich zu viel Platz kostet oder aus anderen Gründen nicht passt, kann man auf das Feldarray auch wieder verzichten.

Code: Select all

#NoEnv
#SingleInstance force

;FileRead, Daten, aufLager.txt
Daten=
(join`n
Nr.|LagerNr|EAN|ProduktNr|Interne-Nr|Titel|Bestand|VK-preis
A1842|5424450148495|3819429075||Televes|1|69,95
A1409|4250157710956|632706369||Kreiling|5|78,3
A2068|8034427016774|3788599890||Fuba|0|219,95
A1784|8034427006195|788737489||Fuba 780G|0|119,95
A1974|8034427006263|2632715276||Fuba 850R|0|329,95
A2065|8034427013018|632740614||Fuba DAA110 G|5|219,95
A2135|8716184056535|632761407| 1112705|One for All S9|9|67,9


)
BestandsZeilen := []
BestandsFelder := []
Index := 1
Loop, Parse, Daten, `n, `r ; das könnte auch eine Datei-Lese-Schleife sein
{
   If (A_Index > 1) && (A_LoopField <> "")
   {
      BestandsZeilen[Index] := A_LoopField
      BestandsFelder[Index] := StrSplit(A_LoopField, "|")
      Index++
   }
}
Daten := ""

Gui, New
Gui, Add, Edit,  w820 vSuchText gSuche
Gui, Add, ListView, Checked Grid w820 r30 gGlager vVlager, Nr.|LagerNr|EAN|ProduktNr|Interne-Nr|Titel|Bestand|VK-preis
Gui, Show, , Bestand Auswerten!

Gosub, LV_Laden

GuiControl, -Redraw, VLager
Loop,  % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")
GuiControl, +Redraw, VLager
Return
; ----------------------------------------------------------------------------------------------------------------------
GuiClose:
ExitApp
; ----------------------------------------------------------------------------------------------------------------------
Glager:
Return
; ----------------------------------------------------------------------------------------------------------------------
Suche:
   GuiControlGet, SuchText
   GoSub, LV_Laden
Return
; ----------------------------------------------------------------------------------------------------------------------
LV_Laden:
   N := 1
   GuiControl, -Redraw, VLager
   LV_Delete()
   For I, V In BestandsFelder
   {
      If (Suchtext = "") || InStr(BestandsZeilen[I], SuchText)
      {
         LV_Add("", N, V*)
         N++
      }
   }
   GuiControl, +Redraw, VLager
Return
KHA
Posts: 160
Joined: 21 Aug 2018, 11:11

Re: In Listview suchen

05 Sep 2019, 10:22

@hd0202 Danke dir, dass mit Einrücken muss ich mir auch mal angewöhnen.

@ just me
Ich bewundere immer wieder deine AHK Kenntnisse.
just me
Posts: 6517
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: In Listview suchen

05 Sep 2019, 10:55

@KHA: Ich beschäftige mich seit 2004/2005 mit AHK und bin schon wieder auf dem 'absteigenden Ast'. ;)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: UnReALiTyy and 4 guests