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