Zum Inhalt springen

Delphi: zahlen aus unterschiedlichen memos auslesen


centauri

Empfohlene Beiträge

 

 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...