ListViewGadget Konvertierungsfehler?
ListViewGadget Konvertierungsfehler?
Hallo liebe PB Gemeinde,
ich bin neulich über eine nervige Eigenart des ListViewGadgets gestoßen.
Und zwar stellt er (jedenfalls bei mir) die Strings nicht 100% korrekt dar, in meinem Fall geht es speziell ums Tabulator -(ASCII Nr.9) Zeichen.
Folgendes Problem:
Ich habe eine .txt Datei mit ca. 800 Zeilen die Informationen über unsere Kunden enthalten.Die Struktur sieht in etwa so aus
<Test.txt>
Name d. Kunden Straße PLZ ORT TEL
Name d. Kunden2 Straße PLZ ORT TEL
Name d. Kunden3 Straße PLZ ORT TEL
Zwischen den einzelnen Elementen einer Zeile ist jeweils ein "TAB".
Nun lese ich die erste Zeile mit ReadLine(...) aus und Speicher sie beispielsweise in der Variablen Zeile1.s
Wenn ich nun die erste Zeile dem ListViewGadget hinzufüge, sehe ich zwischen Name d.Kunden und Straße keine Leerzechen (So wie in der txt datei), sondern lediglich einige Sonderzeichen wie. z.b. ASCII-Würfel (ich hoffe ihr wisst was ich meine).
Meine Frage ist also,wie kann ich den Text aus der *.txt-Datei 1:1 ins ListViewGadget übertragen, ohne die 800 Zeilen mühsam per Hand zu editieren?
ich bin neulich über eine nervige Eigenart des ListViewGadgets gestoßen.
Und zwar stellt er (jedenfalls bei mir) die Strings nicht 100% korrekt dar, in meinem Fall geht es speziell ums Tabulator -(ASCII Nr.9) Zeichen.
Folgendes Problem:
Ich habe eine .txt Datei mit ca. 800 Zeilen die Informationen über unsere Kunden enthalten.Die Struktur sieht in etwa so aus
<Test.txt>
Name d. Kunden Straße PLZ ORT TEL
Name d. Kunden2 Straße PLZ ORT TEL
Name d. Kunden3 Straße PLZ ORT TEL
Zwischen den einzelnen Elementen einer Zeile ist jeweils ein "TAB".
Nun lese ich die erste Zeile mit ReadLine(...) aus und Speicher sie beispielsweise in der Variablen Zeile1.s
Wenn ich nun die erste Zeile dem ListViewGadget hinzufüge, sehe ich zwischen Name d.Kunden und Straße keine Leerzechen (So wie in der txt datei), sondern lediglich einige Sonderzeichen wie. z.b. ASCII-Würfel (ich hoffe ihr wisst was ich meine).
Meine Frage ist also,wie kann ich den Text aus der *.txt-Datei 1:1 ins ListViewGadget übertragen, ohne die 800 Zeilen mühsam per Hand zu editieren?
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
StringField und ReplaceString sollten helfen, ansonsten bitte einen
Beispielcode posten (+ Beispieltext), damit man es genauer erörtern kann.
Gruß
Thomas
Beispielcode posten (+ Beispieltext), damit man es genauer erörtern kann.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

öhm ok ich versuchs mal mit nem beispiel
Test.txt:
Das gibt mein Debugger aus:(Und auch im ListViewGadget selbes Problem)

Wie man sieht sind zwischen Name,Straße,Plz und Tel keine Leerzeilen bzw.Tabs, sondern es werden die Sonderzeichen eingefügt und ich weiss nicht wie ich nun die Daten aus dem String Auslesen kann.
Würde der String genauso wiedergegeben werden wie er in der Test.txt-Datei gespeichert ist, wüsste ich an welcher Position im String sich jeweils die Straße,die PLZ und TelNr. befindet und könnte ganz einfach Mittels Mid(...) auslesen. Da es aber gerade nicht immer so einfach ist wie man sichs vorstellt renne ich gegen eine Wand
GREEZ Martin
Code: Alles auswählen
If OpenFile(0,"Test.txt")
Debug ReadString(0,ReadStringFormat(0))
CloseFile(0)
Else
MessageRequester("PureBasic", "Error: Can't read the file", 0)
EndIf
Code: Alles auswählen
Muster Firma MusterStraße 36 89264 Weißenhorn 09221/3864
Das gibt mein Debugger aus:(Und auch im ListViewGadget selbes Problem)

Wie man sieht sind zwischen Name,Straße,Plz und Tel keine Leerzeilen bzw.Tabs, sondern es werden die Sonderzeichen eingefügt und ich weiss nicht wie ich nun die Daten aus dem String Auslesen kann.
Würde der String genauso wiedergegeben werden wie er in der Test.txt-Datei gespeichert ist, wüsste ich an welcher Position im String sich jeweils die Straße,die PLZ und TelNr. befindet und könnte ganz einfach Mittels Mid(...) auslesen. Da es aber gerade nicht immer so einfach ist wie man sichs vorstellt renne ich gegen eine Wand

GREEZ Martin
Also als erstes frage ich mich was das ReadStringFormat(0) soll...
Ich seh diesen Begriff zum ersten mal
naja also ich lese eine Textdatei Zeile für Zeile mit dieser Procedur ein :
Die Prozedur gibt dann die Anzahl der Zeilen zurück die Gelesen wurden,
und in der LinkList Z() wären dann alle Zeilen. Wenn kein file gelesen werden konnte dann ist es wegen der gelöschten linklist Null.
Daraufhin kannst du dann das ganze in ein Listicongadget legen...
wobei zwischen den einzelnen Spalten im ListIcon immer ein CHR(10) mit eingegeben werden muss,
da es sonst alles in die erste Spalte rutscht...
Allerdings solltest du zwischen deinen daten wie Strasse,Name usw nicht Leerzeichen zum
trennen nehmen sondern ein zeichen was nicht vorkommen kann bei den daten.
z.B. ein ; oder : oder aber auch *
War es das was dich plagt ?
Edit : Es sind wahrscheinlich CHR(9) zeichen (TABSTOPP) in deiner Textdatei.... daher sind es vermutlich diese eckigebn symbole...
Wenn man das mit nem Editor anschaut macht er dann leerzeichen daraus...
Ich seh diesen Begriff zum ersten mal

