====== 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]] ---- ===== Vererbung ===== **Kette:** **TTextBuffer** — eigene Wurzel, kein Vorfahr. Was diese Klasse kann, steht vollständig auf dieser Seite. **Direkte Nachfahren:** keine — diese Klasse wird nicht weiter abgeleitet. **Quelle:** ''vega/strings.lyx'' ---- ===== 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 | | ''CopyRangeTo(dst: TTextBuffer, start: int64, stop: int64): void'' | Teilstueck in einen anderen Puffer kopieren (für Zwischenablage/Auswahl) | eigen | | ''DeleteAt(pos: int64): void'' | Das Zeichen AN pos löschen (Entf). Die Marke bleibt, wo sie ist | eigen | | ''DeleteBefore(pos: int64): int64'' | Das Zeichen VOR pos löschen (Ruecktaste). Liefert die neue Marke | eigen | ---- ===== Ereignisse ===== Keine. Letzte Aktualisierung: 2026-09-05 — gegen ''lyx-vcl/vega/*.lyx'' abgeglichen: Abschnitt „Vererbung" (Vorfahr-Kette, direkte Nachfahren, Quelldatei) ergänzt und die fehlenden Eigenschaften, Methoden und Ereignisse nachgetragen. Vorherige letzte Aktualisierung: 2026-08-19 — API aus ''Vega/Strings.lyx'' erhoben, Beispiel mit ''lyxc 1.1.3I'' übersetzt und ausgeführt. Codebeispiele geprüft: gegen **lyxc 1.2.5C** übersetzt (Prüflauf 2026-09-08 über die gesamte Doku: 574 Vollprogramme, 0 echte Fehler; zusätzlich 5159 Aufrufe gegen die ''pub fn''-Signaturen in ''aurum/std'' gehalten, 0 Abweichungen).