Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie gibt man einen Substring aus? (https://www.delphipraxis.net/203657-wie-gibt-man-einen-substring-aus.html)

kagi3624 9. Mär 2020 09:43

Delphi-Version: 6

Wie gibt man einen Substring aus?
 
Hallo,

wieder mal scheinbar was einfaches, wozu ich aber keine Informationen finde:

Wie kann man sich einen Substring von einem String ausgeben lassen? In meinem konkreten Fall möchte ich nur die ersten beiden Elemente des Strings haben.
Dankeschön. Edit: Der triviale Zugriff über die Indices ist mir schon klar, aber gibt da etwas eleganteres?

SebastianZ 9. Mär 2020 09:46

AW: Wie gibt man einen Substring aus?
 
Eine einfache Möglichkeit wäre hier der Copy - Befehl.

http://docwiki.embarcadero.com/Libra...en/System.Copy

DieDolly 9. Mär 2020 09:49

AW: Wie gibt man einen Substring aus?
 
Oder so

Delphi-Quellcode:
var
 s: string;
begin
 s := '12345';
 showmessage(s.Substring(0, 2));

kagi3624 9. Mär 2020 10:03

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von DieDolly (Beitrag 1459223)
Oder so

Delphi-Quellcode:
var
 s: string;
begin
 s := '12345';
 showmessage(s.Substring(0, 2));

Warum 0? Fängt bei Delphi der String nicht mit 1 an?

Klaus01 9. Mär 2020 10:09

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von kagi3624 (Beitrag 1459224)
Zitat:

Zitat von DieDolly (Beitrag 1459223)
Oder so

Delphi-Quellcode:
var
 s: string;
begin
 s := '12345';
 showmessage(s.Substring(0, 2));

Warum 0? Fängt bei Delphi der String nicht mit 1 an?

UniCode String fangen bei 0 an.
AnsiStrings bei 1 in der 0. Position ist die Länge des Strings gespeichertt.

Grüße
Klaus

kagi3624 9. Mär 2020 10:15

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von Klaus01 (Beitrag 1459226)
UniCode String fangen bei 0 an.
AnsiStrings bei 1 in der 0. Position ist die Länge des Strings gespeichertt.

Grüße
Klaus

Delphi 6 müsste ja nur AnsiStrings haben? Oder wie merkt man welchen man da grade hat?

haentschman 9. Mär 2020 10:21

AW: Wie gibt man einen Substring aus?
 
Zitat:

Delphi 6
...das fand ich als einen Witz/Scherz. :shock: Warum nicht die aktuelle Community Edition?

DieDolly 9. Mär 2020 10:31

AW: Wie gibt man einen Substring aus?
 
Zitat:

Warum nicht die aktuelle Community Edition?
Falls dem wirklich so ist, ist der Grund doch klar!

Wegen der Dateigröße :thumb: (Grund = :wall: )

Stevie 9. Mär 2020 10:49

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von Klaus01 (Beitrag 1459226)
UniCode String fangen bei 0 an.
AnsiStrings bei 1 in der 0. Position ist die Länge des Strings gespeichert.

Falsch, beide fangen bei 1 an - außer, es ist die Direktive $ZEROBASEDSTRINGS gesetzt.
Allerdings arbeiten alle Methoden von System.SysUtils.TStringHelper mit 0-basierten Indizes.

kagi3624 9. Mär 2020 11:08

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von haentschman (Beitrag 1459230)
Zitat:

Delphi 6
...das fand ich als einen Witz/Scherz. :shock: Warum nicht die aktuelle Community Edition?

Weil gewisse Personen nichts vom Fortschritt halten.

Dennis07 9. Mär 2020 11:09

AW: Wie gibt man einen Substring aus?
 
Allerdings fangen Strings beim String-Helper immer bei 0 an!
Das gilt nicht nur für
Delphi-Quellcode:
Substring
, sondern auch für
Delphi-Quellcode:
TStringHelper.IndexOf
oder
Delphi-Quellcode:
TStringHelper.Insert
.

Rollo62 9. Mär 2020 12:42

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von Dennis07 (Beitrag 1459237)
Allerdings fangen Strings beim String-Helper immer bei 0 an!
Das gilt nicht nur für
Delphi-Quellcode:
Substring
, sondern auch für
Delphi-Quellcode:
TStringHelper.IndexOf
oder
Delphi-Quellcode:
TStringHelper.Insert
.

Delphi-Quellcode:
TStringHelper.Chars[0]
Ich finde das sehr gut, endlich klare, eindeutige Verhältnisse :thumb:
Benutze ich nur noch bei neuen Units.

himitsu 9. Mär 2020 13:11

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von Stevie (Beitrag 1459235)
Zitat:

Zitat von Klaus01 (Beitrag 1459226)
UniCode String fangen bei 0 an.
AnsiStrings bei 1 in der 0. Position ist die Länge des Strings gespeichert.

Falsch, beide fangen bei 1 an - außer, es ist die Direktive $ZEROBASEDSTRINGS gesetzt.
Allerdings arbeiten alle Methoden von System.SysUtils.TStringHelper mit 0-basierten Indizes.

Jupp, die String-Helper immer ab 0
und für die normalen Strings muß (String/UnicodeString/AnsiString) muß man aufpassen für welches System kompiliert wird.
In den NextGenCompilern (iOS/Android) ist $ZEROBASEDSTRINGS standardmäßig aktiv. (kann aber in eigenen Units notfalls deaktiviert werden, aber NIEMALs komplett aus, da sonst die RTL abraucht, weil die Entwickler da blind von ausgehen es ist aus)
Über den Typ bekommt ihr via
Delphi-Quellcode:
Low(string)
den aktuellen Startpunkt,
bzw.
Delphi-Quellcode:
Low(StringVariable)
und
Delphi-Quellcode:
High(StringVariable)
anstatt
Delphi-Quellcode:
1..Length(StringVariable)

oder mit
Delphi-Quellcode:
for C in S do
über die Chars eines Strings enumerieren.

Und im Nextgen fehlen auch der ShortString und AnsiString/UTF8String/... (die gibt es, für da wo die Entwickler zu faul waren es zu ändern, aber der Typ ist nicht öffentlich) und man muß dort überall z.B. mit ByteArrays und TEncoding arbeiten. (oder sich den Typ fast hackermäßig rausholen)

Dennis07 9. Mär 2020 18:16

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von Rollo62 (Beitrag 1459247)
Delphi-Quellcode:
TStringHelper.Chars[0]
Ich finde das sehr gut, endlich klare, eindeutige Verhältnisse :thumb:
Benutze ich nur noch bei neuen Units.

Bringt dir nur nicht viel, wenn
Delphi-Quellcode:
Chars[]
readonly ist...

DieDolly 9. Mär 2020 18:30

AW: Wie gibt man einen Substring aus?
 
Jetzt explodiert die Diskussion hier mal wieder und hat absolut nichts mehr mit der ursprünglichen Frage zu tun
Wie gibt man einen Substring aus?.

Der TE möchte genau das wissen. Detailwissen interessiert hier vermutlich niemanden, der auf diese Frage eine Antwort sucht.

himitsu 9. Mär 2020 18:33

AW: Wie gibt man einen Substring aus?
 
Selbst bauen?

Falls man ReportHelper ableiten könnte, was aber nur bei den ClassHelpern geht.
Delphi-Quellcode:
type
  TMyStringHelper = record helper(TStringHelper) for string
  private
    procedure SetChars(Index: Integer; Value: Char);
  public
    property Chars[Index: Integer] write SetChars;
  end;

function TMyStringHelper.SetChars(Index: Integer; Value: Char);
begin
  Self[Index + Low(string)] := Value;
end;
So geht es, aber dir fehlen dann alle Standard-HelperFunktionen. :freak:
Delphi-Quellcode:
type
  TMyStringHelper = record helper for string
  private
    function GetChars(Index: Integer): Char;
    procedure SetChars(Index: Integer; Value: Char);
  public
    property Chars[Index: Integer]: Char read GetChars write SetChars;
  end;

function TMyStringHelper.GetChars(Index: Integer): Char;
begin
  Result := Self[Index + Low(string)];
end;

procedure TMyStringHelper.SetChars(Index: Integer; Value: Char);
begin
  Self[Index + Low(string)] := Value;
end;

ghubi01 9. Mär 2020 19:04

AW: Wie gibt man einen Substring aus?
 
@kagi3624

wie wäre es mit dem Klassiker:
Delphi-Quellcode:
procedure TForm1.Test;
var
  e, s: string;
begin
  s:='123456';
  e:=LeftStr(s,2);
  Memo1.Lines.Add(e);
end;
Die Function LeftStr() ist Bestandteil der Unit StrUtils (D6, D7).
Im Aktuellem Delphi: System.StrUtils

TurboMagic 9. Mär 2020 22:38

AW: Wie gibt man einen Substring aus?
 
Tja, dem OP wird wohl echt nur der Klassiker bleiben, wenn er D6 benutzt.
Denn Stringhelper usw. gab's da noch nicht...

kagi3624 10. Mär 2020 08:22

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von ghubi01 (Beitrag 1459306)
@kagi3624

wie wäre es mit dem Klassiker:
Delphi-Quellcode:
procedure TForm1.Test;
var
  e, s: string;
begin
  s:='123456';
  e:=LeftStr(s,2);
  Memo1.Lines.Add(e);
end;
Die Function LeftStr() ist Bestandteil der Unit StrUtils (D6, D7).
Im Aktuellem Delphi: System.StrUtils

Danke, das sieht schon mal besser aus, als was ich hatte :thumb:

Rollo62 10. Mär 2020 09:06

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von himitsu (Beitrag 1459304)
Selbst bauen?

Falls man ReportHelper ableiten könnte, was aber nur bei den ClassHelpern geht.
Delphi-Quellcode:
type
  TMyStringHelper = record helper(TStringHelper) for string
  private
    procedure SetChars(Index: Integer; Value: Char);
  public
    property Chars[Index: Integer] write SetChars;
  end;

function TMyStringHelper.SetChars(Index: Integer; Value: Char);
begin
  Self[Index + Low(string)] := Value;
end;
So geht es, aber dir fehlen dann alle Standard-HelperFunktionen. :freak:
Delphi-Quellcode:
type
  TMyStringHelper = record helper for string
  private
    function GetChars(Index: Integer): Char;
    procedure SetChars(Index: Integer; Value: Char);
  public
    property Chars[Index: Integer]: Char read GetChars write SetChars;
  end;

function TMyStringHelper.GetChars(Index: Integer): Char;
begin
  Result := Self[Index + Low(string)];
end;

procedure TMyStringHelper.SetChars(Index: Integer; Value: Char);
begin
  Self[Index + Low(string)] := Value;
end;

Ja richtig, und ich habe doch so einen tollen Tip von Uwe gelesen, den wollte ich immer mal ausprobieren.

Vermutlich funktioniert das Vererben aber nicht bei String :cry:, aber einen Versuch wäre es Wert.

Uwe Raabe 10. Mär 2020 09:08

AW: Wie gibt man einen Substring aus?
 
Wie in dem gleichen Thread beschrieben, geht das Vererben nur bei class helper, aber nicht bei record helper.

Rollo62 10. Mär 2020 09:13

AW: Wie gibt man einen Substring aus?
 
Egal, das hätte ich trotzdem mal ausprobiert.
Es gibt ja noch Varianten in den Schreibweisen, ich denke halt seeeehr positiv :stupid:

himitsu 10. Mär 2020 11:19

AW: Wie gibt man einen Substring aus?
 
Wobei es für die Helper keinen Grund gibt, warum das nicht zu vererben gehen sollte, oder warum überhaupt der Letzte immer alles andere überdeckt.

z.B. im TStringHelper und TIntegerHelper fehlt so viel, aber das kann man nicht nachrüsten, ohne ALLES neu zu machen, weil der Standardhelper dann weg ist.

Für sowas wie TComponent.Name ist der String-Helper standardmäßig garnicht sichtbar, weil auch dort die Vererbung vergessen wurde und der Helper des Vorfahren "string" des TComponentName somit fehlt.

KodeZwerg 10. Mär 2020 11:30

AW: Wie gibt man einen Substring aus?
 
Zitat:

Zitat von SebastianZ (Beitrag 1459222)
Eine einfache Möglichkeit wäre hier der Copy - Befehl.

http://docwiki.embarcadero.com/Libra...en/System.Copy

gepaart mit Pos() (falls man erst 'ne stelle finden muss) find ich das die einfachste lösung.

Schade das es noch nicht diese "Brauchbar" "Hilfreich" etc buttons hier noch nicht gibt :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.

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