Code: Alles auswählen
Structure hilfstring
String.s
EndStructure
Global NewList Z.hilfstring()
Procedure.l TextFileRead(Filename.s)
Protected Nr.l
ClearList(Z())
Nr=ReadFile(#PB_Any,Filename.s)
If Nr
While Eof(Nr)=0
AddElement(Z())
Z()\String=ReadString(Nr)
Wend
CloseFile(Nr)
EndIf
ProcedureReturn CountList(Z())
EndProcedure
und in der LinkList Z() wären dann alle Zeilen. Wenn kein file gelesen werden konnte dann ist es wegen der gelöschten linklist Null.
Daraufhin kannst du dann das ganze in ein Listicongadget legen...
Code: Alles auswählen
ForEach Z()
Musterfirma.s = StringField(Z()\String,1," ")
Musterstrasse.s = StringField(Z()\String,2," ")
usw.
AddGadgetItem(#ListIcon,-1,Musterfirma + Chr(10) + Musterstrasse usw...)
Next
da es sonst alles in die erste Spalte rutscht...
Allerdings solltest du zwischen deinen daten wie Strasse,Name usw nicht Leerzeichen zum
trennen nehmen sondern ein zeichen was nicht vorkommen kann bei den daten.
z.B. ein ; oder : oder aber auch *
War es das was dich plagt ?
Edit : Es sind wahrscheinlich CHR(9) zeichen (TABSTOPP) in deiner Textdatei.... daher sind es vermutlich diese eckigebn symbole...
Wenn man das mit nem Editor anschaut macht er dann leerzeichen daraus...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Vielleicht mal in der Hilfe nachschauen? Sollte bei Textdateien immerBisonte hat geschrieben:Also als erstes frage ich mich was das ReadStringFormat(0) soll...
benutzt werden, wenn man diese nicht selbst erstellt hat.
@teks
Bei mir sieht Dein Text normal aus, vielleicht kannste mal den Text zippen
und irgendwo hochladen?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: ListViewGadget Konvertierungsfehler?
...und dann kannst Du mit ReplaceString alle Tabs umwandeln.teks hat geschrieben:Zwischen den einzelnen Elementen einer Zeile ist jeweils ein "TAB".
Nun lese ich die erste Zeile mit ReadLine(...) aus und Speicher sie beispielsweise in der Variablen Zeile1.s
Code: Alles auswählen
Zeile1 = ReplaceString(Zeile1,#TAB$," ")
Code: Alles auswählen
If OpenFile(0,"Test.txt")
Debug ReplaceString(ReadString(0,ReadStringFormat(0)),#TAB$," ")
CloseFile(0)
Else
MessageRequester("PureBasic", "Error: Can't read the file", 0)
EndIf
Die Daten werden so aber wahrscheinlich nicht sehr ansehnlich sein,
weshalb es vielleicht doch besser wäre ein ListIconGadget mit 5 Spalten
zu nehmen.
Hier mal ein ganz simples Beispiel, das Du sicherlich leicht an Deine
Bedürfnisse anpassen kannst:
Code: Alles auswählen
Procedure.s ManyTabsToChr10(string.s)
Define finalstring.s
*p.character = @string ; string-adresse nach *p
While *p\c ; solange das Zeichen *p\c nicht 0 ist
If *p\c = #TAB ; wenn #tab gefunden
finalstring + Chr(10) ; erstes #tab durch chr(10) in finalstring ersetzen für ListIconGadget
While *p\c = #TAB : *p+SizeOf(Character) : Wend ; solange #tab gefunden, naechstes zeichen
Else
finalstring + Chr(*p\c) ; Zeichen zu finalstring hinzufuegen
*p+SizeOf(character) ; naechstes zeichen
EndIf
Wend
ProcedureReturn finalstring
EndProcedure
Line$ = "Muster Firma"+#TAB$+#TAB$+#TAB$+"MusterStraße 36"+#TAB$+#TAB$+#TAB$+"89264"+#TAB$+#TAB$+#TAB$+"Weißenhorn"+#TAB$+#TAB$+#TAB$+"09221/3864"+#TAB$+#TAB$+#TAB$
If OpenWindow(0,0,0,600,300,"Liste",#PB_Window_Normal|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ListIconGadget(0,5,5,590,290,"Name",110)
AddGadgetColumn(0,1,"Strasse",110)
AddGadgetColumn(0,2,"PLZ",110)
AddGadgetColumn(0,3,"Stadt",110)
AddGadgetColumn(0,4,"Tel.Nr.",110)
AddGadgetItem(0,-1,ManyTabsToChr10(Line$))
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
Else
MessageRequester("Fehler","Gadgetliste kann nicht erstellt werden")
EndIf
Else
MessageRequester("Fehler","Fenster kann nicht geöffnet werden")
EndIf
'zeile = ReplaceString(zeile,#TAB$,Chr(10))' um den String fürs ListIconGadget
aufzubereiten. In Deinem Bild sieht das aber nicht nur wie 1 Tab aus.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Ja Sorry,seit PB3.3 hab ich nicht mehr Fileoperationen in der Hilfe nachschauen muessents-soft hat geschrieben:Vielleicht mal in der Hilfe nachschauen? Sollte bei Textdateien immerBisonte hat geschrieben:Also als erstes frage ich mich was das ReadStringFormat(0) soll...
benutzt werden, wenn man diese nicht selbst erstellt hat.

PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom