Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String zerlegen, auslesen und weiterverwenden (https://www.delphipraxis.net/54126-string-zerlegen-auslesen-und-weiterverwenden.html)

stonimahoni 28. Sep 2005 14:05


String zerlegen, auslesen und weiterverwenden
 
Hi Leute...

meinereiner hat mal wieder ne Frage :

Da ich mich mit Strings bzw. dem auslesen von Strings noch nicht so auskenne, bräuchte ich mal (wieder) Eure Hilfe.

Also :
(kleiner vorlauf):
Ich habe ein DBGrid, markiere mehrere Zeilen, führe dann eine prozedur durch...
also das ganze in einer Zählschleife von
Delphi-Quellcode:
i := o to blablagrid -1 .....
Aber das ist eher Nebensache;

Ich schreibe mir während dem Durchlauf dieser Schleife die ganzen Auftragsnummern in einen Tempstring - in diesem stehen dann die Auftragsnummern mit Komma voneinander getrennt.

Also z.B. tempstring enthält dann '2,14,23,48,55'

Soooo....nun würde ich gern in einem neuen Schritt ermitteln wieviel Auftragsnummern in diesem String drinstehen weil ich eine weitere Zählschleife machen will.
ich nehme an das würde ich mit
Delphi-Quellcode:
for i := 0 to length(tempstring)-1 do..
machen


und nun würde ich gern den tempstring immer bis zum komma auslesen und dann zu der jeweiligen auftragsnummer etwas ausführen.
und das halt jeweils für alle auftragsnummern, die in dem tempstring drinstehen.

wie kann ich das realisieren ?


vielen dank schonmal

mfg

carsten

ibp 28. Sep 2005 14:11

Re: String zerlegen, auslesen und weiterverwenden
 
die funktion pos ist dein freund!

Luckie 28. Sep 2005 14:13

Re: String zerlegen, auslesen und weiterverwenden
 
ExplodeExplode sollte das sein, was du suchst.

himitsu 28. Sep 2005 14:23

Re: String zerlegen, auslesen und weiterverwenden
 
Nun ja, du könntest zum einem den String Zeichen für Zeichen abarbeiten und prüfen was dat für'n Zeichen ist ... wenn es ein komma ist, dann steht ja die Zahl zwischen diesem und dem vorher gefundenem Komma.

Es ist aber auch möglich, per PosEx das nächste komma zu suchen.


oder du machst es dir einfacher:

entder ein dynamisches array

Delphi-Quellcode:
Var XYZ: Array of String;

//wert hinzufügen
SetLength(XYZ, Length(XYZ) + 1);
XYZ[High(XYZ)] := ...;


Anzahl := Length(XYZ);
oder noch einfacher ... ein TStringList, da kann man per .add etwas hinzufügen und mit .count die Anzahl erhalten.


@idp: pos findet nur das erste komma :zwinker:

und luckies explode kann man natürlich auch verwenden, aber warum erst die einzelstrings zusammenmixen und dann wieder trennen, wenn man die ja gleich getrennt lassen kann?

ibp 28. Sep 2005 14:31

Re: String zerlegen, auslesen und weiterverwenden
 
Zitat:

Zitat von himitsu
@idp: pos findet nur das erste komma :zwinker:

das war ja nur der anfang naürlich muss er dann ja auch noch ein wenig weiterdenken!

stonimahoni 29. Sep 2005 08:10

Re: String zerlegen, auslesen und weiterverwenden
 
Moin Leute...


hatte gestern ein wenig rumprobiert aber irgendwie komme ich auf keinen grünen Zweig :(

Mit den ganzen Funktionen hatte ich bisher noch nie gearbeitet, daher sind die absolut neu für mich und ich hab bei den Teilen irgendwie ein Verständnisproblem :(

Ich glaub ich bekomme hin dass ich mir per pos das erste komma vielleicht auch alle weiteren kommasanzeigen bzw auslesen lassen kann, aber ich wüsste so nicht was mir das bringt *aufdemschlauchsteh*

vom denken her würde ich das so angehen :

für die gesamtlänge des tempstrings soll immer bis zum nächsten komma gelesen werden und für die zahlen jeweils vor dem komma "als gesamtes" ( ist ja eine auftragsnummer z.b. 13 oder 128) möchte ich dann eine prozedur ausführen (abarbeitung der einzelnen zahlenblöcke)

hoffe ihr versteht was ich meine


*solangsamverzweifelt*


mfg

carsten

Sidorion 29. Sep 2005 08:27

Re: String zerlegen, auslesen und weiterverwenden
 
Du erstellst Dir eine TStringList-Instanz, weist dieser deinen String in die Eigenschaft CommaText zu und vòila, du hast:
1. die Anzahl der Auftragsnummern (Count).
2. Die Nummern selber (Items[Index]).
Ich hoffe, ich konnte helfen.

Sharky 29. Sep 2005 08:27

Re: String zerlegen, auslesen und weiterverwenden
 
Hai stonimahoni,

wie schon erwähnt würde ich das ganze mit einer StringListe machen. Das ganz könnte dann zum Beispiel so aussehen:
Delphi-Quellcode:
procedure TForm1.btn_GetAuftraegeClick(Sender: TObject);
var
  sl: TStringList;
  ndx: integer;
begin
  if DBGrid1.SelectedRows.Count > 0 then // Ist etwas markiert?
  begin
    sl := TStringList.Create; // StringListe erzeugen
    try
      with DBGrid1.DataSource.DataSet do
      begin
        for ndx := 0 to DBGrid1.SelectedRows.Count - 1 do // Alle markierten Datensätze durchlaufen
        begin
          GotoBookmark(pointer(DBGrid1.SelectedRows.Items[ndx])); // Zum markierten DS springen
          sl.Add(FieldByName('auftragsnummer').AsString); // Auftragsnummer aus der Tabelle lesen
        end
      end;
      ShowMessage(Format('Es gibt %d Auftragsnummern', [sl.Count])); // Anzahl der Einträge anzeigen
    finally
      sl.Free;
    end;
  end;
end;

ibp 29. Sep 2005 09:09

Re: String zerlegen, auslesen und weiterverwenden
 
damit man mit den string-funktionen lernt...

Delphi-Quellcode:
var
 stelle:integer;
 anr:integer;   // auftragsnummer
 anrstr:string  // hilfsstring

...
// z.b. tempstr='2,14,23,48,55,'
while tempstr<>'' do
begin
  stelle:=pos(',',tempstr); // position des ersten auftretens von ','

  if stelle>0 then // stelle gefunden
    anrstr:=copy(tempstr,stelle-1); // kopiert aus tempstr die stellen 1..stelle-1

    if trystrtoint(anrstr,anr) then; // anrstr in zahl umwandeln
      machwas(anr) // verarbeiten
    else
      showmessage('keine zahl');

    delete(tempstr,1,stelle); // löschen bis nach 1. komma
  end
  else
    tempstr:='';
end;
ps. hoffe, das die string-indizes richtig sind


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 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