Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Copybefehl bei Strings (https://www.delphipraxis.net/84496-copybefehl-bei-strings.html)

Scorpion 17. Jan 2007 16:10


Copybefehl bei Strings
 
Hallo,

ich habe einen String, sagen wir

myString := Wort1,Wort2,Wort3,Wort4

Ich will jetzt den bereich zwischen dem 1. und dem 2. Komma auslesen, also Wort2, wie kann ich das denn machen ?

Thx

sirius 17. Jan 2007 16:14

Re: Copybefehl bei Strings
 
Versuchs doch mal mit PosEx :P

[edit=SirThornberry]Funktionsnamenschreibweise geändert :roll: Mfg, SirThornberry[/edit]

mkinzler 17. Jan 2007 16:15

Re: Copybefehl bei Strings
 
Oder mit Hilfe einer Stringliste

yörsch 17. Jan 2007 16:20

Re: Copybefehl bei Strings
 
versuchs mal damit
Delphi-Quellcode:
// String in TStrings umwandeln
procedure readcommand(line:string; Delimiter:array of char; Commandlist:TStrings);
var
  Pos1,Pos2:Integer;
  len:integer;
  dcount,delim:Integer;
  Help:string;
begin
   if Commandlist = NIL then
     Commandlist := TStrings.Create;
   Commandlist.Clear;
   dcount:=length(Delimiter);
   line:=trim(line);
   IF dcount>0 then
   begin
     pos2:=0;
     len:=Length(line);
     delim:=0;
     line:=line + Delimiter[dcount-1];
     while Pos2 < Len do
       begin
         pos1:=pos2;
         Pos2:=PosEx(Delimiter[delim],line,pos1+1);
         if pos2=0 then pos2:=len+1;
         Help:=AnsiMidStr(line,Pos1+1,Pos2-Pos1-1);
         Commandlist.Add(Help);
         if delim < dcount-1 then inc(delim);
       end;
   end
   else
     Commandlist.Add(line);
end;
:coder2:
das kannst du debuggen und dir den besten Teil raussuchen!
gruß
Jörg

mkinzler 17. Jan 2007 16:28

Re: Copybefehl bei Strings
 
Zitat:

Delphi-Quellcode:
 Commandlist := TStrings.Create;

würde ich besser mit
Delphi-Quellcode:
Commandlist := TStringList.Create;
ersetzen.

yörsch 18. Jan 2007 07:21

Re: Copybefehl bei Strings
 
Hallo mkinzler, :hello:
irgend einen Grund gab´s damals TStrings und nicht TStringList zu nehmen,
aber frag mich nicht heute nicht welche das war.

mkinzler 18. Jan 2007 07:27

Re: Copybefehl bei Strings
 
Zitat:

Zitat von yörsch
Hallo mkinzler, :hello:
irgend einen Grund gab´s damals TStrings und nicht TStringList zu nehmen,
aber frag mich nicht heute nicht welche das war.

TStrings ist abstrakt. Und TStringList ist eine Ableitung davon, in welcher implementiert wird. Beim Definieren reicht TStrings deshalb

Scorpion 20. Jan 2007 11:10

Re: Copybefehl bei Strings
 
Hey...

vielen dank für eure vielen antworten. Aber leider blicke ich noch nicht so ganz durch. Wie könnte das denn jetzt genau für mein Beispiel aussehen ?

vielen dank

Der_Unwissende 20. Jan 2007 11:33

Re: Copybefehl bei Strings
 
Hi,
ein Beispiel wurde doch schon gepostet. Du kannst mit der Funktion Pos bzw. PosEx Dir die Position von einem Teilstring in einem String ausgeben lassen (hier das Komma). Bei PosEx kannst Du zudem einen Offset angeben, so dass nur Zeichen hinter diesem Offset berücksichtigt werden. Copy kopiert wiederum einen Teilstring aus einem String heraus.
Du kannst also auf diese Art und Weise einen String anhand eines Trennzeichens in Token zerlegen, die werden in dem Beispiel in einer TStringList gespeichert. Das zweite Token wäre also der zweite Eintrag in der TStringList.

Etwas schneller (und einfacher) geht es dann noch, wenn Du auf eine fertige Lösung zurückgreifst, z.B. Explode. Lad Dir hier die Datei runter und binde die csExplode mit ein. Dort findest Du die Klasse TStringDivider, die das leistet was Du benötigst:

Delphi-Quellcode:
var token: TStringList;
    tokenizer: TStringDivider;
begin
  token := TStringList.Create;
  tokenizer := TStringDivider.Create;
  tokenizer.exlplode('Wort1,Wort2,Wort3,Wort4', ',', token);
end;
In Token würden jetzt die Strings 'Wort1', 'Wort2', 'Wort3' und 'Wort4' stehen. Token[0] wäre damit 'Wort1', Token[1] 'Wort2' usw.

Gruß Der Unwissende

Jelly 20. Jan 2007 11:39

Re: Copybefehl bei Strings
 
Wenn du deinen Kommatext in eine TStringlist lädst, kannst du die Eigenschaften DelimitedText und Delimiter nutzen. Etwa so

Delphi-Quellcode:
function Wort (S : string ; Nr : integer) : string ;
begin
     with TStringList.Create do begin
         try
             Delimiter := ',' ;
             DelimitedText := S ;
             if (Nr <= Count-1) and (Nr >= 0) then
                 Result := strings[Nr]
             else begin
                 Result := '' ;
                 raise exception.Create (format('Das Wort %d existiert nicht.',[Nr])) ;
             end ;
         finally
             free ;
         end ;
     end ;
end ;
Ist eventuell noch anpassungsfähig, grad was die Fehlerbehandlung betrifft

Der_Unwissende 20. Jan 2007 12:02

Re: Copybefehl bei Strings
 
Zitat:

Zitat von Jelly
Wenn du deinen Kommatext in eine TStringlist lädst, kannst du die Eigenschaften DelimitedText und Delimiter nutzen

Wovor ich Dich ganz stark warnen würde. Die Funktion ist etwas fehlerhaft implementiert (irgendjmd. schrieb, dass es in den aktuellen Versionen noch eine korrigierte Version gibt), aber DelimitedText mit Delimiter macht immer Probleme, wenn Du Leerzeichen im String hast. Der String 'Wort1 langes Wort mit Leerzeichen, Wort2' würde so in 6 Token zerteilt werden, da jedes Leerzeichen immer (unabhängig vom eingestellten Delimiter) als Trennzeichen verwendet werden würde.

Jelly 20. Jan 2007 12:22

Re: Copybefehl bei Strings
 
Zitat:

Zitat von Der_Unwissende
Wovor ich Dich ganz stark warnen würde. Die Funktion ist etwas fehlerhaft implementiert (irgendjmd. schrieb, dass es in den aktuellen Versionen noch eine korrigierte Version gibt), aber DelimitedText mit Delimiter macht immer Probleme, wenn Du Leerzeichen im String hast.

Habs grad getestet und den Fehler kann ich bestätigen :wall: Sehr unschön.

Aber wenn man mal die Doku dazu liest, scheint das so gewollt zu sein:
Zitat:

Zitat von Delphi Online Hilfe
Description
Use DelimitedText to get or set all the strings in the TStrings object in a single string.
When retrieving DelimitedText, the resulting value delimits individual strings in two ways: each string is surrounded (before and after) by the quote character specified by the QuoteChar property. In addition, individual strings are separated by the character specified by the Delimiter property.
When assigning DelimitedText, individual strings must be separated using QuoteChar at both ends, using Delimiter as a separator, or using both these methods.

A space is always interpreted as a delimiter, regardless of the value of Delimiter, unless the space occurs between quote characters.
Note:
CommaText is the same as the DelimitedText property when Delimiter is ',' and QuoteChar is '"'.


r2c2 20. Jan 2007 12:38

Re: Copybefehl bei Strings
 
Auch, wenn das meiste schon gesagt wurde schieb ich nochmal n Tutorial hinterher: http://r2c2.weingut-rehn.de/content3...mit_Delphi.htm

BTW: Das mit dem Bug/Feature von TStringList sollte ich auch noch mal erwähnen... Werds am besten gleich mal ändern...

//Edit: Steht jetzt drin...

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz