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

 Texteditor


2023/12/28 • 6 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. 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;
    }
    ...

Siehe auch




Feedback senden für
DE|EN Impressum