In Listview suchen

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: In Listview suchen

Re: In Listview suchen

Post by just me » 05 Sep 2019, 10:55

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

Re: In Listview suchen

Post by KHA » 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.

Re: In Listview suchen

Post by just me » 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

Re: In Listview suchen

Post by hd0202 » 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

In Listview suchen

Post by KHA » 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



Top