| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 06.08.2017, 18:49    Titel: Loadbefehl - Laden von Werten aus Datei |   |  
				| 
 |  
				| Ich komme bei einer kleinen Sache irgendwie nicht weiter. Ich habe eine Datei mit Zahlen und Buchstaben. In jeder Zeile sind die Werte durch  ein oder mehrere Leerzeichen voneinander getrennt. Die Zeilen haben keine feste Länge. Können also unendlich lang sein. Ich brauche irgendwie eine Lösung, dass ich jeden Wert in einer Zeile einer Variable zuordnen kann? Ich muss irgendwie wissen wie viele Werte in der Datei drin stehen und wo sie sich befinden??? Es kann auch sein, dass zum Beispiel mehr als 1 Leerzeichen zwischen den Werten drinstehen! 
 Beispiel einer Datei:
 
 
  	  | Code: |  	  | G90    G54 G80    G72.1 T0101 M06               [Werkzeugaufruf T0101]
 S1000 F120 M03      (Drehzahl)
 G00 X0  Y25 M08
 G00 Z5
 G01 Z-2 F320
 G01 G42 X100 Y35   F1000
 ...
 | 
 
 Beispiel 2:
 
 
  	  | Code: |  	  | 001  111 MCM  Te1744789020                       9257 ICE                         9.2    8     5 y 9     4 u 5     4 v 1     8 w # 
 
 | 
 
 Bei Beispiel 2 sollte zum Beispiel "5 y 9" beim einlesen erkannt werden und in seine Einzelteile zerlegt werden! Ich habe keine Idee wie ich bei Beispiel 2 an die Werte rankomme und ich vor allem weiß, um wie viele Elemente es sich handelt. Bei Beispiel 2 wären es 4 Elemente (5 y 9, 4 u 5, 4 v 1, 8 w #) Wie überprüfe ich das Ende einer Zeile? Das ist das, was mir im Moment noch Kopfzerbrechen bereitet?
 
 Vielleicht hat einer eine Idee bzw. Lösung?
 
 Gruß
 ALWIM
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 06.08.2017, 21:04    Titel: |   |  
				| 
 |  
				| Das Zeilenende sollte wirklich kein Problem sein. Du liest einfach die komplette Zeile mit LINE INPUT ein; dann ist das Ende der eingelesenen Zeile auch das Ende der Zeile in der Datei. 
 Die Inhalte sind durch Leerzeichen getrennt, also suchst du in der eingelesenen Zeile nach Leerzeichen (z. B. mit INSTR). Dann kannst du die Zeile schon mal in zwei Teile zerlegen - den vor und den nach dem Leerzeichen, und dann im zweiten Teil z. B. mit TRIM die (führenden) Leerzeichen abschneiden. Damit beginnt dieser zweite Teil direkt mit dem zweiten Wert.
 
 Der zweite Teil wird dann wie oben weiter zerlegt; das wiederholst du so lange, bis du kein Leerzeichen mehr findest. Damit hast du alle Werte ausgelesen (und weißt damit auch, wie viele Werte es waren).
 
 Allerdings, "5 y 9" und "4 u 5" kannst du nicht als zusammenhängend erkennen, wenn das Leerzeichen das Trennzeichen sein soll; außer du kennst die Struktur und fügst es nachher wieder zusammen ("wenn auf eine Zahl ein einzelner Buchstabe und darauf wieder eine Zahl oder ein Hash folgt, dann ..."). Wenn nicht, dann ist das Format (Leerzeichen als Trennzeichen UND als möglicher Inhalt) einfach Mist
  . _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 06.08.2017, 21:47    Titel: |   |  
				| 
 |  
				| Theoretisch ginge das schon. Ich muss halt nur wissen, welche Abschnitt (Abschnitt 1 oder Abschnitt 2, ... Abschnitt 30) das ist. Zusammenhängend muss ich es nicht unbedingt erkennen können. Es reicht wenn ich die Zahl 5 einlese und der entsprechenden Variable zuordnen kann. Genauso ist es mit dem Y und der Zahl 9, sowie den restlichen Werten. Alles muss einer bestimmten Variable zugeordnet werden bzw. können. Wirklich nicht einfach... 	  | Zitat: |  	  | Allerdings, "5 y 9" und "4 u 5" kannst du nicht als zusammenhängend erkennen, wenn das Leerzeichen das Trennzeichen sein soll; außer du kennst die Struktur und fügst es nachher wieder zusammen ("wenn auf eine Zahl ein einzelner Buchstabe und darauf wieder eine Zahl oder ein Hash folgt, dann ..."). | 
  Ich verzweifle noch! 
 Edit:
 Wobei! Vermutlich so gemeint/gedacht:
 
 
  	  | Code: |  	  | 1. xxx xxx  xx  xxx   x   xx  x   xxx 2. xxx  xx  xxx   x   xx  x   xxx
 3. xx  xxx   x   xx  x   xxx
 4. xxx   x   xx  x   xxx
 5. x   xx  x   xxx
 6. xx  x   xxx
 7. x   xxx
 8. xxx
 Ende
 
 | 
 
 Schrittweise Reduzierung des Satzes. Ich muss dann nur noch wissen, wann welcher Wert kommt und den der entsprechenden Variable zuordnen.
 
 Gruß
 ALWIM
 _________________
 SHELL SHUTDOWN -s -t 05
 
 Zuletzt bearbeitet von ALWIM am 06.08.2017, 21:58, insgesamt einmal bearbeitet
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 06.08.2017, 21:55    Titel: |   |  
				| 
 |  
				| Was meinst du mit "Abschnitt 1", "Abschnitt 2" usw.? 
 Die Zeile aus Beispiel 2 zu zerlegen in
 "001", "111", "MCM", "Te1744789020", "9257", "ICE", "9.2", "8", "5", "y", "9", "4", "u", "5", "4", "v", "1", "8", "w", "#"
 ist kein Problem. Wenn die Dinge anders zusammenhängen, solltest du dir zuerst überlegen: Wie erkennst du (nicht das Programm, sondern du als Mensch), welcher Wert in welchen Abschnitt gehört? Danach kannst du versuchen, das als Programm umzusetzen.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 06.08.2017, 22:02    Titel: |   |  
				| 
 |  
				|  	  | nemored hat Folgendes geschrieben: |  	  | Was meinst du mit "Abschnitt 1", "Abschnitt 2" usw.? 
 Die Zeile aus Beispiel 2 zu zerlegen in
 "001", "111", "MCM", "Te1744789020", "9257", "ICE", "9.2", "8", "5", "y", "9", "4", "u", "5", "4", "v", "1", "8", "w", "#"
 ist kein Problem. Wenn die Dinge anders zusammenhängen, solltest du dir zuerst überlegen: Wie erkennst du (nicht das Programm, sondern du als Mensch), welcher Wert in welchen Abschnitt gehört? Danach kannst du versuchen, das als Programm umzusetzen.
 | 
 
 Bei "5 y 9" beginne ich mit dem zählen von 1 aufwärts. Also Abschnitt 1!
 "4 u 5" wäre dann die 2. Demzufolge Abschnitt 2. Ich muss wissen, welche Nummer "5 y 9" ist.
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 06.08.2017, 22:07    Titel: |   |  
				| 
 |  
				| Und woher weißt du, dass der erste Abschnitt "5 y 9" ist und nicht z. B. 
 oder gar
 
 Entschuldige, wenn die Frage seltsam wirkt; aber genau das ist der Punkt, über den du dir für das Programm klar werden musst.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 06.08.2017, 22:12    Titel: |   |  
				| 
 |  
				|  	  | nemored hat Folgendes geschrieben: |  	  | Und woher weißt du, dass der erste Abschnitt ist und nicht z. B. 
 oder gar
 
 Entschuldige, wenn die Frage seltsam wirkt; aber genau das ist der Punkt, über den du dir für ds Programm klar werden musst.
 | 
 
 
 Diese Werte haben alle das selbe Muster! Deswegen muss ich dort bei "5 y 9" mit dem zählen anfangen! Zum Schluss muss ich sagen können, wie viele von diesen Werten wie "5 y 9" vorhanden sind. Jeder dieser Kombinationen steht für einen Abschnitt! 	  | Code: |  	  | 5 y 9     4 u 5     4 v 1     8 w # | 
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 06.08.2017, 22:18    Titel: |   |  
				| 
 |  
				| Na, dann passt es doch.  Dann arbeite genau dieses Muster in deinem Programm ab _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 06.08.2017, 22:36    Titel: |   |  
				| 
 |  
				| Nicht ganz, denn es kann zu sogenannten Sonderfällen kommen, die das gesamte Muster durcheinander bringen können! Mein Plan ist eine TRF-Datei einzulesen. Wie man ja weiß, schreibe ich ein Auslosungsprogramm für Turniere. Wenn ich eine TRF-Datei speichern kann, sollte die auch wieder eingelesen können. 	  | nemored hat Folgendes geschrieben: |  	  | Na, dann passt es doch.  Dann arbeite genau dieses Muster in deinem Programm ab | 
 
 Dass ich da oben ein CNC-Programm mit reingeschrieben habe, liegt daran, dass ich das auch gleich für mein 2. Projekt gebrauchen kann!
 
 Aufbau einer TRF-Datei die eingelesen soll:
 
 
  	  | Code: |  	  | 012 022
 032
 042
 052
 062 11
 072 7
 092 Swiss System
 102
 122
 132
 XXR 7
 001    1 mGM  Testspieler                       2602 VAT                         0.0    0     6 b 1     4 w 1     2 b =     8 w =
 001    2 mGM  Test Oleg                         2600 BUL             00.00.1900  0.0    0     7 w 1     5 b 1     1 w =     3 b =
 001    3 m    Sedlak Ivan                       2074 SRB             00.00.1900  0.0    0     8 b 1    11 w 1     4 b 1     2 w =
 001    4 m    Schmidbauer Sepp                  1799 GER                         0.0    0     9 w 1     1 b 0     3 w 0    10 b 1
 001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1
 001    6 m    Test for Arbiter                  1100 VAT                         0.0    0     1 w 0     9 b 1    10 w 1     5 b 0
 001    7 m    Nur ein Test                      1000                             0.0    0     2 b 0     8 w 0  0000 - +    11 b 1
 001    8 mFM  Krstic Petar                      0000 SRB                         0.0    0     3 w 0     7 b 1     9 w 1     1 b =
 001    9 mCM  Sedan Markovic                    0000 SRB                         0.0    0     4 b 0     6 w 0     8 b 0  0000 - +
 001   10 m    Bauer Markus                      0000                             0.0    0     5 w 0  0000 - +     6 b 0     4 w 0
 001   11 m    Schneider Thomas                  0000 GER                         0.0    0  0000 - +     3 b 0     5 w 0     7 w 0
 
 | 
 
 Gruß
 ALWIM
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 07.08.2017, 09:50    Titel: |   |  
				| 
 |  
				| Man könnte natürlich auch in die Spezifikation schauen, dann muss man nicht raten.   
 Laut Spezifikation stehen zwischen Einträgen nicht einfach "ein oder auch mehrere Leerzeichen" (was auch Unsinn wäre, wenn das Leerzeichen zugleich Bestandteil eines Eintrages sein kann), sondern dein erstes Eintrag
 
 beginnt exakt an Position 92, das zweite Eintrag an Stelle 102 usw (es kann daher auch sein, dass zwischen zwei Einträgen gar kein Leerzeichen steht - zwar nicht bei den von dir gesuchten Zeichenfolgen, aber z. B. zwischen Geschlecht und Titel).
 
 Mit dieser genauen Zuordnung kannst du dann auch allein an der Zeilenlänge bereits sagen, wie viele Einträge insgesamt drinnen stehen.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 07.08.2017, 11:16    Titel: |   |  
				| 
 |  
				| Also praktisch die Anzahl der ausgelosten Runden? Denn die brauche ich ja! Könnte klappen? Sobald ich etwas mehr Zeit habe, nehme ich das mal in Angriff! 	  | nemored hat Folgendes geschrieben: |  	  | Man könnte natürlich auch in die Spezifikation schauen, dann muss man nicht raten.   
 Laut Spezifikation stehen zwischen Einträgen nicht einfach "ein oder auch mehrere Leerzeichen" (was auch Unsinn wäre, wenn das Leerzeichen zugleich Bestandteil eines Eintrages sein kann), sondern dein erstes Eintrag
 
 beginnt exakt an Position 92, das zweite Eintrag an Stelle 102 usw (es kann daher auch sein, dass zwischen zwei Einträgen gar kein Leerzeichen steht - zwar nicht bei den von dir gesuchten Zeichenfolgen, aber z. B. zwischen Geschlecht und Titel).
 
 Mit dieser genauen Zuordnung kannst du dann auch allein an der Zeilenlänge bereits sagen, wie viele Einträge insgesamt drinnen stehen.
 | 
 
 Vielen herzlichen Dank für die Hilfe!
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 07.08.2017, 11:55    Titel: |   |  
				| 
 |  
				| Was dir nemored damit sagen will ist, daß sich der eingelesene String aufgrund der exakt vorgegebenen Feldgrößen punktgenau zerlegen lässt. Und auch die Information über die Anzahl der Runden steckt dort schon drin:  	  | Code: |  	  | Dim As String DataIdentificationnumber, StartingrankNumber, Sex, Title, PlayerName, Rating, _ Federation, Number, Birth_Date, Points, Rank
 ReDim As String round(0)
 Dim As Integer rounds, x
 
 Dim As String TRFdata = "001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1"
 
 DataIdentificationnumber = Mid(TRFdata, 1, 3)
 If DataIdentificationnumber = "001" Then
 StartingrankNumber = Mid(TRFdata, 5, 4)
 '                                 |  |_____Feldgröße
 '                                 |________Feldbeginn
 Sex = Mid(TRFdata, 10, 1)
 Title = Mid(TRFdata, 11, 3)
 PlayerName = Mid(TRFdata, 15, 33)
 Rating = Mid(TRFdata, 49, 4)
 Federation = Mid(TRFdata, 54, 3)
 Number = Mid(TRFdata, 58, 11)
 Birth_Date = Mid(TRFdata, 70, 10)
 Points = Mid(TRFdata, 81, 4)
 Rank = Mid(TRFdata, 86, 4)
 rounds = ((Len(TRFdata) - 91) / 10)
 ReDim round(rounds)
 For x = 1 To rounds
 round(x) = Mid(TRFdata, x * 10 + 82, 8)
 Next
 EndIf
 
 ?   "DataIdentificationnumber "; DataIdentificationnumber
 ?   "      StartingrankNumber "; StartingrankNumber
 ?   "                     Sex "; Sex
 ?   "                   Title "; Title
 ?   "              PlayerName ";PlayerName
 ?   "                  Rating ";Rating
 ?   "              Federation ";Federation
 ?   "                  Number ";Number
 ?   "              Birth_Date ";Birth_Date
 ?   "                  Points ";Points
 ?   "                    Rank ";Rank
 For x = 1 To UBound(round)
 ? "                round ";x;" ";round(x)
 Next
 
 Sleep
 | 
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 08.08.2017, 17:37    Titel: |   |  
				| 
 |  
				| Ich kann es mir nicht verkneifen, eine solche Anwendung schreit geradezu nach einem UDT, und zwar zum Lesen und Erstellen eines Eintrags (@ ALWIM: Nein, wir hören NICHT auf, dich zu bearbeiten, schau mal, wie schön einfach die Handhabung damit wird!  ). Die Properties (das sind Prozeduren innerhalb des UDT, die im Programm aber wie Variablen angesprochen werden) lesen die Daten direkt aus dem String, ohne eigene Variablen zu belegen. Umgekehrt können Werte (neue oder geänderte) direkt in den String geschrieben werden, sie werden automatisch an der richtigen Stelle eingefügt. 
  	  | Code: |  	  | #Macro declareTRFproperty(pname) Declare Property pname As String 'zum lesen
 Declare Property pname(v As String) 'zum schreiben
 #EndMacro
 
 '(fast) alle properties haben die gleiche struktur, daher zur vereinfachung eine vordefinition als macro
 #Macro TRFproperty(prname, start, fieldlen, bnd)
 '                            |       |_____Feldgröße
 '                            |_____________Feldbeginn
 Property tTRF.prname As String
 Return Mid(TRFdata, start, fieldlen)
 End Property
 Property tTRF.prname(v As String)
 #If bnd = "r"
 Mid(TRFdata, start, fieldlen) = Right(String(fieldlen, " ") + v, fieldlen) 'rechtsbündig
 #ElseIf bnd = "l"
 Mid(TRFdata, start, fieldlen) = Left(v + String(fieldlen, " "), fieldlen) 'linksbündig
 #EndIf
 End Property
 #EndMacro
 
 Type tTRF
 As String TRFdata = String(91," ")
 declareTRFproperty(DataIdentificationnumber)
 declareTRFproperty(StartingrankNumber)
 declareTRFproperty(Sex)
 declareTRFproperty(Title)
 declareTRFproperty(PlayerName)
 declareTRFproperty(Rating)
 declareTRFproperty(Federation)
 declareTRFproperty(Number)
 declareTRFproperty(Birth_Date)
 declareTRFproperty(Points)
 declareTRFproperty(Rank)
 Declare Property rounds As Integer
 Declare Property round(r As Integer) As String
 Declare Property round(v As String)
 End Type
 
 TRFproperty(DataIdentificationnumber, 1, 3, "r")
 TRFproperty(StartingrankNumber, 5, 4, "r")
 TRFproperty(Sex, 10, 1, "r")
 TRFproperty(Title, 11, 3, "r")
 TRFproperty(PlayerName, 15, 33, "l")
 TRFproperty(Rating, 49, 4, "r")
 TRFproperty(Federation, 54, 3, "r")
 TRFproperty(Number, 58, 11, "r")
 TRFproperty(Birth_Date, 70, 10, "r")
 TRFproperty(Points, 81, 4, "r")
 TRFproperty(Rank, 86, 4, "r")
 
 Property tTRF.rounds As Integer 'anzahl der runden ermitteln
 Return (Len(TRFdata) - 91) / 10
 End Property
 
 Property tTRF.round(r As Integer) As String 'daten der runde r zurückgeben
 If r <= rounds Then
 Return Mid(TRFdata, r * 10 + 82, 8)
 Else
 Return ""
 EndIf
 End Property
 
 Property tTRF.round(r As String) 'neue runde an den string anhängen
 TRFdata += Right(String(10, " ") + r, 10)
 End Property
 
 '=== ENDE DER TYPENDEKLARATION ===
 
 ' ANWENDUNGSBEISPIELE
 
 Dim As tTRF trf, trf2 'kann auch als array dimensioniert werden
 
 With trf 'bestehenden eintrag auslesen
 .TRFdata = "001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1"
 
 ?   "DataIdentificationnumber ";.DataIdentificationnumber
 ?   "      StartingrankNumber ";.StartingrankNumber
 ?   "                     Sex ";.Sex
 ?   "                   Title ";.Title
 ?   "              PlayerName ";.PlayerName
 ?   "                  Rating ";.Rating
 ?   "              Federation ";.Federation
 ?   "                  Number ";.Number
 ?   "              Birth_Date ";.Birth_Date
 ?   "                  Points ";.Points
 ?   "                    Rank ";.Rank
 For x As Integer = 1 To .rounds
 ? "                round ";x;" ";.round(x)
 Next
 End With
 
 ?
 
 With trf2 'neuen eintrag anlegen
 .DataIdentificationnumber = "001"
 .StartingrankNumber = "5"
 .Sex = "m"
 .Title = "GM"
 .PlayerName = "Zufall Reiner"
 .Rating = "1234"
 .Federation = "GER"
 .Number = "56789"
 .Birth_Date = "08.08.2012"
 .Points = "0.0"
 .round = "0000 - +"
 .round = "7 b 1"
 .round = "10 w 1"
 .round = "1 b ="
 
 'kontrollausdruck
 ?   "DataIdentificationnumber ";.DataIdentificationnumber
 ?   "      StartingrankNumber ";.StartingrankNumber
 ?   "                     Sex ";.Sex
 ?   "                   Title ";.Title
 ?   "              PlayerName ";.PlayerName
 ?   "                  Rating ";.Rating
 ?   "              Federation ";.Federation
 ?   "                  Number ";.Number
 ?   "              Birth_Date ";.Birth_Date
 ?   "                  Points ";.Points
 ?   "                    Rank ";.Rank
 For x As Integer = 1 To .rounds
 ? "                round ";x;" ";.round(x)
 Next
 ?
 ? .TRFdata 'dieser string kann direkt in eine TRF-datei geschrieben werden
 End With
 
 Sleep
 
 | 
 
 Der UDT kann jetzt so erweitert werden, daß er die verschiedenen Einträge anhand der DataIdentificationnumber automatisch erkennt und entsprechend verwaltet. Und (@ ALWIM) wenn du später in einem anderen Programm einmal ein TRF - Verwaltungsprogramm benötigst, brauchst du dann nur die Typendeklaration dort hineinzukopieren und fertig - ohne eine einzige Zeile neu zu schreiben.
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 08.08.2017, 22:22    Titel: |   |  
				| 
 |  
				| Ich bin erstaunt, was ihr alles zusammenbringt! 	  | grindstone hat Folgendes geschrieben: |  	  | Ich kann es mir nicht verkneifen, eine solche Anwendung schreit geradezu nach einem UDT, und zwar zum Lesen und Erstellen eines Eintrags (@ ALWIM: Nein, wir hören NICHT auf, dich zu bearbeiten, schau mal, wie schön einfach die Handhabung damit wird!  ). Die Properties (das sind Prozeduren innerhalb des UDT, die im Programm aber wie Variablen angesprochen werden) lesen die Daten direkt aus dem String, ohne eigene Variablen zu belegen. Umgekehrt können Werte (neue oder geänderte) direkt in den String geschrieben werden, sie werden automatisch an der richtigen Stelle eingefügt. 
  	  | Code: |  	  | #Macro declareTRFproperty(pname) Declare Property pname As String 'zum lesen
 Declare Property pname(v As String) 'zum schreiben
 #EndMacro
 
 '(fast) alle properties haben die gleiche struktur, daher zur vereinfachung eine vordefinition als macro
 #Macro TRFproperty(prname, start, fieldlen, bnd)
 '                            |       |_____Feldgröße
 '                            |_____________Feldbeginn
 Property tTRF.prname As String
 Return Mid(TRFdata, start, fieldlen)
 End Property
 Property tTRF.prname(v As String)
 #If bnd = "r"
 Mid(TRFdata, start, fieldlen) = Right(String(fieldlen, " ") + v, fieldlen) 'rechtsbündig
 #ElseIf bnd = "l"
 Mid(TRFdata, start, fieldlen) = Left(v + String(fieldlen, " "), fieldlen) 'linksbündig
 #EndIf
 End Property
 #EndMacro
 
 Type tTRF
 As String TRFdata = String(91," ")
 declareTRFproperty(DataIdentificationnumber)
 declareTRFproperty(StartingrankNumber)
 declareTRFproperty(Sex)
 declareTRFproperty(Title)
 declareTRFproperty(PlayerName)
 declareTRFproperty(Rating)
 declareTRFproperty(Federation)
 declareTRFproperty(Number)
 declareTRFproperty(Birth_Date)
 declareTRFproperty(Points)
 declareTRFproperty(Rank)
 Declare Property rounds As Integer
 Declare Property round(r As Integer) As String
 Declare Property round(v As String)
 End Type
 
 TRFproperty(DataIdentificationnumber, 1, 3, "r")
 TRFproperty(StartingrankNumber, 5, 4, "r")
 TRFproperty(Sex, 10, 1, "r")
 TRFproperty(Title, 11, 3, "r")
 TRFproperty(PlayerName, 15, 33, "l")
 TRFproperty(Rating, 49, 4, "r")
 TRFproperty(Federation, 54, 3, "r")
 TRFproperty(Number, 58, 11, "r")
 TRFproperty(Birth_Date, 70, 10, "r")
 TRFproperty(Points, 81, 4, "r")
 TRFproperty(Rank, 86, 4, "r")
 
 Property tTRF.rounds As Integer 'anzahl der runden ermitteln
 Return (Len(TRFdata) - 91) / 10
 End Property
 
 Property tTRF.round(r As Integer) As String 'daten der runde r zurückgeben
 If r <= rounds Then
 Return Mid(TRFdata, r * 10 + 82, 8)
 Else
 Return ""
 EndIf
 End Property
 
 Property tTRF.round(r As String) 'neue runde an den string anhängen
 TRFdata += Right(String(10, " ") + r, 10)
 End Property
 
 '=== ENDE DER TYPENDEKLARATION ===
 
 ' ANWENDUNGSBEISPIELE
 
 Dim As tTRF trf, trf2 'kann auch als array dimensioniert werden
 
 With trf 'bestehenden eintrag auslesen
 .TRFdata = "001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1"
 
 ?   "DataIdentificationnumber ";.DataIdentificationnumber
 ?   "      StartingrankNumber ";.StartingrankNumber
 ?   "                     Sex ";.Sex
 ?   "                   Title ";.Title
 ?   "              PlayerName ";.PlayerName
 ?   "                  Rating ";.Rating
 ?   "              Federation ";.Federation
 ?   "                  Number ";.Number
 ?   "              Birth_Date ";.Birth_Date
 ?   "                  Points ";.Points
 ?   "                    Rank ";.Rank
 For x As Integer = 1 To .rounds
 ? "                round ";x;" ";.round(x)
 Next
 End With
 
 ?
 
 With trf2 'neuen eintrag anlegen
 .DataIdentificationnumber = "001"
 .StartingrankNumber = "5"
 .Sex = "m"
 .Title = "GM"
 .PlayerName = "Zufall Reiner"
 .Rating = "1234"
 .Federation = "GER"
 .Number = "56789"
 .Birth_Date = "08.08.2012"
 .Points = "0.0"
 .round = "0000 - +"
 .round = "7 b 1"
 .round = "10 w 1"
 .round = "1 b ="
 
 'kontrollausdruck
 ?   "DataIdentificationnumber ";.DataIdentificationnumber
 ?   "      StartingrankNumber ";.StartingrankNumber
 ?   "                     Sex ";.Sex
 ?   "                   Title ";.Title
 ?   "              PlayerName ";.PlayerName
 ?   "                  Rating ";.Rating
 ?   "              Federation ";.Federation
 ?   "                  Number ";.Number
 ?   "              Birth_Date ";.Birth_Date
 ?   "                  Points ";.Points
 ?   "                    Rank ";.Rank
 For x As Integer = 1 To .rounds
 ? "                round ";x;" ";.round(x)
 Next
 ?
 ? .TRFdata 'dieser string kann direkt in eine TRF-datei geschrieben werden
 End With
 
 Sleep
 
 | 
 
 Der UDT kann jetzt so erweitert werden, daß er die verschiedenen Einträge anhand der DataIdentificationnumber automatisch erkennt und entsprechend verwaltet. Und (@ ALWIM) wenn du später in einem anderen Programm einmal ein TRF - Verwaltungsprogramm benötigst, brauchst du dann nur die Typendeklaration dort hineinzukopieren und fertig - ohne eine einzige Zeile neu zu schreiben.
 
 Gruß
 grindstone
 | 
   
 Netter Versuch, aber ich bin bereits dran! Mit UDT zu programmieren, ist nicht mein Stil. 	  | Zitat: |  	  | (@ ALWIM: Nein, wir hören NICHT auf, dich zu bearbeiten, schau mal, wie schön einfach die Handhabung damit wird!  ). | 
   Ich habe jetzt, zumindest einen Lösungsansatz. Das was ihr mir da gepostet habt, kann ich sowieso nicht gebrauchen! Würde aber theoretisch funktionieren, wenn ich das restliche noch mit rein programmiere und ein wenig umändere.
 
 
 Ist natürlich klar, dass ich das auswerten kann, wenn die Werte exakt an bestimmten Positionen liegen. Daran habe ich zunächst nicht gedacht... 	  | Zitat: |  	  | Was dir nemored damit sagen will ist, daß sich der eingelesene String aufgrund der exakt vorgegebenen Feldgrößen punktgenau zerlegen lässt. | 
 Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche! Das geht nämlich. Ich muss nur bestimmte Dinge drin haben! Und dazu, zählt halt auch das laden einer TRF/FID-Datei!
 
 Gruß
 ALWIM
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 08.08.2017, 23:25    Titel: |   |  
				| 
 |  
				| Wenn du grindstones UDT-Vorschlag hernimmst (den kannst du auch in eine extra Datei auslagern und mit #INCLUDE einbinden -dann bekommst du das "komplizierte UDT-Gedöns" nie mehr zu Gesicht), dann geht das Laden aus einer TRF-Datei sehr einfach: 
 
  	  | Code: |  	  | DIM AS tTRF eintrag ' ...
 ' Datei öffnen usw.
 '...
 ' Datenzeile einlesen und enthaltenen Spielernamen ausgeben
 LINE INPUT #dateinummer, eintrag.TRFdata
 PRINT TRIM(eintrag.PlayerName); " hat"; eintrag.rounds; " Runden gespielt."
 | 
 Ist auch nicht komplizierter als das Verwenden von normalen Variablen; kommt halt im Namen ein Punkt mit vor. Allerdings musst du überhaupt gar nichts mehr extrahieren, denn das wird schon für dich erledigt. (Ob es sich um Spielerdaten handelt, sprich: ob der Eintrag mit "001" beginnt, musst du allerdings prüfen.)
 
 @grindstone: schönes und umfassendes Beispiel; aber um bei jemandem, der noch nicht mit UDTs gearbeitet hat, für UDTs zu werben, ist es viel zu kompliziert.
  _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 09.08.2017, 21:38    Titel: |   |  
				| 
 |  
				| Soll ja auch nur zeigen, was damit alles möglich ist. Im Moment geht es ALWIM ja scheinbar sowieso nur ums Auslesen, und auch nur deshalb, weil es im Anforderungskatalog steht. 	  | nemored hat Folgendes geschrieben: |  	  | ...um bei jemandem, der noch nicht mit UDTs gearbeitet hat, für UDTs zu werben, ist es viel zu kompliziert. happy | 
 
 
 Auf jeden Fall wünsche ich dir viel Erfolg! 	  | ALWIM hat Folgendes geschrieben: |  	  | Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche! | 
   
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 09.08.2017, 22:11    Titel: |   |  
				| 
 |  
				| Nicht nur ums auslesen, auch ums schreiben! Aber das habe ich ja bereits programmiert. Im Anforderungskatalog, stehen so einige Sachen drin. Schon erstaunlich was die alles verlangen! Bis auf das Einlesen der TRF-Datei habe ich bereits alles drin. 	  | grindstone hat Folgendes geschrieben: |  	  | Soll ja auch nur zeigen, was damit alles möglich ist. Im Moment geht es ALWIM ja scheinbar sowieso nur ums Auslesen, und auch nur deshalb, weil es im Anforderungskatalog steht. 	  | nemored hat Folgendes geschrieben: |  	  | ...um bei jemandem, der noch nicht mit UDTs gearbeitet hat, für UDTs zu werben, ist es viel zu kompliziert. happy | 
 
 
 Auf jeden Fall wünsche ich dir viel Erfolg! 	  | ALWIM hat Folgendes geschrieben: |  	  | Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche! | 
   
 Gruß
 grindstone
 | 
 
 
 Eventuell reiche ich es ein! Aber geplant ist es zunächst ein mal. Ich bin schon extrem weit gekommen! Die Spieler werden schon mal per TRF eingelesen! Jetzt fehlen nur noch die Paarungen mit den Ergebnissen. 	  | Zitat: |  	  | Auf jeden Fall wünsche ich dir viel Erfolg! 	  | ALWIM hat Folgendes geschrieben: |  	  | Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche! | 
  | 
 
 Gruß
 ALWIM
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  |