Autor Beitrag
Kralle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

Windows XP,Win7
Delphi 6, Turbo Delphi Pro, Delphi 7 Enterprise, Delphi XE2 Lazarus
BeitragVerfasst: Mi 12.09.12 17:06 
Hallo,

ich stehe mir glaube ich gerade selber im Weg.
Ich möchte einen Text in Teil-Texte aufteilen.

Mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure Split(const Delimiter: Char; Input: stringconst Strings: TStrings);
begin
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;


eigentlich kein Problem (Trennzeichen '\'). Aber das Ergebnis ist nicht das was ich erwarte.

Ausgangsstring:
Zitat:
Heiko ist \a500 entfernt. Das \a501\a789 ist rot.

Ergebnis:
Zitat:

Heiko
ist
a500
entfernt.
Das
a501
a789
ist
rot.


Erwartet habe ich :

Heiko ist
\a500 entfernt. Das
\a501
\a789 ist rot.

Wo ist mein Fehler? Oder was muss ich anders machen?

MfG
Heiko


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 12.09.2012 um 17:13
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 12.09.12 17:12 
Moin!

user profile iconKralle hat folgendes geschrieben Zum zitierten Posting springen:
Wo ist mein Fehler? Oder was muss ich anders machen?
Setz mal .StrictDelimiter auf TRUE. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Kralle
Kralle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

Windows XP,Win7
Delphi 6, Turbo Delphi Pro, Delphi 7 Enterprise, Delphi XE2 Lazarus
BeitragVerfasst: Mi 12.09.12 17:21 
Moin,

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

user profile iconKralle hat folgendes geschrieben Zum zitierten Posting springen:
Wo ist mein Fehler? Oder was muss ich anders machen?
Setz mal .StrictDelimiter auf TRUE. :idea:

cu
Narses


Ergebnis:
Zitat:

Heiko
ist
a500
entfernt.
Das
a501
a789
ist
rot.


Also, noch schlimmer als vorher und die `\`sind auch immer noch weg.
Muß ich das jetzt doch mit Copy() uns Co machen?

Gruß Heiko
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 12.09.12 17:21 
Mal eine andere Frage zurück:

Ich habe leider nicht Delphi XE. Daher geht das bei mir nicht mit dem Testen. Aber eines verstehe ich nicht so Recht. Wie kann man in einer Prozedur den Parameter auf const setzen, also nicht veränderbar und dann innerhalb der Prozedur die Variable ändern? Bei mir gibt der Compiler schon die Fehlermeldung aus, dass man der linken Seite nichts zuweisen darf. Weil sie eiben als const deklariert ist. Allerdings habe ich das mit dem const für TStringlist ausprobiert und es klappt. Ganz verstehen kann ich das zwar nicht, wie das bei einfachen Variablen verboten udn bei Komponenten erlaubt ist, aber es ist nun mal so.

Am Einfachsten durch eine Schleife. So in etwa:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Split(Delimiter: char; const s: string; Strings: TStringList);
var
  i: integer;
  Teil: string;
begin
  Strings.Clear;
  Teil := '';
  for i := 1 to Length(s) do
  begin
    if s[i] = Delimiter then
    begin
      Strings.Add(Teil);   // Teil ausgeben
      Teil := Delimiter;   // Teil auf Delimiter setzen.
    end
    else
    begin
      Teil := Teil + s[i]; // Teil erweitern
    end;
  end;
  Strings.Add(Teil);       // Rest ausgeben
end;


Leider muss ich über TStringlist gehen, da TStrings bei Delphi 5 nur abstrakt ist.
In der Variable Strings ist dann das, was Du willst. Du kannst es z.B. einer ListBox.Items zuweisen:


ausblenden Delphi-Quelltext
1:
2:
3:
  SL := TStringList.Create;  // STringliste erzeugen  
  Split('/',Edit1.Text,SL);  // in Edit1 ist der zusammengesetzte Text. In SL werden die Strings abgelegt.
  Listbox1.Items := SL;   // in Listbox1 erscheint die getrennte Liste

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.

Für diesen Beitrag haben gedankt: Kralle, Mathematiker
Kralle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

Windows XP,Win7
Delphi 6, Turbo Delphi Pro, Delphi 7 Enterprise, Delphi XE2 Lazarus
BeitragVerfasst: Mi 12.09.12 18:20 
Moin,

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:

Am Einfachsten durch eine Schleife. So in etwa:


Damit funktioniert es. - Danke.

Gruß
Heiko
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mi 12.09.12 19:48 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Mal eine andere Frage zurück:

Ich habe leider nicht Delphi XE. Daher geht das bei mir nicht mit dem Testen. Aber eines verstehe ich nicht so Recht. Wie kann man in einer Prozedur den Parameter auf const setzen, also nicht veränderbar und dann innerhalb der Prozedur die Variable ändern? Bei mir gibt der Compiler schon die Fehlermeldung aus, dass man der linken Seite nichts zuweisen darf.


dann schau dir die Methode nochmal ganz genau an: die mit const definierte Variable wird nicht geändert, lediglich ein Property der Klasse wird verändert. Die Variable (Pointer) auf den Bereich in dem das Objekt gespeichert wird, wird aber nicht geändert (es steht ja nirgens Strings := nil - das würde so nicht gehen).

und an beide: SChaut euch mal die Hilfe zu DelimetedTExt an, da steht nämlich drin, dass am Delimeter und an Leerzeichen getrennt wird, außer die Leerzeichen befinden sich in einem Text der mit dem Char der in QuotedChar definiert ist eingeschlossen ist.

GRüße