Seite 2 von 2
Re: Arbeiten mit einer .CSV Datei
Verfasst: 15.05.2015 15:18
von Kiffi
ich würde das nicht so kompliziert machen.
hier mal mein Vorschlag ohne Callback und Gebimsel:
Code: Alles auswählen
EnableExplicit
Structure sAuto
Hersteller.s
Baujahr.s
PS.s
EndStructure
Global NewList Auto.sAuto()
Enumeration FormWindow
#Window_0
EndEnumeration
Enumeration FormGadget
#lblHerstellerFilter
#txtHerstellerFilter
#lblPsFilter
#txtPsFilter
#lblBaujahrFilter
#txtBaujahrFilter
#ligAutos
#cmdFilter
EndEnumeration
Procedure OpenWindow_0()
OpenWindow(#Window_0, 0, 0, 600, 400, "Alle meine Autos", #PB_Window_SystemMenu)
TextGadget(#lblHerstellerFilter, 8, 8, 100, 25, "Hersteller:")
StringGadget(#txtHerstellerFilter, 112, 8, 100, 25, "")
TextGadget(#lblBaujahrFilter, 8, 40, 100, 25, "Baujahr:")
StringGadget(#txtBaujahrFilter, 112, 40, 100, 25, "")
TextGadget(#lblPsFilter, 8, 72, 100, 25, "PS:")
StringGadget(#txtPsFilter, 112, 72, 100, 25, "")
ListIconGadget(#ligAutos, 8, 112, 584, 280, "Hersteller", 100)
AddGadgetColumn(#ligAutos, 1, "Baujahr", 100)
AddGadgetColumn(#ligAutos, 2, "PS", 100)
ButtonGadget(#cmdFilter, 232, 72, 100, 25, "Filtern")
EndProcedure
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "100" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "200" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "300" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "100" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "200" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "300" : Auto()\Baujahr = "2010"
Procedure RefillList()
ClearGadgetItems(#ligAutos)
Protected Hersteller_OK, PS_OK, Baujahr_OK
ForEach Auto()
Hersteller_OK = #True
If GetGadgetText(#txtHerstellerFilter) <> ""
Hersteller_OK = FindString(Auto()\Hersteller, GetGadgetText(#txtHerstellerFilter))
EndIf
PS_OK = #True
If GetGadgetText(#txtPsFilter) <> ""
PS_OK = Bool(Auto()\PS = GetGadgetText(#txtPsFilter))
EndIf
Baujahr_OK = #True
If GetGadgetText(#txtBaujahrFilter) <> ""
Baujahr_OK = Bool(Auto()\Baujahr = GetGadgetText(#txtBaujahrFilter))
EndIf
If Hersteller_OK And PS_OK And Baujahr_OK
AddGadgetItem(#ligAutos, -1, Auto()\Hersteller + #LF$ + Auto()\Baujahr + #LF$ + Auto()\PS)
EndIf
Next
EndProcedure
OpenWindow_0()
RefillList()
BindGadgetEvent(#cmdFilter, @RefillList())
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Grüße ... Peter
Re: Arbeiten mit einer .CSV Datei
Verfasst: 15.05.2015 15:51
von HHYayo
Kiffi hat geschrieben:ich würde das nicht so kompliziert machen.
hier mal mein Vorschlag ohne Callback und Gebimsel:
Code: Alles auswählen
EnableExplicit
Structure sAuto
Hersteller.s
Baujahr.s
PS.s
EndStructure
Global NewList Auto.sAuto()
Enumeration FormWindow
#Window_0
EndEnumeration
Enumeration FormGadget
#lblHerstellerFilter
#txtHerstellerFilter
#lblPsFilter
#txtPsFilter
#lblBaujahrFilter
#txtBaujahrFilter
#ligAutos
#cmdFilter
EndEnumeration
Procedure OpenWindow_0()
OpenWindow(#Window_0, 0, 0, 600, 400, "Alle meine Autos", #PB_Window_SystemMenu)
TextGadget(#lblHerstellerFilter, 8, 8, 100, 25, "Hersteller:")
StringGadget(#txtHerstellerFilter, 112, 8, 100, 25, "")
TextGadget(#lblBaujahrFilter, 8, 40, 100, 25, "Baujahr:")
StringGadget(#txtBaujahrFilter, 112, 40, 100, 25, "")
TextGadget(#lblPsFilter, 8, 72, 100, 25, "PS:")
StringGadget(#txtPsFilter, 112, 72, 100, 25, "")
ListIconGadget(#ligAutos, 8, 112, 584, 280, "Hersteller", 100)
AddGadgetColumn(#ligAutos, 1, "Baujahr", 100)
AddGadgetColumn(#ligAutos, 2, "PS", 100)
ButtonGadget(#cmdFilter, 232, 72, 100, 25, "Filtern")
EndProcedure
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "100" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "200" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "300" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "100" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "200" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "300" : Auto()\Baujahr = "2010"
Procedure RefillList()
ClearGadgetItems(#ligAutos)
Protected Hersteller_OK, PS_OK, Baujahr_OK
ForEach Auto()
Hersteller_OK = #True
If GetGadgetText(#txtHerstellerFilter) <> ""
Hersteller_OK = FindString(Auto()\Hersteller, GetGadgetText(#txtHerstellerFilter))
EndIf
PS_OK = #True
If GetGadgetText(#txtPsFilter) <> ""
PS_OK = Bool(Auto()\PS = GetGadgetText(#txtPsFilter))
EndIf
Baujahr_OK = #True
If GetGadgetText(#txtBaujahrFilter) <> ""
Baujahr_OK = Bool(Auto()\Baujahr = GetGadgetText(#txtBaujahrFilter))
EndIf
If Hersteller_OK And PS_OK And Baujahr_OK
AddGadgetItem(#ligAutos, -1, Auto()\Hersteller + #LF$ + Auto()\Baujahr + #LF$ + Auto()\PS)
EndIf
Next
EndProcedure
OpenWindow_0()
RefillList()
BindGadgetEvent(#cmdFilter, @RefillList())
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Grüße ... Peter
Das ist eigentlich Haargenau das was ich suche!
Ich benutze diese Funktion um mein ListIcon mit den Daten zu füllen:
Code: Alles auswählen
Procedure LoadItems()
Protected ReadFileString$
Protected Column1$
Protected Column2$
Protected Column3$
Protected Column4$
Protected Column5$
Protected Column6$
Protected Column7$
Protected Column8$
Protected Column9$
Protected Column10$
Protected Column11$
Protected Column12$
Protected Column13$
Protected Column14$
If ReadFile(1,"DB.csv")
While Eof(1)=0
ReadFileString$ = ReadString(1,0)
Column1$ = StringField(ReadFileString$,1,";")
Column2$ = StringField(ReadFileString$,2,";")
Column3$ = StringField(ReadFileString$,3,";")
Column4$ = StringField(ReadFileString$,4,";")
Column5$ = StringField(ReadFileString$,5,";")
Column6$ = StringField(ReadFileString$,6,";")
Column7$ = StringField(ReadFileString$,7,";")
Column8$ = StringField(ReadFileString$,8,";")
Column9$ = StringField(ReadFileString$,9,";")
Column10$ = StringField(ReadFileString$,10,";")
Column11$ = StringField(ReadFileString$,11,";")
Column12$ = StringField(ReadFileString$,12,";")
Column13$ = StringField(ReadFileString$,13,";")
Column14$ = StringField(ReadFileString$,14,";")
AddGadgetItem(ListIcon_0,-1,Column1$+Chr(10)+Column2$+Chr(10)+Column3$+Chr(10)+Column4$+Chr(10)+Column5$+Chr(10)+Column6$+Chr(10)+Column7$+Chr(10)+Column8$+Chr(10)+Column9$+Chr(10)+Column10$+Chr(10)+Column11$+Chr(10)+Column12$+Chr(10)+Column13$+Chr(10)+Column14$)
Wend
CloseFile(1)
EndIf
EndProcedure
Muss ich nun einfach statt AddGadgetItem das AddElement benutzen und die Liste dann mit deiner Refill Procedure füllen ?
Re: Arbeiten mit einer .CSV Datei
Verfasst: 15.05.2015 15:58
von Kiffi
in LoadItems() würde ich die LinkedList (einmalig) befüllen.
in RefillList() befüllst Du das ListIconGadget mit den Daten der LinkedList unter Berücksichtigung der Filter.
Grüße ... Peter
Re: Arbeiten mit einer .CSV Datei
Verfasst: 15.05.2015 17:02
von HHYayo
Funktioniert fast so wie es soll. Allerdings scheint er nur bis Ausführung die Eingaben anzunehmen. Sobald ich zum Beispiel Baujahr dazu nehmen zeigt er mir garnichts mehr an.
Warum ?
Code: Alles auswählen
Procedure RefillList()
ClearGadgetItems(ListIcon_0)
Protected Marke_OK, Serie_OK, Ausfuehrung_OK, Modell_OK, Art_OK, Leistung_OK, Getriebe_OK, Hersteller_OK, Baureihe_OK, Stgnrh_OK, Stgnrs_OK, Softwarestand_OK, LeseHardware_OK, Info_OK
ForEach Auto()
Marke_OK = #True
If GetGadgetText(String_Marke) <> ""
Marke_OK = FindString(Auto()\Marke, GetGadgetText(String_Marke))
EndIf
Serie_OK = #True
If GetGadgetText(String_Serie) <> ""
Serie_OK = Bool(Auto()\Serie = GetGadgetText(String_Serie))
EndIf
Ausfuehrung_OK = #True
If GetGadgetText(String_Ausfuehrung) <> ""
Ausfuehrung_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Ausfuehrung))
EndIf
Modell_OK = #True
If GetGadgetText(String_Baujahr) <> ""
Modell_OK = FindString(Auto()\Marke, GetGadgetText(String_Baujahr))
EndIf
Art_OK = #True
If GetGadgetText(String_Art) <> ""
Art_OK = Bool(Auto()\Serie = GetGadgetText(String_Art))
EndIf
Leistung_OK = #True
If GetGadgetText(String_Leistung) <> ""
Leistung_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Leistung))
EndIf
Getriebe_OK = #True
If GetGadgetText(String_Getriebe) <> ""
Getriebe_OK = FindString(Auto()\Marke, GetGadgetText(String_Getriebe))
EndIf
Hersteller_OK = #True
If GetGadgetText(String_Hersteller) <> ""
Hersteller_OK = Bool(Auto()\Serie = GetGadgetText(String_Hersteller))
EndIf
Baureihe_OK = #True
If GetGadgetText(String_Baureihe) <> ""
Baureihe_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Baureihe))
EndIf
Stgnrh_OK = #True
If GetGadgetText(String_Stgnrh) <> ""
Stgnrh_OK = FindString(Auto()\Marke, GetGadgetText(String_Stgnrh))
EndIf
Stgnrs_OK = #True
If GetGadgetText(String_Stgnrs) <> ""
Stgnrs_OK = Bool(Auto()\Serie = GetGadgetText(String_Stgnrs))
EndIf
Softwarestand_OK = #True
If GetGadgetText(String_Softwarestand) <> ""
Softwarestand_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Softwarestand))
EndIf
LeseHardware_OK = #True
If GetGadgetText(String_LeseHardware) <> ""
LeseHardware_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_LeseHardware))
EndIf
Info_OK = #True
If GetGadgetText(String_Info) <> ""
Info_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Info))
EndIf
If Marke_OK And Serie_OK And Ausfuehrung_OK And Modell_OK And Art_OK And Leistung_OK And Getriebe_OK And Hersteller_OK And Baureihe_OK And Stgnrh_OK And Stgnrs_OK And Softwarestand_Ok And LeseHardware_OK And Info_OK
AddGadgetItem(ListIcon_0, -1, Auto()\Marke + #LF$ + Auto()\Serie + #LF$ + Auto()\Ausfuehrung + #LF$ + Auto()\Baujahr + #LF$ + Auto()\Art + #LF$ + Auto()\Leistung + #LF$ + Auto()\Getriebe + #LF$ + Auto()\Hersteller + #LF$ + Auto()\Baureihe + #LF$ + Auto()\Stgnrh + #LF$ + Auto()\Stgnrs + #LF$ + Auto()\Softwarestand + #LF$ + Auto()\LeseHardware + #LF$ + Auto()\Info)
EndIf
Next
EndProcedure
Re: Arbeiten mit einer .CSV Datei
Verfasst: 15.05.2015 17:09
von NicTheQuick
Wenn du einfach nur auf Gleichheit prüfst, dann kannst du auch nur nach kompletten Strings suchen. Schlauer wäre es, überall FindString zu benutzen, wie bei Marke_OK.
Re: Arbeiten mit einer .CSV Datei
Verfasst: 15.05.2015 17:19
von Kiffi
NicTheQuick hat geschrieben:Wenn du einfach nur auf Gleichheit prüfst, dann kannst du auch nur nach kompletten Strings suchen. Schlauer wäre es, überall FindString zu benutzen, wie bei Marke_OK.
ich habe bei PS und Baujahr auf Gleicheit (Bool()) geprüft (ist meines Erachtens sinnvoll). So Sachen wie Hersteller oder Marke sollten natürlich besser mit FindString() überprüft werden.
Grüße ... Peter
Re: Arbeiten mit einer .CSV Datei
Verfasst: 15.05.2015 17:25
von HHYayo
Habe das Problem gefunden. Habe vergessen die Variablen aus der Liste Auto() anzupassen. Jetzt funktioniert die Geschichte wie sie soll! Ich würde aber auch gerne Abweichungen einbauen, sprich wenn das es zum Beispiel ausreichen würde einfach "2.0" anzugeben statt "2.0 TDI". Das ich habe nur das Problem das wenn ich Bool versuche mit FindString auszutauschen das er denn sagt "Comparison are only compatible with keywords like.."
Muss ich das FindString im Bool setzen ?
// EDIT //
Problem auch gelöst!
Re: Arbeiten mit einer .CSV Datei
Verfasst: 30.05.2015 06:06
von Didelphodon
@hhyago ...
Nur mal so als Gedanke zwischendurch, warum verwendest Du für die Aufgabe eigentlich nicht einfach Excel? Das wäre das "perfekte" Tool dafür, imho.