Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mehrere zahlen aus einen string filtern? (https://www.delphipraxis.net/50019-mehrere-zahlen-aus-einen-string-filtern.html)

Prym 19. Jul 2005 19:08


mehrere zahlen aus einen string filtern?
 
also erstmal das string beispiel;
---------------String------------------------------------------
Wort1 (30)
text text texttext text texttext text texttext text
text text texttext text texttext text texttext text text
text text texttext text texttext text texttext text text
text text texttext text texttext text texttext text text


wort2 (26)
text text texttext text texttext text texttext text text
text text texttext text texttext text texttext text text
text text texttext text texttext text texttext text text

wort4 (15)
text text texttext text texttext text texttext text text
text text texttext text texttext text texttext text text
text text texttext text texttext text texttext text text
----------------String------------------------------------------



so nun möchte ich das die zahl bei wort1(das sind immer sone ar schlüsselwörter also die zahlen stehen immer neben den selben wörtern) in das edit1 feld rein kommt die zahl neben dem wort2 in das 2te edit feld usw

nun wollte ich fragen wie man sowas am besten macht?

Ultimator 19. Jul 2005 19:13

Re: mehrere zahlen aus einen string filtern?
 
Mit Delphi-Referenz durchsuchenPos nach dem ersten Vorkommen einer Klammer suchen, die Zahl in der Klammer auslesen und dann das ganze mit Delphi-Referenz durchsuchenPosEx wiederholen, bis keine Klammern mehr gefunden werden.
Du hast nur ein Problem: Nämlich wenn im Text auch Klammern vorkommen.
Du könntest höchstens überprüfen, ob kurz hinter dem Wort "wort" die Klammer kommt.

marabu 19. Jul 2005 19:14

Re: mehrere zahlen aus einen string filtern?
 
Hallo Prym,

da könnte dir die Funktion ExtractBetween() helfen.

Grüße vom marabu

100nF 19. Jul 2005 19:37

Re: mehrere zahlen aus einen string filtern?
 
hallo,

ich hatte grad zeit, darum hab ich mal ein bisschen gecodet...
ich denke es gibt schönere methoden, aber sie muss ja nicht mehr als funktionieren...
hier der code der dabei entstanden ist:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, max: integer; s, text: string;
begin
  text := // der text der durchsucht werden muss
  max := // wieviele edits gibts? oder: wieviele "wortx" gibts?

  s := text;
  for i:=1 to max do
    if pos('wort'+inttostr(i), s) <> 0 then
    begin
      delete(s, 1, pos('wort'+inttostr(i), s)+length('wort'+inttostr(i))+1);
      delete(s, pos(')', s), length(s));
      (findcomponent('Edit'+inttostr(i)) as TEdit).text := s;
      s := text;
    end;
end;
wichtig ist, dass wortx immer klein geschrieben ist. oder falls es gross sein soll musst du alle "wort" im code auch gross schreiben

gruss
urbanbruhin

Prym 22. Jul 2005 17:13

Re: mehrere zahlen aus einen string filtern?
 
guten tag ich habe das jetzt anders gelöst aber damit habe ich ein problen was eigentlich nicht sein dürfte

Delphi-Quellcode:
procedure TForm1.Button68Click(Sender: TObject);
var Pla : integer;
geb,fleet,def,StrZahl : string;

i,posWort,posklam : integer;
begin

Pla := Strtointdef(CBPL.Text,0);
if (pla <1) and (pla>9) then
begin
showmessage('Ungültiger Planet');
exit;
end;

 if CBMond.Checked = true then
 begin
  geb:=memogeb.text;
  //fleet:=memofleet.text;
  //def:=memodef.text;
  {----A--------------------Gebäude-----------------------------}
   if geb <>'' then
   begin
    ///////////////////////////////////////////////////////
    PosWort:=pos('Roboterfabrik',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<50) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mrobf') as TEdit).text :=Strzahl ;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
   ///////////////////////////////////////////
    PosWort:=pos('Raumschiffwerft',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<50) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mraumw') as TEdit).text :=Strzahl ;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
    ///////////////////////////////////////////////////////
    PosWort:=pos('Metallspeicher',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<50) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mmets') as TEdit).text :=Strzahl;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
    ///////////////////////////////////////////////////////
    PosWort:=pos('Kristallspeicher',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<50) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mkriss') as TEdit).text :=Strzahl;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
    ///////////////////////////////////////////////////////
    PosWort:=pos('Deuteriumtank',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<50) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mdeuts') as TEdit).text :=Strzahl;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
    ///////////////////////////////////////////////////////
    PosWort:=pos('Mondbasis',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<50) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mmon') as TEdit).text :=Strzahl;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
    ///////////////////////////////////////////////////////
    PosWort:=pos('Sensorphalanx',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<100) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mSen') as TEdit).text :=Strzahl;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
    ///////////////////////////////////////////////////////
    PosWort:=pos('Sprungtor',geb);
    PosKlam:=pos(')',geb);
    if (PosWort<>0) and ((PosKlam-PosWort)<50) then
    begin
      for i := PosWort to PosKlam do
      begin
       If geb[i] in ['0','1','2','3','4','5','6','7','8','9'] Then
       Strzahl:= StrZahl+geb[i];
      end;
      (findcomponent('edtpl'+inttostr(pla)+'mst') as TEdit).text :=Strzahl;
      delete(geb,(pos(')',geb)),(pos(')',geb))+1);
      Strzahl:='';
    end;
    ///////////////////////////////////////////////////////
   end;
   {----A--------------------Gebäude-----------------------------}
 end;
end;
mein problem es wird alles sehr schön eingelesen bis Sensorphalanx :?:

hir ist der string dazu:
--------------------------------------------------------------------------------------------------
Roboterfabrik (Stufe 2)
Roboterfabriken stellen einfache Arbeitskräfte zur Verfügung, die beim Bau der planetaren Infrastruktur eingesetzt werden können. Jede Stufe erhöht damit die Geschwindigkeit des Ausbaus von Gebäuden.
Benötigt: Metall:1.600 Kristall:480 Deuterium:800
Produktionsdauer: 16m 38s
Ausbau
auf Stufe 3
Raumschiffwerft (Stufe 5)
In der planetaren Werft werden alle Arten von Schiffen und Verteidigungsanlagen gebaut.
Benötigt: Metall:12.800 Kristall:6.400 Deuterium:3.200
Produktionsdauer: 2h 33m 36s
Ausbau
auf Stufe 6
Metallspeicher
Lagerstätte für unbearbeitete Metallerze bevor sie weiter verarbeitet werden.
Benötigt: Metall:2.000 Kristall:0
Produktionsdauer: 16m 00s
bauen
Kristallspeicher
Lagerstätte für unbearbeitetes Kristall bevor es weiter verarbeitet wird.
Benötigt: Metall:2.000 Kristall:1.000
Produktionsdauer: 24m 00s
bauen
Deuteriumtank
Riesige Tanks zur Lagerung des neu gewonnenen Deuteriums.
Benötigt: Metall:2.000 Kristall:2.000
Produktionsdauer: 32m 00s
bauen
Mondbasis (Stufe 4)
Ein Mond verfügt über keinerlei Atmosphäre, deshalb muss vor der Besiedlung eine Mondbasis errichtet werden.
Benötigt: Metall:320.000 Kristall:640.000 Deuterium:320.000
Produktionsdauer: 5 Tage 8h 00m 00s
Ausbau
auf Stufe 5
Sensorphalanx (Stufe 1)
Die Sensorphalanx erlaubt es Flottenbewegungen zu beobachten. Je höher die Ausbaustufe, desto größer die Reichweite der Phalanx.
Benötigt: Metall:40.000 Kristall:80.000 Deuterium:40.000
Produktionsdauer: 16h 00m 00s
----------------------------------------------------------------------------------------------------

könnte einer wissen warum?

barf00s 22. Jul 2005 17:14

Re: mehrere zahlen aus einen string filtern?
 
SScanF() google ist euer freund

Urmel 22. Jul 2005 17:16

Re: mehrere zahlen aus einen string filtern?
 
Zitat:

Zitat von barf00s
SScanF() google ist euer freund

Kannst Du auch mal vernünftige Antworten geben?
Wenn nein -> .....


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz