Step 07 - Strings

Aufbau von Strings (und die historische Bedeutung von s[0])

String ist ein Datentyp, welcher wie ein Array behandelt werden kann: Array of (Ansi)Char.
Strings in Delphi sind allerdings nicht wie in den meißten anderen Programmiersprachen behandelbar. In diesen wird bei s[0] das erste Zeichen zurückgegeben. Bei dem String in Delphi, der auch als "Pascal-String" bezeichnet wird, gibt s[1] das erste Zeichen zurück. Grund hierfür ist die Tatsache, dass früher bei s[0] die Länge des Strings herausgelesen werden konnte. Das kann nun sehr an Streams errinern, oder?!
Beim "ganz"früheren Pascal-String war hier auch die Limitierung auf 255 Zeichen pro Variable üblich. Heute gibt es quasi keine Grenze mehr, da Delphi den String "intern" verwaltet.
Da Strings, wie wir nun wissen, wie Arrays genutzt werden können, kann man auch die Länge des Strings vordefinieren:
var
  s : String[100];
Dies kann z.B. nützlich sein, wenn man Daten einer festen Größe speichern möchte. Sinnvoll ist das z.B. je nach Datenstruktur für Textfelder. Hier ist oft der Fall, dass nur eine festgelegte Anzahl an Buchstaben pro Feld gespeichert werden kann. Auch wenn die Technik heutzutage nahezu grenzenlose Speicherung möglich macht, macht es bei manchen Daten Sinn, diese einzuschränken. Ein Adressfeld z.B. muss weiterhin druckbar bleiben und auf Papier ist nicht endlos Platz. Dies ist eine besondere Überlegung bei der Datenbank-Entwicklung, in der es auch normal ist, über "Einschränkungen" nachzudenken um genau solche Kompatibilität gewährleisten zu können.
Die größe kann also von vornherein festgelegt werden. Andererseits kann die Größe (bzw. Anzahl an Buchstaben, Chars) des Strings auch per SetLength-Befehl geändert werden:
//SetLength( Variable, Größe);
SetLength( s       , 255   );
 
 

Methoden zum Herauskopieren, zur Positionssuche, zum Formatieren etc.

 
1. Einen "Substring" kopieren mit Copy:
// Aufbau:
// copy ( Variable, Startposition, Anzahl Zeichen)

// Einfaches Beispiel:
var
  s : String;
begin
  s := 'Sonnenblumenkerne';
  edDisplay.text := copy(s, 7, 5);
  // nun steht 'blume' im Edit edDisplay
  edDisplay2.Text := copy( s, 13, 100);
  // hier steht 'kerne' im Edit.
  // Dynamisch geht das ganze auch mit
  // copy(s, x, Length(s));
  // wobei x irgendeine Startposition sein kann,
  //  die auch mit der pos-funktion gefunden werden kann.
  // Length(s) siehe 5.
end;
Sollte einer der Werte für die Position oder die Länge außerhalb des Bereiches liegen, so wird ein leerer String zurückgegeben.
 
2. Position erhalten mit pos:
// Aufbau:
// pos ( Substring, Variable)

// Einfaches Beispiel:
var
  s : String;
begin
  s := 'Sonnenblumenkerne';
  if pos('blume', s) > 0 then
    edResultFlower.Text := 'enthalten'
  else
    edResultFlower.Text := 'nicht enthalten';
  // in edResultFlower
  edPosition.Text := IntToStr( pos( 'Blume', s));
  // da her ein Inhaltsfehler ist (B anstatt b), wird 0 als Position zurückgegeben.
end;
Will man größere Texte verwenden, so muss man sich eine eigene Methode basteln, welche das nächste Element in der Zeichenkette findet.
 
3. Löschen von Zeichen mit Delete:
// Aufbau:
// Delete ( Variable, Startposition, Anzahl Zeichen)

// Einfaches Beispiel:
var
  s : String;
begin
  s := 'Sonnenblumenkerne';
  Delete( s, 7, 6);
  edDisplay.Text := s;
  // Hier wird im Edit edDisplay nur 'Sonnenkerne' stehen.
end;
Diese Prozedur verändert den String nicht, falls Position oder Längenangabe Fehlerhaft sind.
 
4. Einfügen mit Insert:
// Aufbau:
// Insert ( Substring, Variable, Position)

// Einfaches Beispiel:
var
  s : String;
