Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Delphi: zahlen aus unterschiedlichen memos auslesen

Empfohlene Antworten

Veröffentlicht

 

 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

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.