![]() |
Zeile mit mehreren Werten versch. Variablen zuweisen
hallo,
möchte mehrere Werte aus einer Zeile (zB.Delphi Listbox) verschiedenen Variablen(arrays) zuweisen Beispiel: x y z 10.75 6.69 20.50 10.90 6.71 20.92 11.06 6.73 21.10 Die konkrete Frage: Wie lässt sich eine Text-Zeile in (hier drei) Zahlen-Werte trennen? Kann mir jemand weiter helfen? Danke schon mal Grüsse Alfred |
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Ich würde zuerst deine ListBox items in seperate strings speichern, dann auf die einzelnen strings ein Split auf " " ausführen und schon hast du ein (string)-array.
Das array kannst du dann iterieren um zu versuchen die zahlen in gleitkommawerte umzuwandeln. |
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Evtl. so was in der Art (D10.3.3 oder neuer):
Delphi-Quellcode:
Grüße
var
StrArr: TStringDynArray; XYZArr: Array[0..2] of Integer; begin for var s in ListBox.Items do begin StrArr := s.Split('.'); // und hier die einzelnen Array Elemente des String Arrays in dein anderes ARray kopieren for var i := 0 to Length(StrArr)-1 do XYZArr[i] := StrArr[i].ToInteger; // und dann XYZArr zu deiner Liste hinzufügen oder so end; TurboMagic |
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Zitat:
|
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Delphi-Quellcode:
Soeben getestet.
type
TmyRec = packed record x,y,z: Double; end; procedure TForm4.Button1Click(Sender: TObject); const values = String('10.75 6.69 20.50'); // als beispiel für eines deiner zeilen var sa: TStringDynArray; rec: TmyRec; i: Integer; FormatSettings: TFormatSettings; begin rec.x := 0.0; rec.y := 0.0; rec.z := 0.0; FormatSettings.DecimalSeparator := '.'; sa := String(values).Split([' ']); for i := Low(sa) to High(sa) do begin Memo1.Lines.Add('Value #' + IntToStr(i) + ' = ' + sa[i]); case i of 0: rec.x := StrToFloat(sa[i], FormatSettings); 1: rec.y := StrToFloat(sa[i], FormatSettings); 2: rec.z := StrToFloat(sa[i], FormatSettings); end; end; Memo1.Lines.Add('X: ' + FloatToStr(rec.x)); Memo1.Lines.Add('Y: ' + FloatToStr(rec.y)); Memo1.Lines.Add('Z: ' + FloatToStr(rec.z)); end; |
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Zitat:
Aber man kann ja am ' ' splitten... Das XYZArr muss dann natürlich Single oder DOuble oder so sein... Grüße TurboMagic |
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Ich glaub nicht das es so geht da er als Dezimaltrenner einen Punkt verwendet. (habs aber nicht getestet mit .ToDouble)
|
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Danke für eure Tipps!
|
AW: Zeile mit mehreren Werten versch. Variablen zuweisen
Hallo,
ich habe das Beispiel von KodeZwerg noch einmal aufgegriffen und leicht angepasst. Natürlich funktioniert der Code sehr gut, wenn der Aufbau der Zeile jedoch falsch ist, kann es hier zu Fehler kommen. Des Weiteren verwende ich in meinem Beispiel den Globalen Record FormatSettings. Möchte aber nicht verschweigen, dass diese Variante bei Verwendung von Threads durchaus zu Fehler führen könnte (möchte dies hier nicht weiter vertiefen). Weiterhin könnte man noch statt StrToFloatDef auch StrToFloat innerhalb von "try except end" verwenden, um auch einen Fehler ausgeben zu können, falls z.B. Buchstaben in der Zeile verwendet werden(in meinem Beispiel wird in dem Fall die Variable auf 0 gesetzt). "Try Finally end" habe ich verwendet, um sicherzustellen, dass nach Exit auch der Globale Wert für DecimalSeparator wieder auf den ursprünglichen Wert gesetzt wird.
Delphi-Quellcode:
type
TmyRec = packed record x,y,z: Double; end; procedure TForm1.Button1Click(Sender: TObject); const //Values könnte vom Namen her auch ein Integer Array sein strValues = String('10.75 6.69 20.50'); // als Beispiel für eines deiner Zeilen var sa: TArray<String>; //ist das gleiche, es muss jedoch nicht System.Types in die Uses eingefügt werden rec: TmyRec; //FormatSettings: TFormatSettings; Es kann auch die Globale Variable verwendet werden; OldDecimalSeparator: Char; begin rec.x := 0.0; rec.y := 0.0; rec.z := 0.0; OldDecimalSeparator := FormatSettings.DecimalSeparator; try FormatSettings.DecimalSeparator := '.'; sa := String(strValues).Split([' ']); if high(sa) = 2 then begin rec.x := StrToFloatDef(sa[0],0); rec.y := StrToFloatDef(sa[1],0); rec.z := StrToFloatDef(sa[2],0); end else begin Memo1.Lines.Add('Fehlerhafte Anzahl!'); Exit; end; Memo1.Lines.Add('X: ' + rec.x.ToString); Memo1.Lines.Add('Y: ' + rec.y.ToString); Memo1.Lines.Add('Z: ' + rec.z.ToString); finally FormatSettings.DecimalSeparator := OldDecimalSeparator; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz