centauri Geschrieben 24. Februar 2004 Teilen Geschrieben 24. Februar 2004 Erz (360): 4.579 Kristalle (150): 2.397 Aluminium (200): 3.139 Energie (65): 111.267 Legierungen (110): 1.639 Credits insgesamt: 340.943,65 dort will ich von erz, alu, leg, kris und enrg jeweils die zahl hinter den doppelpunkten auslesen und sie einer variablen zu weisen so dass ich nacher variablen in integer habe die wie folgt aussehen: erz=4579; alu=3139; leg=1639; kris=2397; enrg=111267; die zahlen in den klammern sowie die späteren variablen (zahlen hinter dem doppelpunkt) sind bei jeder neuberechnung anderst (komplettes memo wird aus externem prog eingefügt). Die Zahlen bewegen sich wahrscheinlic bis in einen bereich von 12 stellen, koennten aber auch mehr sein. aber nicht unendlich. Jetzt hab ich das problem wie krieg ich des hin? hat vielleicht jemand eine idee oder schon ein fertigen code den man anpassen könnte? bis jetzt hab ichs mal so probiert: {© by Himitsu} {Org by "Jens Schumann"} Function TForm3.GetNumbers(L: TStrings; aStart, aEnd: String; aPos: Integer): String; Function DeleteNonNumbers(Const Value: String): String; Var I: Integer; Begin Result := ''; For I := 1 to Length(Value) do Begin If Value[I] in ['0'..'9', ',', '-'] Then Result := Result + Value[I]; If Value[I] = '.' Then Result := Result + ''; End; {eventuelle Tausendertrennzeichen entfernen} End; Var H: String; iCnt: Integer; aCount: Integer; Begin Result := '0'; aStart := AnsiUpperCase(aStart); aEnd := AnsiUpperCase(aEnd); aCount := 0; For iCnt := 0 to L.Count - 1 do Begin H := AnsiUpperCase(L[iCnt]); If (Pos(aStart, H) > 0) and (Pos(aEnd, H) > 0) Then Begin Inc(aCount); If aCount = aPos Then Begin H := Copy(L[iCnt], Pos(aStart, H) + Length(aStart), Pos(aEnd, H) - Pos(aStart, H) - Length(aStart)); H := DeleteNonNumbers(H); If H > '' Then Result := H Else Result := '0'; break; End; End; End; End; hab damit aber nur erz, alu und leg auslesen können... würd mich freuen wenn mir jemand helfen könnte... greetz centauri Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
beetFreeQ Geschrieben 25. Februar 2004 Teilen Geschrieben 25. Februar 2004 Hmm, also ich würd's so machen: Du lässt das komplette Memo in einer Schleife durchlaufen. Diese soll solange laufen, wie sie Doppelpunkte im String findet. Nun suchst du immer mit Pos die Position des nächsten Doppelpunkts und löschst mit Delete den Teil bis zu diesem Doppelpunkt. Dann löschst du vorne das Leerzeichen weg und holst du dir mit Pos die Position des nächsten Leerzeichens - das ja dann hinter der Zahl liegt. Den String bis zu dieser Position holst du dir dann mit Copy heraus, entfernst noch mit StringReplace den Tausendertrenner und schreibst die Zahl in dein Array. Dann geht das Spiel (sprich die Schleife) wieder von vorn los... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 26. Februar 2004 Teilen Geschrieben 26. Februar 2004 Original geschrieben von centauri Erz (360): 4.579 Kristalle (150): 2.397 Aluminium (200): 3.139 Energie (65): 111.267 Legierungen (110): 1.639 Credits insgesamt: 340.943,65 dort will ich von erz, alu, leg, kris und enrg jeweils die zahl hinter den doppelpunkten auslesen und sie einer variablen zu weisen so dass ich nacher variablen in integer habe die wie folgt aussehen: erz=4579; alu=3139; leg=1639; kris=2397; enrg=111267; hmm... ich würde erstmal jeden Wert in eine eigene Zeile bringen. Dazu kannst du nach dem ersten ": " (Doppelpunk und Leerzeichen) suchen. Von dieser Position gehst du dann weiter bis zum ersten Leerzeichen. Nimmst den Rest des String, trimmst ihn und fügst ihn unter der aktuellen zeile ein. Wenn die Reihenfolge nicht wichtig ist am Ende, ist dann etwas einfacher. Ungefähr so: var i, p: Integer; tmpStr: String; ErgList: TStringList; [...] for i:= 0 to Strings.Count - 1 do begin // String in einen temp. String kopieren tmpStr:= Strings[i]; // Position Doppelpunkt Leerzeichen bestimmen p:= Pos(': ', tmpStr); if p> 0 then begin // Position erstes Leerzeichen danach (also nach der Zahl) while tmpStr[p] <> ' ' do begin Inc(p) end; // ersten Wert in ErgebnisListe kopieren ErgList.Add(copy(tmpStr, 1, p)); // zweiten Wert kopieren ErgList.Add(trim(copy(tmpStr, p+1, Length(tmpStr)))); end; end; Das ist nicht getestet, sollte aber jeden Wert in eine eigene Zeile kopieren. Ach ja, hab jetzt eine 2te StringListe genommen, die musst du noch irgendwo erzeugen. Ist ja erstmal nur ne Überlegung. Wenn du das hast (und es funktioniert wie gedacht ) sollte die Liste jetzt so aussehen: ErgList: Erz (360): 4.579 Kristalle (150): 2.397 Aluminium (200): 3.139 Energie (65): 111.267 Legierungen (110): 1.639 Credits insgesamt: 340.943,65 Als nächstes gehst du diese Liste durch und ersetzt alle Doppelpunkte durch ein '=' (Gleichheitszeichen. Danach entfernst du noch alle Punkte und Kommas. also sowas hier: ErgList: Erz (360)= 4579 Kristalle (150)= 2397 Aluminium (200)= 3139 Energie (65)= 111267 Legierungen (110)= 1639 Credits insgesamt= 34094365 Jetzt kannst du auf den Wert folgendermassen zugreifen. var erz: Integer; erz:= StrToInt(ErgList.Values['Erz (360)']); Natürlich könntest du vorher noch die Klammern entfernen. Aber ist ja nur ein Denkanstoß Code ist nicht getestet sondern einfach so ausgedacht. EDIT: Du könntest dir das Ersetzen der Doppelpunkte durch '=' ersparen wenn du einfach: ErgList.NameValueSeparator:= ':'; machst Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.