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, 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 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.