Autor Beitrag
Sharky0w0
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 09.10.19 10:45 
Mal eine kurze Frage.
Ich habe einen string
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.
ausblenden 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:

_________________
We are, we were and will not be.


Zuletzt bearbeitet von Gausi am Mi 09.10.19 11:31, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Sharky0w0
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: doublecross, Gausi, Sharky0w0
Sharky0w0 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 09.10.19 12:15 
Danke für die Hilfe Jungs,

Habe es jetzt so gemacht und funktioniert auch Einbahn frei.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: doublecross, Sharky0w0
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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!

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: Sharky0w0
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: Mi 09.10.19 22:42 
Mal eine kurze Lösung; in der Listbox siehst Du dann auch, wo man die Schleife anwenden kann.

ausblenden 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