Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zeichenkette bei '#' teilen


linesk - Di 18.05.10 19:54
Titel: Zeichenkette bei '#' teilen
Es handelt sich um Registierung eines Filmes bei einer telefonischen Filmausleihe, die eingegebenen Daten sollen umgewandelt und gut verständlich in einer Listbox ausgegeben werden.

Und zwar soll die Eingabe z.B.so aussehen:
2584#2568#335#1500#12032010


Dabei stellt die erste Nummer eine 4-8 stellige Telefonnummer dar, die zweite ein Passwort, die dritte eine 1-4 stellige filmnummer, die vierte die Uhrzeit und die letzte das Datum dar.

Ich hab das bereits mit Explode versucht allerdings geht das nicht wirklich =(.
Zumal komischer Weise das Programm sich auch nicht starten lässt, mir aber auch keine Fehler angezeigt werden. Es handelt sich um Delphi 2010.

Kann mir bitte jemand weiter helfen?


Narses - Di 18.05.10 19:57

Moin und :welcome: im Forum!

Wie sieht denn dein Code aus? ;)

cu
Narses


linesk - Di 18.05.10 20:02


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.b_registrierenClick(Sender: TObject);
var
 s:String;
 Position,tele,passwort:Integer;
begin
  s:=FLOATTOINT(e_eingabe.text);
  Position:=Pos('#',s); //Position von ':' ermitteln
  tele:=Copy(s,0,Position-1); //Kopieren von Anfang(0) bis zur Position
  passwort:=Copy(s,Position+1,Length(s)); //kopieren von Position bis zum ende des Strings

  lb_ausgabe.items.Add('Telefonnummer:'+FLOATTOSTRF(tele,ffnumber,8,4));


end;

Also ich hab das erstmal probiert, normalerweise zeigt mir das ja dann an was nicht stimmt und ich komm dann auf das richtige. Aber das Programm hat irgendwie gar keine Meinung dazu =(

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


Narses - Di 18.05.10 20:11

Moin!

Diese Zeile:
user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
s:=FLOATTOINT(e_eingabe.text);                    
kann unmöglich richtig sein. Selbst wenn es FloatToInt() gäbe (mein Delphi kennt´s nicht :nixweiss:) sollte der Ergebnistyp wohl Integer sein, und das kann man keinem String zuweisen.

user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:
Also ich hab das erstmal probiert, normalerweise zeigt mir das ja dann an was nicht stimmt und ich komm dann auf das richtige.
Hier muss dir der Compiler eine Meldung schmeißen, dass kann nicht klappen.

user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:
Aber das Programm hat irgendwie gar keine Meinung dazu =(
Das ist nicht schlimm, meine Programme meinen auch immer nix... 8) :D

cu
Narses


linesk - Di 18.05.10 20:18

Naja genaugenommen

Ich weiß, ich hatte es auch vorher anders bzw mit integer, aber weil es nicht ging hab ich probiert.
Hab einfach das kopiert was gerade da stand.


Narses - Di 18.05.10 20:25

Moin!

user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:
normalerweise zeigt mir das ja dann an was nicht stimmt
user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:
Naja genaugenommen
Ich weiß, ich hatte es auch vorher anders
Hm :? halten wir also zunächstmal fest, dass du nicht das schreibst, was du wirklich gemacht hast und/oder der Compiler dazu gesagt hat. Klingt nicht besonders schlau, dieses Verhalten, oder? :|

Probier das mal so: :idea:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.b_registrierenClick(Sender: TObject);
begin
  lb_ausgabe.Items.Delimiter := '#';
  lb_ausgabe.Items.DelimitedText := e_eingabe.Text;
end;
Tut das das, was du haben willst?

cu
Narses


linesk - Di 18.05.10 20:31

War ja nur das Float falsch ;) sonst wars genauso

ich würde Dir ja gern sagen was es macht, aber es macht nix. Das lässt sich einfach nicht ausführen *grml*


Hidden - Di 18.05.10 21:14

Hi :)

Also du führst die .exe aus/compillierst, und es erscheint nicht einmal ein Fenster? Und das, obwohl der Compiler dir keine weiteren Hinweise gibt?

Dann sieh' doch einmal im Task-Manager nach, ob das Programm unter den Tasks aufgeführt wird. Vielleicht haben wir hier noch ein ganz anderes Problem :think:

lg,


linesk - Di 18.05.10 21:27

Ich glaub das Programm will mich verarschen.
Ich hab jetzt erstmal neu angefangen und jetzt lässt es mich auch starten, ka was bei dem anderen das Problem war/ist.

Ich probier jetzt mal die Methoden aus.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.b_registrierenClick(Sender: TObject);
begin
  lb_ausgabe.Items.Delimiter := '#';
  lb_ausgabe.Items.DelimitedText := e_eingabe.Text;
