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,
- dass das Control während des Änderns nicht so stark vor sich hin flackert.
- 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
Moin,
das ist mein Vorschlag mit zwei Anmerkungen.
Wenn man in einem [c]ListView[/c] Control umfangreiche Änderungen vornehmen will, schaltet man das "Neuzeichnen" des Controls besser aus. Das bewirkt,
[list=1][*]dass das Control während des Änderns nicht so stark vor sich hin flackert.
[*]dass das Ändern deutlich schneller ausgeführt wird.[/list]Erreicht wird das durch die Anweisungsfolge
[code]GuiControl, -Redraw, MeinListView ; Neuzeichnen abschalten
... ; Änderungsanweisungen
... ; Änderungsanweisungen
GuiControl, +Redraw, MeinListView ; Neuzeichnen wieder einschalten[/code]
Ich habe aus den Lagerdaten zwei Arrays erstellt. [c]BestandsZeilen[/c] enthält die Originalzeilen der Datei. [c]BestandsFelder[/c] enthält die aufgesplitteten Zeilen, d.h. die Felder. Das Zeilenarray beschleunigt die Suche per [c]InStr()[/c], 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]#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[/code]