begin
  s := 'Sonnenkerne';
  Insert('blumen', s, 7);
  edDisplay.Text := s;
  // hiernach steht 'Sonnenblumenkerne' im Edit edDisplay
end;
Sollte hier die Position größer als der eigentliche String angegeben werden, so wird der Substring an das Ende des Strings gestellt. Wenn die Positionsangabe negativ ist, wird es vor der 1. Position eingefügt.
 
5. Länge ermitteln mit Length:
// Aufbau:
// Length ( String oder Variable vom Typ String)

// ...
    s := 'Sonnenblumenkerne';
    len := Length(s);
// ...
Da Strings wie Arrays behandelt werden, können wir die bekannte Methode Length( s : String) zur Längenbestimmung des Strings nutzen.
 
6. Formatierung von Strings mittels der Format-Prozedur:
// Aufbau:
// Format ( String, [Liste der Variablen])

// Einfaches Beispiel:
var
  s : String;
  d : Double;
  i : Integer;
begin
  i := 2;
  d := 3.14159;
  s := Format( 'PI ist %2.2f. Multipliziert mit %d ist %2.4f', [d,i,i*d]);
  edDisplay.text := s;
  // hiernach steht im Edit edDisplay:
  // PI ist 3,14. Multipliziert mit 2 ist 6,2832
end;
Aufbau des Formatierungs-Strings wie folgt: "%" [index ":"] ["-"] [größe] ["." präzision] typ
Im String, welcher die Formatierung enthält, können folgende Typen genutzt werden:
Typ Beschreibung Beispiel-Format Beispiel-Wert
d Integer mit Vorzeichen %d -123
e Wissenschafftliche Notation - Kommazahl %e 3,14159265358979E+000
f Normale Kommazahlendarstellung %1.4f 3,1416
m Kommazahldarstellung für Währungswerte. %m 3,14 €
n Kommazahldarstellung mit Tausendertrennung %.4n 1.234,5678
s String %s Beispiel
x Ein Integer wird in Hexadezimal-Schreibweise geschriben. %x 0A7FCA
(Die hier aufgelisteten sind die Gebräuchlichsten. Weitere findet ihr in der Delphi-Hilfe, wenn ihr nach 'Format-Routine' sucht)
 
 

Einfache Text-Dateien-Behandlung mit TStringList

TStringList ist ein Objekt. Dieses ist eine Liste von Strings. Hier folgt eine Beschreibung der wichtigsten Methoden und Attribute.
1. Laden und Anzeigen im Detail:
var
  // Definition der Variable
  slTextFile : TStringList;
begin
  // Instanziieren des Objektes
  slTextFile := TStringList.Create;
  try // wir benutzen try finally, damit
      // das Objekt trotzdem freigegeben wird,
      // falls eine Ausnahme auftritt;
    // hier die Methode zum Öffnen einer Datei.
    slTextFile.LoadFromFile( 'C: est.txt');
    // ggf. Lösche alle vorhandenen Zeilen im Memo:
    mmDisplay.Lines.Clear;
    // Strings bei Memo hinzufügen
    mmDisplay.Lines.AddStrings( slTextFile);
    // Wenn ihr TOpenDialog verwendet,
    // dann könnt ihr OpenDialog.Filename
    // benutzen um die Datei zu öffnen.
  finally
    // Freigeben der Instanz
    slTextFile.Free;
  end;
end;
Zur Info an alle, die den Filehandling 2 nicht angeschaut haben - hier wird TOpenDialog weiter vorgestellt.
 
2. Weitere Methoden (Basics):
Methode Beschreibung Beispiel
add( s : String); Fügt ein String an das Ende hinzu. sl.Add( s);
Delete( index : Integer); Löscht ein String aus der Liste. sl.Delete( 2);
Insert( index : Integer; s : String); Fügt an bestimmter Stelle einen String ein. sl.Insert( 3, s);
SaveToFile( FileName : String); Speichert die Liste als Text-Datei in Datei FileName ab sl.SaveToFile( 'C:\test.txt');
 
Also, ich hoffe ihr habt hierbei viel gelernt und hattet Spaß beim nachprogrammieren ;-)
 
Wer das nachprogrammiert hat, darf gerne seinen Sourcecode an mich zusenden. Falls es für dich in Ordnung geht, publiziere ich es mit deiner Einwilligung auch auf Github und verlinke dies hier. Ansonsten bleibt das aktuell leider pure Theorie ohne Code-Beispiel.