end;
Tut das das, was du haben willst?

Also es tut schonmal das in die listbox einordnen ja, das will ich schonmal.
allerdings soll das ganze am end wie ein Kassenbon aussehen
quasi:

Telefonnummer: 3695
Passwort: 2589
Filmnummer:12
Uhrzeit: 15:00
Datum: 23.05.2010


elundril - Di 18.05.10 21:34

hmm und was hindert dich daran mit einer schleife jedes item in der Listbox durchzugehen und jeweils deinen gewünschten Text davor zu setzen?

lg elundril


linesk - Di 18.05.10 21:38

dumme frage: aber wie komm ich jetzt wieder an die einzellnen items rann? die sind ja quasi nur umgeordnet und nicht genau bestimmt


ALF - Di 18.05.10 22:33

Hi, mal ne andere Frage.
Wie so machst Du die Eingabe nicht mit 5 Editfelder? Ersparst Dir damit die Eingabe mit '#' ,dürfte auch übersichtlicher sein und kannst dann, bei der Übergabe in das ListFeld, noch die Zuordnung machen.
So wie Du es haben willst :wink:
z.B.

Delphi-Quelltext
1:
2:
3:
lb_ausgabe.Items.add := 'Telefonnummer: ' + Edit1.text;
lb_ausgabe.Items.add := 'Passwort: ' + Edit2.text;
//usw.


Gruss Alf


Hidden - Di 18.05.10 23:25

user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaub das Programm will mich verarschen.
Das wird's sein :P

user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:
allerdings soll das ganze am end wie ein Kassenbon aussehen

Telefonnummer: 3695
Passwort: 2589
Filmnummer:12
Uhrzeit: 15:00
Datum: 23.05.2010
Würde ich mit Labels machen, damit der User auch mit unausgefüllten Feldern schon sieht, was dort hineinkommen wird.

user profile iconlinesk hat folgendes geschrieben Zum zitierten Posting springen:
dumme frage: aber wie komm ich jetzt wieder an die einzellnen items rann? die sind ja quasi nur umgeordnet und nicht genau bestimmt

Die Methode mit Listbox(dafür steht lb_ausgabe doch, oder?) und Delimiter: '#' ist einfach und schnell; zur Weiterverarbeitung aber nicht so gut geeignet.
Die jeweilige Zeile auslesen kannst du vermutlich über lb_ausgabe.Items[i], wobei i=0,1,..,N die i-te Zeile ist, und entweder eine Integervariable(Items[i]) oder ein Zahlenwert(Items[3], Items[25], ..) sein kann. Du könntest jetzt in einem zweiten Schritt die Beschriftungen und Nummern in einen String packen, und neu einschreiben.

Besser dazu geeignet, ist die direktere Methode:
Du hast den String S(z.B.='2584#2568#335#1500#12032010'), und kannst mit Copy(S, StartIndex{=6, da 6. Zeichen}, AnzahlZeichen{=4}) einen Teilstring herauskopieren.
Pos('#', S) liefert dir die Position des ersten Vorkommens von '#' in S überhaupt, sowie
PosEx('#', S, 23) die Position des ersten Vorkommens ab dem 23. Zeichen.

Mit Pos und PosEx(genauerees zu den Funktionen findest du in der Delphi-Hilfe:F1) bekommst du die Stellen in S, an denen sich ein '#' befindet. mit Copy kannst du diese Texte herausschneiden, und beliebig verbauen(ich wäre ja für Editfelder, auf read-only, damit der Text herauskopiert werden kann).

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Wie so machst Du die Eingabe nicht mit 5 Editfelder? Ersparst Dir damit die Eingabe mit '#' ,dürfte auch übersichtlicher sein und kannst dann, bei der Übergabe in das ListFeld, noch die Zuordnung machen.
So wie Du es haben willst :wink:
Vermute mal, der String kommt über das Internet/sonstwie elektronisch rein. Ansonsten full ack.

lg,


linesk - Mi 19.05.10 17:21

Danke klappt soweit alles, hab mir für die Methode mit lb_ausgabe.Items[n] entschieden.
Muss jetzt nur noch die Uhrzeit und das Datum logisch dartstellen, aber das dürfte ich so hinbekommen mit POS.

user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Wie so machst Du die Eingabe nicht mit 5 Editfelder? Ersparst Dir damit die Eingabe mit '#' ,dürfte auch übersichtlicher sein und kannst dann, bei der Übergabe in das ListFeld, noch die Zuordnung machen.
So wie Du es haben willst :wink:
Vermute mal, der String kommt über das Internet/sonstwie elektronisch rein. Ansonsten full ack.

Jap laut Aufgabenstellung ist die Eingabe telefonisch. Die Idee mit den Editfeldern hat ich auch, wollt mein Lehrer aber so nicht, leider. ;)

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.