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.