| Docs Hilfe
  AppSource  
Docs  /  App  /  NAVAX Extension Base  /  Informationen für Entwickler

 Texteditor


2026/06/22 • 8 Min. Lesedauer
Der Texteditor kann mit Hilfe der Codeunit NCEX Text Editor Mgt. über die Funktion EditText und ShowText aufgerufen werden. Für die Funktion EditText stehen mehrere Varianten (bzw. mehrere Überladungen) zur Verfügung. Die Funktion ShowText ist nur zum Anzeigen und nicht zum Bearbeiten eines Textes gedacht. Die Funktion SetPageCaption kann vor der Funktion EditText bzw. ShowText aufgerufen werden um die Caption der Editor-Seite zu setzen. Nachfolgenden Beispiele zeigen verschiedene Ausgangssituationen und Möglichkeiten zur Integration des Texteditors.

Alles im Textfeld speichern

Der Texteditor kann z.B. mit einer Variable der Art Text aufgerufen werden:
procedure EditText(var Text: Text; MaxLineStrLen: Integer; MaxTextLen: Integer; ReadOnly: Boolean) TextModified: Boolean

Parameter

  • Text Gibt den Text an, der editiert werden soll.
  • MaxLineStrLen Falls angegeben, kann damit die maximale Anzahl der Zeichen pro Zeile begrenzt werden. Der Text wird bei der Eingabe im Editor automatisch umgebrochen, falls die Länge überschritten wird. Der Umbruch versucht dabei Wörter ganz zu lassen.
  • MaxTextLen Falls angegeben, kann damit die maximale Anzahl der Zeichen des gesamten Textes begrenzt werden.
  • ReadOnly Gibt an, ob der Editor im schreibgeschützten Modus geöffnet werden soll. Im schreibgeschützten Modus kann der Text nicht geändert werden. Der Text kann aber markiert und Inhalte daraus können kopiert werden.

