Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Aus einem string der durch ';' getrennt ist einzelnde Wörter


Sharky0w0 - Mi 09.10.19 10:45
Titel: Aus einem string der durch ';' getrennt ist einzelnde Wörter
Mal eine kurze Frage.
Ich habe einen string

Delphi-Quelltext
1:
s := 'Nachname;Vorname;Strasse;HausNR;PLZ;Ort;Geburtstag;Anrede;Berufsposition;ProgKenntnisse;';                    

und es soll mir ab jeden ; eine neue Showmessage box geben.

Also für Nachname // Vorname // Strasse

Dies soll mit einer for-schleife passieren

Bin aber da ein bisschen Lost und weiß nicht wie ich anfagen soll.

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


Gausi - Mi 09.10.19 11:28

Hallo und :welcome: in der Entwickler-Ecke!

Wegen des Zusatzes "Dies soll mit einer for-schleife passieren", vermute ich eine Art Hausaufgabe. ;-)

Daher als kleiner Schubs in die Richtige Richtung: Schau dir mal die Funktion PosEx an.

Delphi-Quelltext
1:
function PosEx(const SubStr, S: string; Offset: Integer): Integer;                    


Dein SubStr wäre hier das ";", und das Offset am Anfang 0, und wird in der Schleife immer auf die Position der letzten Fundstelle gesetzt (ggf. 1 drüber, bin da nicht so ganz sicher, ab wann PosEx dann neu anfängt zu suchen). Die einzelnen Teile dann mit Copy herauskopieren.

Allerdings wäre da eine While-Do bzw. Repeat-Until-Schleife sinnvoller. Wie man das mit einer For-Schleife machen soll, ist mir grade schleierhaft.

Oder der Knackpunkt an der Aufgabe ist ein anderer - dann könnte man mit einer Stringlist arbeiten, Delimiter auf ";" setzen den String als DelimitedText zuweisen und dann in einer for-Schleife von 0 bis StringList.Count-1 die einzelnen Strings ausgeben ...

Das wäre so das, was mir dazu einfiele ...

Edit: Ok, jasoculs Ansatz ist noch elementarer - gefällt mir sehr gut. Kommt halt drauf an, was für Vorkenntnisse bzw. welche eingebauten Funktionen verwendet werden dürfen. :zustimm:


jasocul - Mi 09.10.19 11:29

Willkommen in der Entwickler-Ecke.

Das sieht sehr nach einer Hausaufgabe aus.
Daher gibt es von mir keine fertige Lösung.

Also eine For-Schleife soll es werden (würde ich so nie machen, aber wenn das gefordert ist ...)

Was vermutlich gewünscht ist:
Du sollst in der For-Schleife jeden Buchstaben des Strings durchgehen.
Wenn es kein Semikolon ist, hängst du den Buchstaben in einem anderen String hinten dran.
Sobald du auf ein Semikolon stößt, gibst du diesen String mit ShowMessage aus und machst ihn danach wieder leer.

Hinweise:
- Die Länge eines Strings ermittelt man mit "Length"
- Einen Buchstaben eines Strings ermittelt man z.B. mit s[i]. i ist in diesem Fall die Laufvariable der For-Schleife
- In dieser Variante fängt die For-Schleife bei "1" an.


Sharky0w0 - Mi 09.10.19 12:15

Danke für die Hilfe Jungs,

Habe es jetzt so gemacht und funktioniert auch Einbahn frei.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button2Click(Sender: TObject);
var
t: integer; 
s, k, g: string
begin

  s := 'Nachname;Vorname;Strasse;HausNR;PLZ;Ort;Geburtstag;Anrede;Berufsposition;ProgKenntnisse;';

begin
  t := 0;
repeat
  k := '';
  repeat
    t := t + 1;
    g := copy(s,t, 1);
    if g <> ';' then k := k + g;
  until (g = ';'or (t = length(s));
    showmessage(k);
  until t = length(s);
end;

end;


LG Sharky0w0

Moderiert von user profile iconTh69: Code- durch Delphi-Tags ersetzt


jasocul - Mi 09.10.19 12:29

Das ist leider keine For-Schleife. :wink:

Außerdem wäre als Alternative eine While-Schleife besser, als ein repeat .. until. Was passiert bei dir, wenn der String am Anfang leer ist?

Und wenn schon keine For-Schleife, hätte man mit Pos oder PosEx deutlich besseren Source, da man dann nicht mehr jeden einzelnen Buchstaben prüfen müsste.

Aber dein Ergebnis ist dennoch für diese spezielle Situation in Ordnung.


Gausi - Mi 09.10.19 14:03

Also da muss ich jetzt mal sagen: Gut gemacht! :zustimm:

Von "bisschen Lost und weiß nicht wie ich anfangen soll" nach ein paar hingeworfenen Stichworten zu so einer Lösung zu kommen, zeigt schon von guter Eigeninitiative.

Dein Code ist zwar nicht sonderlich elegant (um es vorsichtig auszudrücken :mrgreen: ), aber er zeugt davon, dass du dir Gedanken gemacht hast, und bist am Ende zu einer funktionierenden Lösung gekommen (mal abgesehen vom Leerstring). Finde ich echt gut!


ub60 - Mi 09.10.19 22:42

Mal eine kurze Lösung; in der Listbox siehst Du dann auch, wo man die Schleife anwenden kann.


Delphi-Quelltext
1:
2:
ListBox.Items.Delimiter:=';';
ListBox.Items.DelimitedText:='Nachname;Vorname;Strasse;HausNR;PLZ;Ort;Geburtstag;Anrede;Berufsposition;ProgKenntnisse;';

Natürlich geht es eleganter mit einer Stringliste.

ub60