TTextBuffer — veränderlicher Text
Ein Textpuffer, der wächst: die Antwort auf die Frage, wohin veränderlicher Text gehört, wenn pchar nur ein Zeiger auf unveränderliche Zeichen ist. Vega hält damit den Inhalt jedes Eingabefelds (TCustomEdit), die Überschrift einer TListColumn, den Text eines TTreeNode und jeden Eintrag einer TStringList.
Unit: Vega.Strings
→ Alle Steuerelemente · TStringList · pchar in der Sprachreferenz
Einordnung
Caption und Verwandte halten in Vega nur den Zeiger auf einen Text — meist auf ein Literal, das ewig lebt. Sobald Text aus Eingaben, Dateien oder Berechnungen entsteht, braucht er einen Besitzer, und das ist der TTextBuffer. Er kennt die Länge in Bytes und in Zeichen getrennt, weil UTF-8 beides auseinanderlaufen lässt.
Verwendung
unit Main;
import std.io;
import Vega.Types;
import Vega.Strings;
fn main(): int64 {
var b: TTextBuffer := new TTextBuffer();
b.SetText("Gruesse");
Print("Inhalt: "); Print(b.AsPChar()); Print("\n");
PrintLn(StrConcat("Bytes: ", IntToStr(b.Length)));
PrintLn(StrConcat("Zeichen: ", IntToStr(b.CharCount())));
// Einfuegen an einer BYTE-Position; der Rueckgabewert ist die neue Position
var p: int64 := b.InsertText(0, "Viele ");
Print("nach InsertText: "); Print(b.AsPChar()); Print("\n");
// Umlaute: Byte- und Zeichenzaehlung unterscheiden sich
b.SetText("äöü");
PrintLn(StrConcat("Bytes: ", IntToStr(b.Length)));
PrintLn(StrConcat("Zeichen: ", IntToStr(b.CharCount())));
PrintLn(StrConcat("Byteposition von Zeichen 1: ", IntToStr(b.PosOfChar(1))));
b.Clear();
PrintLn(StrConcat("nach Clear: ", IntToStr(b.Length)));
b.Destroy();
return 0;
}
Inhalt: Gruesse
Bytes: 7
Zeichen: 7
nach InsertText: Viele Gruesse
Bytes: 6
Zeichen: 3
Byteposition von Zeichen 1: 2
nach Clear: 0
Übersetzt und ausgeführt mit lyxc 1.1.3I — an äöü sieht man den Unterschied: 6 Bytes, 3 Zeichen.
Besonderheiten
- Positionen sind Byte-Positionen.
InsertChar,InsertTextundDeleteRangerechnen in Bytes;PosOfChar(index)undCharIndexAt(pos)rechnen zwischen Zeichen und Bytes um. NextPos/PrevPoswandern zeichenweise durch den Puffer — der richtige Weg, um eine Schreibmarke zu bewegen, ohne mitten in einem Mehrbyte-Zeichen zu landen.AsPChar()liefert den Zeiger auf den Inhalt. Er gilt nur, solange der Puffer nicht wächst — nach einemInsertTextkann er woanders liegen.- Wer den Puffer anlegt, gibt ihn frei (
Destroy()). Eine Ausnahme ist die TStringList: Sie besitzt ihre Puffer und räumt sie selbst weg. Reserve(n)nimmt das Wachsen vorweg, wenn die Endgröße bekannt ist.
Eigenschaften
Alle Eigenschaften, auch die geerbten.
| Name | Typ | Bedeutung | Herkunft |
|---|---|---|---|
Data | int64 | Adresse des Speicherblocks | eigen |
Length | int64 | Länge in Bytes | eigen |
Capacity | int64 | Belegter Platz in Bytes | eigen |
Methoden
Alle Methoden, auch die geerbten.
| Signatur | Zweck | Herkunft |
|---|---|---|
Create(): void | Anlegen; new TTextBuffer() | eigen |
Destroy(): void | Speicher freigeben | eigen |
SetText(s: pchar): void | Inhalt ersetzen | eigen |
AsPChar(): pchar | Zeiger auf den Inhalt (gilt bis zum nächsten Wachsen) | eigen |
Clear(): void | Inhalt leeren | eigen |
Reserve(n: int64): bool | Platz für n Bytes vorab belegen | eigen |
ByteAt(i: int64): int64 | Byte an einer Position | eigen |
CharCount(): int64 | Länge in Zeichen | eigen |
NextPos(pos: int64): int64 | Byteposition des nächsten Zeichens | eigen |
PrevPos(pos: int64): int64 | Byteposition des vorigen Zeichens | eigen |
PosOfChar(index: int64): int64 | Byteposition eines Zeichens | eigen |
CharIndexAt(pos: int64): int64 | Zeichenindex an einer Byteposition | eigen |
InsertChar(pos: int64, cp: int64): int64 | Zeichen einfügen, liefert die neue Position | eigen |
InsertText(pos: int64, s: pchar): int64 | Text einfügen, liefert die neue Position | eigen |
DeleteRange(start: int64, stop: int64): void | Bereich löschen (Bytepositionen) | eigen |
Ereignisse
Keine.
Letzte Aktualisierung: 2026-08-19 — API aus Vega/Strings.lyx erhoben, Beispiel mit lyxc 1.1.3I übersetzt und ausgeführt.