Szenario

  • Nachfolgendes Beispiel zeigt die Integration des Editors in die Registrierkassenbon-Texteinrichtung. Die Tabelle verfügt über ein Textfeld mit einer Länge von 1000 Zeichen:
    ...
    field(10; "Text"; Text[1000])
    {
        DataClassification = CustomerContent;
        Caption = 'Text', Comment = 'DEU="Text"';
    }
    field(15; "Starting Date"; Date)
    {
    ...
    Da jeder Textzeile zusätzlich zum Text noch ein Startdatum und ein Enddatum hinterlegt werden kann und das Textfeld selbst groß genug ist, wurde hier nachfolgende einfache Lösung gewählt, welche den Text nicht auf mehrere Zeilen aufgesplittet. Ein Zeilenumbruch im Text ist trotzdem möglich. Wichtig dabei ist, dass das Textfeld in der Page auf Editable = false; gesetzt wird, da in dieser Lösung die Zeilenumbrüche (nicht sichtbar) ebenfalls im Textfeld gespeichert werden.

Implementierung

  • Table
    ...
    procedure EditText(Editable: Boolean)
    var
        NCEXTextEditorMgt: Codeunit "NCEX Text Editor Mgt.";
        TempText: Text;
    begin
        TempText := Text;
        if not NCEXTextEditorMgt.EditText(TempText, 0, MaxStrLen(Text), not Editable) then
            exit;
        Text := CopyStr(TempText, 1, MaxStrLen(Text));
    end;
    ...
    Page
    ...
    field("Text"; Rec."Text")
    {
        ApplicationArea = All;
        ToolTip = 'Specifies the text. Click on the field to edit the text.', Comment = 'DEU="Gibt den Text an. Klicken Sie auf das Feld, um den Text zu bearbeiten."';
        Editable = false;
        AssistEdit = true;
    
        trigger OnAssistEdit()
        begin
            Rec.EditText(CurrPage.Editable());
            CurrPage.Update();
        end;
    }
    ...

Text auf mehrere Zeilen aufsplitten

Der Texteditor kann auch mit einer Variable der Art RecordRef aufgerufen werden:
procedure EditText(RecordRef: RecordRef; TextFieldNo: Integer; var TempBlob: Codeunit "Temp Blob"; ReadOnly: Boolean) TextModified: Boolean

Parameter

  • RecordRef Gibt an, welche Tabelle und welche Datensätze aus der Tabelle in den Texteditor geladen werden sollen.

    Wichtig

    Es muss besonders darauf geachtet werden, dass die richtigen Filter am RecordRef gesetzt sind.
  • TextFieldNo Gibt an, in welchem Feld der Text gespeichert ist.

    Hinweis

    Die maximale Anzahl der Zeichen pro Zeile (MaxLineStrLen) wird bei diesem Aufruf über die Länge des TextFieldNo-Feldes ermittelt. Der Text wird bei der Eingabe im Editor automatisch umgebrochen, falls die Länge überschritten wird. Der Umbruch versucht dabei Wörter ganz zu lassen.
  • TempBlob Enthält den neuen, editierten Text.
  • ReadOnly Gibt an, ob der Editor im schreibgeschützten Modus geöffnet werden soll. Im schreibgeschützten Modus kann der Text nicht geändert werden. Der Text kann aber markiert und Inhalte daraus können kopiert werden.

Szenario

  • Nachfolgendes Beispiel zeigt eine mögliche Integration des Editors in die Textbausteinzeilen: Da die Tabelle "Extended Text Line" nur den Text enthält und das Textfeld mit einer Länge von 100 Zeichen nicht groß genug ist, wurde hier nachfolgende Lösung gewählt, welche den Text auf mehrere Zeilen aufgesplittet.

Implementierung

  • pageextension 50000 "NVX Extended Text Lines" extends "Extended Text Lines"
    {
        actions
        {
            addfirst(Processing)
            {
                action(NVXTextEditorAction)
                {
                    ApplicationArea = All;
                    Caption = 'Text Editor', Comment = 'DEU="Texteditor"';
                    Image = Edit;
                    ToolTip = 'Edit the text in the text editor.', Comment = 'DEU="Bearbeiten Sie den Text im Texteditor."';
    
                    trigger OnAction()
                    var
                        ExtendedTextLine: Record "Extended Text Line";
                        NCEXTextEditorMgt: Codeunit "NCEX Text Editor Mgt.";
                        TempBlob: Codeunit "Temp Blob";
                        RecordRef: RecordRef;
                        InStream: InStream;
                        NextLineNo: Integer;
                        TempText: Text;
                    begin
                        Clear(ExtendedTextLine);
                        ExtendedTextLine.SetRange("Table Name", Rec."Table Name");
                        ExtendedTextLine.SetRange("No.", Rec."No.");
                        ExtendedTextLine.SetRange("Language Code", Rec."Language Code");
                        ExtendedTextLine.SetRange("Text No.", Rec."Text No.");
                        RecordRef.GetTable(ExtendedTextLine);
                        if not NCEXTextEditorMgt.EditText(RecordRef, ExtendedTextLine.FieldNo(Text), TempBlob, not CurrPage.Editable()) then
                            exit;
    
                        ExtendedTextLine.LockTable();
                        ExtendedTextLine.DeleteAll();
                        NextLineNo := 10000;
                        TempBlob.CreateInStream(InStream);
                        while (not InStream.EOS()) do begin
                            Clear(ExtendedTextLine);
                            ExtendedTextLine."Table Name" := Rec."Table Name";
                            ExtendedTextLine."No." := Rec."No.";
                            ExtendedTextLine."Language Code" := Rec."Language Code";
                            ExtendedTextLine."Text No." := Rec."Text No.";
                            ExtendedTextLine."Line No." := NextLineNo;
                            NextLineNo += 10000;
                            InStream.ReadText(TempText);
                            ExtendedTextLine.Text := CopyStr(TempText, 1, MaxStrLen(ExtendedTextLine.Text));
                            ExtendedTextLine.Insert();
                        end;
                    end;
                }
            }
        }
    }

Text in einem Blob speichern

Ein Aufruf des Texteditors mit Codeunit "Temp Blob" ohne RecordRef ist ebenfalls möglich:
procedure EditText(var TempBlob: Codeunit "Temp Blob"; MaxLineStrLen: Integer; MaxTextLen: Integer; ReadOnly: Boolean) TextModified: Boolean

Parameter

  • TempBlob Enthält den Text, der editiert werden soll.
  • MaxLineStrLen Falls angegeben, kann damit die maximale Anzahl der Zeichen pro Zeile begrenzt werden. Der Text wird bei der Eingabe im Editor automatisch umgebrochen, falls die Länge überschritten wird. Der Umbruch versucht dabei Wörter ganz zu lassen.
  • MaxTextLen Falls angegeben, kann damit die maximale Anzahl der Zeichen des gesamten Textes begrenzt werden.
  • ReadOnly Gibt an, ob der Editor im schreibgeschützten Modus geöffnet werden soll. Im schreibgeschützten Modus kann der Text nicht geändert werden. Der Text kann aber markiert und Inhalte daraus können kopiert werden.

Szenario

  • Wenn der Text direkt zum Datensatz gespeichert werden soll (d.h. keine Aufsplittung auf mehrere Datensätze) und die Lösung über ein Textfeld aufgrund der begrenzten Feldlänge (je nach Definition max. 2048 Zeichen) nicht in Frage kommt, kann der Text auch in einem Blob-Feld gespeichert werden. Optional kann ein weiteres Feld angelegt werden, welches eine Vorschau auf den Inhalt des Blob-Feldes anzeigt. Nachfolgendes Beispiel zeigt eine mögliche Lösung.

Implementierung

  • Table
    ...
    field(50000; "Text Preview"; Text[250])
    {
        DataClassification = CustomerContent;
        Caption = 'Text Preview', Comment = 'DEU="Textvorschau"';
    }
    field(50001; "Text Storage"; Blob)
    {
        DataClassification = CustomerContent;
        Caption = 'Text Storage', Comment = 'DEU="Textspeicher"';
    }
    
    procedure EditText(Editable: Boolean)
    var
        NCEXTextEditorMgt: Codeunit "NCEX Text Editor Mgt.";
        TempBlob: Codeunit "Temp Blob";
        InStream: InStream;
        OutStream: OutStream;
        NewText: Text;
    begin
        CalcFields("Text Storage");
        "Text Storage".CreateInStream(InStream);
        TempBlob.CreateOutStream(OutStream);
        CopyStream(OutStream, InStream);
        if not NCEXTextEditorMgt.EditText(TempBlob, 0, 0, not Editable) then
            exit;
        TempBlob.CreateInStream(InStream);
        InStream.Read(NewText);
        SaveText(NewText);
    end;
    
    procedure SaveText(NewText: Text)
    var
        OutStream: OutStream;
    begin
        "Text Storage".CreateOutStream(OutStream);
        OutStream.Write(NewText);
        "Text Preview" := CopyStr(NewText, 1, MaxStrLen("Text Preview"));
    end;
    ...
    Page
    ...
    field("Text Preview"; Rec."Text Preview")
    {
        ApplicationArea = All;
        ToolTip = 'Specifies the text. Click on the field to edit the text.', Comment = 'DEU="Gibt den Text an. Klicken Sie auf das Feld, um den Text zu bearbeiten."';
        Editable = false;
        AssistEdit = true;
    
        trigger OnAssistEdit()
        begin
            Rec.EditText(CurrPage.Editable());
            CurrPage.Update();
        end;
    }
    ...

Editor um eigene Aktionen erweitern

Werden eigene Aktionen zum Texteditor hinzugefügt, welche nur für bestimmte Bereiche sichtbar sein sollen, müssen diese mit der Funktion SetExtendedOptions aktiviert und verknüpft werden.

Szenario

  • Es soll eine Aktion Tabellenbeschriftung hinzufügen zur Verfügung stehen, die an der aktuellen Cursorposition eine Tabellenüberschrift zum Text hinzufügt. Nachfolgendes Beispiel zeigt eine mögliche Lösung.

Implementierung

  • Table
    table 50000 "Text Editor Options"
    {
        DataClassification = SystemMetadata;
        Caption = 'Text Editor Options', Comment = 'DEU="Texteditor Optionen"';
        TableType = Temporary;
        ReplicateData = false;
    
        fields
        {
            field(1; "Primary Key"; Code[10])
            {
                DataClassification = SystemMetadata;
                Caption = 'Primary Key', Comment = 'DEU="Primärschlüssel"';
            }
            field(2; "Table No."; Integer)
            {
                DataClassification = SystemMetadata;
                Caption = 'Table No.', Comment = 'DEU="Tabellennr."';
            }
        }
    
        keys
        {
            key(Key1; "Primary Key")
            {
            }
        }
    }
    Page Extension
    pageextension 50000 "Text Editor 2" extends "NCEX Text Editor 2"
    {
        actions
        {
            addlast(Processing)
            {
                action(AddTableCaptionAction)
                {
                    ApplicationArea = All;
                    Caption = 'Add Table Caption', Comment = 'DEU="Tabellenbeschriftung hinzufügen"';
                    ToolTip = 'Adds the table caption to the text.', Comment = 'DEU="Fügt die Tabellenbeschriftung zum Text hinzu."';
                    Visible = AddTableCaptionVisible;
                    Enabled = AddTableCaptionEnabled;
                    Image = Add;
    
                    trigger OnAction()
                    var
                        TempTextEditorOptions: Record "Text Editor Options" temporary;
                        AllObjWithCaption: Record AllObjWithCaption;
                        TableCaption: Text;
                    begin
                        ExtendedOptionsRecordRef.SetTable(TempTextEditorOptions);
                        AllObjWithCaption.Get(AllObjWithCaption."Object Type"::Table,TempTextEditorOptions."Table No.");
                        TableCaption := AllObjWithCaption.TableCaption();
                        InsertTextAtCurrentPosition(TableCaption);
                    end;
                }
            }
    
            addlast(Promoted)
            {
                actionref(AddTableCaptionAction_Promoted; AddTableCaptionAction) { }
            }
        }
    
        var
            AddTableCaptionVisible: Boolean;
            AddTableCaptionEnabled: Boolean;
    
        trigger OnOpenPage()
        begin
            AddTableCaptionVisible := (ExtendedOptionsID = Database::"Text Editor Options");
            AddTableCaptionEnabled := not GetReadOnly();
        end;
    }
    Aufruf des Editors
    ...
    var
        TempTextEditorOptions: Record "Text Editor Options" temporary;
        NCEXTextEditorMgt: Codeunit "NCEX Text Editor Mgt.";
        ExtendedOptionsRecordRef: RecordRef;
    ...
        NCEXTextEditorMgt.SetPageCaption('TEST');
        Clear(TempTextEditorOptions);
        TempTextEditorOptions."Table No." := Database::Customer;
        TempTextEditorOptions.Insert();
        ExtendedOptionsRecordRef.GetTable(TempTextEditorOptions);
        NCEXTextEditorMgt.SetExtendedOptions(ExtendedOptionsRecordRef);
        if not NCEXTextEditorMgt.EditText(TempBlob, 0, 0, not Editable) then
            exit;
    ...

Copilot

Ab Business Central 28 steht Copilot bzw. die Aktion Entwurf mit Copilot im Texteditor zur Verfügung. Über die Funktion SetCopilotPromptLists können System-Prompts und Vorschläge für Benutzer-Prompts angegeben werden.

Hinweis

  • Der Texteditor fügt automatisch folgenden System-Prompt hinzu, wenn MaxTextLen angegeben ist: StrSubstNo('Der Text darf %1 Zeichen nicht überschreiten.', MaxTextLen)
  • Im Prompt kann die Variable [NCEX_EditorText] angegeben werden. Diese wird beim Aufruf der Aktion Entwurf mit Copilot mit dem aktuellen Text des Editors ersetzt.

Weitere Informationen




Feedback senden für
DE|EN Impressum