====== 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 ([[lyx_-_programmiersprache:vega:controls:tcustomedit|TCustomEdit]]), die Überschrift einer [[lyx_-_programmiersprache:vega:controls:tlistcolumn|TListColumn]], den Text eines [[lyx_-_programmiersprache:vega:controls:ttreenode|TTreeNode]] und jeden Eintrag einer [[lyx_-_programmiersprache:vega:controls:tstringlist|TStringList]].
Unit: ''Vega.Strings''
→ [[lyx_-_programmiersprache:vega:controls|Alle Steuerelemente]] · [[lyx_-_programmiersprache:vega:controls:tstringlist|TStringList]] · [[lyx_-_programmiersprache:sprache:datentypen#pchar_nullterminierter_string|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'', ''InsertText'' und ''DeleteRange'' rechnen in Bytes; ''PosOfChar(index)'' und ''CharIndexAt(pos)'' rechnen zwischen Zeichen und Bytes um.
* ''NextPos''/''PrevPos'' wandern **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 einem ''InsertText'' kann er woanders liegen.
* **Wer den Puffer anlegt, gibt ihn frei** (''Destroy()''). Eine Ausnahme ist die [[lyx_-_programmiersprache:vega:controls:tstringlist|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'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Adresse des Speicherblocks | eigen |
| ''Length'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Länge in **Bytes** | eigen |
| ''Capacity'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|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.