Seite 5 von 5

Verfasst: 08.04.2007 10:41
von Scarabol
Hallo Leute,

ich stimme Kiffi zu, man sollte wirklich die ReadFile Befehle verwenden, da nach einer Änderung durch einen Anfänger leicht unbeabsichtigt Dateien erstellt werden, die gar nicht erwünscht sind.

Vielleicht sollte man die StatusLeiste noch mit der CursorPosition bestücken, dazu folgende Funktionen aus dem CodeArchiv.

Code: Alles auswählen

Procedure StringGadgetCursorX(Gadget)
  SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Min,@Max)
  ProcedureReturn
Max-SendMessage_(GadgetID(Gadget),#EM_LINEINDEX,SendMessage_(GadgetID(Gadget),#EM_LINEFROMCHAR,Min,0),0)+1 
EndProcedure

Procedure StringGadgetCursorY(Gadget)
  SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Min,@Max)
  ProcedureReturn
SendMessage_(GadgetID(Gadget),#EM_LINEFROMCHAR,Min,0)+1
EndProcedure
Gruß und weiter so :allright:
Scarabol

Verfasst: 08.04.2007 16:09
von mk-soft
Werde ich noch zum Beispiel einpflegen. Das Drucken auch noch.

Danke für die Anregungen.

FF :wink:

Re: Dokumentiertes Beispiel für ein Editor (Tutorial - Edito

Verfasst: 27.10.2010 00:59
von mpz
Hi mk-soft,

sollte da nicht noch eine Druckfunktion kommen... ;)

Zwischenzeitlich habe ich einen Editor mit Zeilen und Positionsangabe benötigt und habe Deinen Editor darauf (und auf PB 4.51) angepasst. Du siehst das Programm wird verwendet...

Gruß Michael

Code: Alles auswählen

 
;-TOP
; Kommentar : Einfacher Texteditor für PB4 Vollversion
; Author    : mk-soft
; Datei     : PBeditor.pb
; Version   : v1.08
; Erstellt  : 05.09.2006
; Geändert  : 27.10.2010

; *****************************************************************************
;{ API SendMessage_(...)
;
; Ergebnis = SendMessage_(hwnd, uMsg, wParam, lParam)
;
; hwnd     : Integer - Handle des Empfängers
; uMsg     : Integer - Nummer der Meldung
; wParam   : 16-Bit-Version: Integer - 16-Bit meldungsabhängige Informationen
;            32-Bit-Version: LongInt - 32-Bit meldungsabhängige Informationen
; lParam   : Long oder Pointer - 32-Bit meldungsabhängige Informationen
;
; Ergebnis : Rückgabewert der Meldung
;
; Es wird eine Meldung an das Fenster bzw. Fensterobjekt mit dem Handle hwnd gesandt
; und gegebenenfalls eine Antwort zurückgemeldet.
;
; Verwendete Meldungen für das StringGadget
;
; WM_UNDO       : Letzte Änderung rückgangig machen
; WM_CUT        : Markierung ausschneiden und in der Zwischenablage ablegen
; WM_COPY       : Markierung in der Zwischenablage ablegen
; WM_PASTE      : Aus der Zwischenablage an der Cursorpostion einfügen
; EM_SETSEL     : Textbereich markieren
;                 wParam - Startpostion
;                 lParam - Endpostion
;                 Bei wParm = 0 und lParm = -1 wird der gesamte Text markiert
; EM_SETMARGINS : Randeinstellungen für das Textbereich einstellen
;                 wParam - EC_LEFTMARGIN - Linken Rand in Pixel
;                 wParam - EC_RIGHTMARGIN - Rechtem Rand in Pixel
;                 lParam - MAKELONG(wLeft,wRight)
;}
; *****************************************************************************
;{ API Verwendete Konstanten für das StringGadget (WindowObjekt EditBox)
; Style = #ES_MULTILINE | #WS_VSCROLL | #WS_HSCROLL ; mit Oder verknüpft
; ES_MULTILINE : Mehrzeilig
; WM_VSCROLL   : Vertikalen Scrollbalken hinzufügen
; WM_HSCROLL   : Horizentalen Scrollbalken hinzufügen
;}
; *****************************************************************************

;- Konstanten

#ABOUT = "Einfacher TextEditor Version 1.07" +#LF$+#LF$ + "Author: mk-soft" + #LF$ + "Compiler: Purebasic v4.51"

;-- ID für Fenster
Enumeration
  #Window
EndEnumeration

;-- ID für Menu
Enumeration
  #Menu
EndEnumeration

;-- ID für Toolbar
Enumeration
  #ToolBar
EndEnumeration

;-- ID´s für MenuItems
Enumeration
  ;--- Menu Datei
  #Menu_Neu
  #Menu_Oeffnen
  #Menu_Speichern
  #Menu_Speichern_als
  #Menu_Beenden
  #Menu_Zurueck
  ;--- Menu Bearbeiten
  #Menu_Ausschneiden
  #Menu_Kopieren
  #Menu_Einfuegen
  #Menu_Markieren
  ;--- Menu Hilfe
  #Menu_Ueber
EndEnumeration

;-- ID für StatusBar
Enumeration
  #StatusBar
EndEnumeration

;-- ID für Edit (Textfeld)
Enumeration
  #Edit
EndEnumeration

; *****************************************************************************

; *****************************************************************************
;- Globale Variablen

Global Exit.l ; Programm ende
Global Titel.s ; Fenstertitel
Global Datei.s ; Aktuelle Datei
Global Speichern.l ; Speichern anfordern
Global Neu.l ; Neue Datei

; *****************************************************************************

;- Unterprogramme

Procedure.l MAKELONG(LowWord.l, HighWord.l)

;{ API Hilfsfunktion MAKELONG
; Mache Funktionen bei Sendmessage benötigen in den Parameter lParam zwei Word Werte.
; Diese müssen dann erst zusammengesetzt werden. Das HighWord 16 Bit nach Links schieben
; und das LowWord mit ODER anfügen. Das Ergebnis ist somit ein Longwert.
;}

  result.l = HighWord << 16 | LowWord
  ProcedureReturn result

EndProcedure

; *****************************************************************************

Procedure UpdateWindow()

;{ Procedure für Grössenänderung
; Je nach Einstellung des Destop kann die Höhe von den Menu, Toolbar und Statusleise variieren.
; Somit ist die Arbeitshöhe für das StringGadget nicht nur abhängig von der Fensterhöhe,
; sondern auch von der Desktop Einstellung und muss daher berechnet werden.
; Edithöhe = Fensterhöhe - Menuhöhe - Toolbarhöhe - Statusbarhöhe
;}

  mn = MenuHeight()
  tb = ToolBarHeight(#ToolBar)
  sb = StatusBarHeight(#StatusBar)
  dx = WindowWidth(#Window)
  dy = WindowHeight(#Window) - mn - tb - sb
  ResizeGadget(#Edit, 0, tb, dx, dy)
    
EndProcedure

; *****************************************************************************

Procedure UpdateMenu()

;{ Procedure für Aktuallisierung von Menu´s
; EM_GETSEL gibt den Start- und Endeposision von den selektierten Bereich zurück.
; Ist Ende grösser Start dann könnten die Menu´s Ausschneiden und Kopieren freigegeben werden
;
; WM_GETTEXTLENGHT gibt den länge des Textes zurück.
; Ist die Länge grösser Null dann kann das Menu Alles markieren freigegeben werden.
;
; EM_CANUNDO gibt zurück das Rückgängig möglich ist und somit das Menu Rückgängig
; freigegeben werden kann
;}

  ; Prüfen auf Markierung
  SendMessage_(GadgetID(#Edit), #EM_GETSEL, @lpStart.l, @lpEnde.l)
  If lpEnde > lpStart
    DisableMenuItem(#Menu, #Menu_Ausschneiden, 0)
    DisableMenuItem(#Menu, #Menu_Kopieren, 0)
  Else
    DisableMenuItem(#Menu, #Menu_Ausschneiden, 1)
    DisableMenuItem(#Menu, #Menu_Kopieren, 1)
  EndIf
  ; Prüfen Zeichen
  textlen = SendMessage_(GadgetID(#Edit), #WM_GETTEXTLENGTH, 0, 0)
  If textlen > 0
    DisableMenuItem(#Menu, #Menu_Markieren, 0)
  Else
    DisableMenuItem(#Menu, #Menu_Markieren, 1)
  EndIf
  ; Prüfen auf Rückgängig möglich
  If SendMessage_(GadgetID(#Edit), #EM_CANUNDO, 0, 0)
    DisableMenuItem(#Menu, #Menu_Zurueck, 0)
  Else
    DisableMenuItem(#Menu, #Menu_Zurueck, 1)
  EndIf
  

  
EndProcedure
; *****************************************************************************

Procedure Datei_Speichern_als()

;{ Procedure für Datei speichern als
;
;}

  Protected temp.s
  ; Dateiname erfragen
  temp = SaveFileRequester("Datei Speichern als", Datei, "Text (*.txt)|*.txt|Alle Dateien|*.*", 0)
  If temp = ""
    ProcedureReturn 0
  EndIf
  ; Extension automatisch anfügen
  If GetExtensionPart(temp) = ""
    If SelectedFilePattern() = 0
      temp + ".txt"
    EndIf
  EndIf
  ; Datei prüfen
  If FileSize(temp) >= 0
    r1 = MessageRequester("Frage", "Datei " + Datei + " überschreiben?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)
    If r1 = #PB_MessageRequester_No
      ProcedureReturn 0
    EndIf
  EndIf
  ; Datei speichern
  Datei = temp
  If CreateFile(0, Datei)
    temp = GetGadgetText(#Edit)
    WriteString(0, temp)
    CloseFile(0)
    ; Variablen aktuallisieren
    Speichern = 0
    Neu = 0
    ; Titel und Status aktuallisieren
    Titel = "PB Editor - " + Datei
    SetWindowTitle(#Window, Titel)
    
    StatusBarText(#StatusBar,2, "Gespeichert",#PB_StatusBar_Center)
    
  Else
    MessageRequester("Fehler", "Datei konnte nicht gespeichert werden", #MB_ICONSTOP)
  EndIf
EndProcedure

; *****************************************************************************

Procedure Datei_Speichern()

;{ Procedure für Speichern
;
;}

  Protected temp.s
  ; Bei neuer Datei Speichern als aufrufen
  If Neu
    Datei_Speichern_als()
    ProcedureReturn 0
  EndIf
  ; Datei speichern
  If CreateFile(0, Datei)
    temp = GetGadgetText(#Edit)
    WriteString(0, temp)
    CloseFile(0)
    ; Variablen aktuallisieren
    Speichern = 0
    Neu = 0
    ; Titel und Status aktuallisieren
    Titel = "PB Editor - " + Datei
    SetWindowTitle(#Window, Titel)
    StatusBarText(#StatusBar, 2, "Gespeichert")
  Else
    MessageRequester("Fehler", "Datei konnte nicht gespeichert werden", #MB_ICONSTOP)
  EndIf
   
EndProcedure

; *****************************************************************************

Procedure Datei_Oeffnen()

;{ Procedure für Datei öffnen
;
;}

  Protected temp.s
  ; Bei änderung Speichern aufrufen
  If Speichern
    r1 = MessageRequester("Frage", "Änderung speichern?", #PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
    If r1 = #PB_MessageRequester_Yes
      Datei_Speichern()
    EndIf
  EndIf
  If r1 = #PB_MessageRequester_Cancel
    ProcedureReturn 0
  EndIf
  ; Dateiname erfragen
  temp = OpenFileRequester("Datei öffnen", "", "Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*", 0)
  If temp = ""
    ProcedureReturn 0
  EndIf
  ; Datei öffnen
  Datei = temp
  If OpenFile(0, Datei)
    temp = ""
    ; Datei lesen bis zum ende
    len = Lof(0)
    temp = Space(len)
    ReadData(0, @temp, len)
    ; Datei schliessen
    CloseFile(0)
    ; Text in Editorfeld eintragen
    SetGadgetText(#Edit, temp)
    temp = ""
    ; Variablen aktuallisieren
    Speichern = 0
    Neu = 0
    ; Titel und Status aktuallisieren
    Titel = "PB Editor - " + Datei
    SetWindowTitle(#Window, Titel)
    StatusBarText(#StatusBar, 2, "Geöffnet")
    UpdateMenu()
  Else
    MessageRequester("Fehler", "Datei konnte nicht geöffnet werden", #MB_ICONSTOP)
  EndIf

EndProcedure

; *****************************************************************************

Procedure Datei_Oeffnen_sofort(temp.s)

;{ Procedure für Datei öffnen bei Parameterübergabe
;
;}
  Datei = temp
  If OpenFile(0, Datei)
    temp = ""
    ; Datei lesen bis zum ende
    len = Lof(0)
    temp = Space(len)
    ReadData(0, @temp, len)
    ; Datei schliessen
    CloseFile(0)
    ; Text in Editorfeld eintragen
    SetGadgetText(#Edit, temp)
    temp = ""
    ; Variablen aktuallisieren
    Speichern = 0
    Neu = 0
    ; Titel und Status aktuallisieren
    Titel = "PB Editor - " + Datei
    SetWindowTitle(#Window, Titel)
    StatusBarText(#StatusBar, 2, "Geöffnet")
    UpdateMenu()
  Else
    MessageRequester("Fehler", "Datei konnte nicht geöffnet werden", #MB_ICONSTOP)
  EndIf

EndProcedure

; *****************************************************************************

Procedure Datei_Neu()

;{ Procedure für Neu
;
;}

  ; Bei änderung Speichern aufrufen
  If Speichern
    r1 = MessageRequester("Frage", "Änderung speichern?", #PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
    If r1 = #PB_MessageRequester_Yes
      Datei_Speichern()
    EndIf
  EndIf
  If r1 = #PB_MessageRequester_Cancel
    ProcedureReturn 0
  EndIf
  ; Editorfeld löschen
  SetGadgetText(#Edit, "")
  ; Variablen aktuallisieren
  Speichern = 0
  Neu = 1
  Datei = "Unbekannt.txt"
  ; Titel und Status aktuallisieren
  Titel = "PB Editor - " + Datei
  SetWindowTitle(#Window, Titel)
  StatusBarText(#StatusBar, 2, "Neu")
EndProcedure

Procedure StringGadgetCursorX(Gadget) 
  SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Min,@Max) 
  ProcedureReturn Max-SendMessage_(GadgetID(Gadget),#EM_LINEINDEX,SendMessage_(GadgetID(Gadget),#EM_LINEFROMCHAR,Min,0),0)+1 
EndProcedure 

Procedure StringGadgetCursorY(Gadget) 
  SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Min,@Max) 
  ProcedureReturn SendMessage_(GadgetID(Gadget),#EM_LINEFROMCHAR,Min,0)+1 
EndProcedure 

; *****************************************************************************

Procedure ProgrammEnde()

;{ Procedure bei Programm Ende
;
;}

  ; Bei änderung Speichern aufrufen
  If Speichern
    r1 = MessageRequester("Frage", "Änderung speichern?", #PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
    If r1 = #PB_MessageRequester_Yes
      Datei_Speichern()
    EndIf
  EndIf
  If r1 <> #PB_MessageRequester_Cancel
    Exit = 1
  EndIf
   
EndProcedure

; *****************************************************************************

Procedure WndProc(hWnd, uMsg, wParam, lParam)

;{ Callback Routine zur Bearbeitung von Meldungen
; Mit SetWindowCallback wird auf diese Procedure verlinkt.
; Hier werden weiter Meldungen von den Betriebssystem abgearbeitet die nicht von
; WindowEvent() oder WaitWindowEvent() weitergeleitet werden.
;
; Die Meldung WM_ENTERIDLE kommt wenn ein Menu oder ein Diaglogfenster angezeit wird.
; Zu diesen Zeitpunkt aktuallisieren wird dann die Menu´s ob sie freigegeben werden können.
;}

  ; Menu oder Dialog angezeigt
  If uMsg = #WM_ENTERIDLE
    UpdateMenu()
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

;- Hauptprogramm **************************************************************

; Ersten Parameter auslesen (Dateiname bei aufruf bei "Öffnen mit")
para.s = ProgramParameter()

Neu = 1
Datei = "Unbekannt.txt"
Titel = "PB Editor - " + Datei
WinStyle = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_SizeGadget

;-- Fenster erstellen
If OpenWindow(#Window, 0, 0, 720, 480, Titel, WinStyle)

  ;--- Menu Erzeugen
  If CreateMenu(#Menu, WindowID(#Window))
    MenuTitle("&Datei")
      MenuItem(#Menu_Neu, "&Neu" + #TAB$+ "Strg+N")
      MenuItem(#Menu_Oeffnen, "&Öffnen" + #TAB$+ "Strg+O")
      MenuItem(#Menu_Speichern, "&Speichern" + #TAB$+ "Strg+S")
      MenuItem(#Menu_Speichern_als, "Speichern &als")
      MenuBar()
      MenuItem(#Menu_Beenden, "Be&enden")
    MenuTitle("&Bearbeiten")
      MenuItem(#Menu_Zurueck, "&Rückgängig" + #TAB$ + "Strg+Z")
      MenuBar()
      MenuItem(#Menu_Ausschneiden, "&Ausschneiden" + #TAB$ + "Strg+X")
      MenuItem(#Menu_Kopieren, "&Kopieren" + #TAB$ + "Strg+C")
      MenuItem(#Menu_Einfuegen, "&Einfügen" + #TAB$ + "Strg+V")
      MenuItem(#Menu_Markieren, "Alles &markieren" + #TAB$ + "Strg+A")
    MenuTitle("Hilfe")
      MenuItem(#Menu_Ueber, "&Über")
    ;---> Menus sperren
    DisableMenuItem(#Menu, #Menu_Zurueck, 1)
    DisableMenuItem(#Menu, #Menu_Ausschneiden, 1)
    DisableMenuItem(#Menu, #Menu_Kopieren, 1)
    DisableMenuItem(#Menu, #Menu_Markieren, 1)
  EndIf
  ;--- Toolbar erzeugen
  If CreateToolBar(#ToolBar, WindowID(#Window))
    ToolBarStandardButton(#Menu_Neu, #PB_ToolBarIcon_New)
    ToolBarStandardButton(#Menu_Oeffnen, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(#Menu_Speichern, #PB_ToolBarIcon_Save)
    ToolBarSeparator()
    ToolBarStandardButton(#Menu_Zurueck, #PB_ToolBarIcon_Undo)
    ToolBarSeparator()
    ToolBarStandardButton(#Menu_Ausschneiden, #PB_ToolBarIcon_Cut)
    ToolBarStandardButton(#Menu_Kopieren, #PB_ToolBarIcon_Copy)
    ToolBarStandardButton(#Menu_Einfuegen, #PB_ToolBarIcon_Paste)
    ToolBarToolTip(#ToolBar, #Menu_Neu, "Neu")
    ToolBarToolTip(#ToolBar, #Menu_Oeffnen, "Öffnen")
    ToolBarToolTip(#ToolBar, #Menu_Speichern, "Speichern")
    ToolBarToolTip(#ToolBar, #Menu_Zurueck, "Rückgängig")
    ToolBarToolTip(#ToolBar, #Menu_Ausschneiden, "Ausschneiden")
    ToolBarToolTip(#ToolBar, #Menu_Kopieren, "Kopieren")
    ToolBarToolTip(#ToolBar, #Menu_Einfuegen, "Einfügen")
  EndIf
  ;--- Statusbar erzeugen
  CreateStatusBar(#Statusbar, WindowID(#Window))
  AddStatusBarField(90)
  AddStatusBarField(100)
  AddStatusBarField(#PB_Ignore )
  ;--- Gadget erzeugen
  ;If CreateGadgetList(WindowID(#Window))
    Style = #ES_MULTILINE | #WS_VSCROLL | #WS_HSCROLL
    StringGadget(#Edit, 0, 0, 0, 0, "", Style) ; Grösse und Position in der Procedure UpdateWindow()
    ; LimitText auf unbegrenzt setzen.
    SendMessage_(GadgetID(#Edit), #EM_SETLIMITTEXT, -1, 0)
    ; Linken Rand einstellen
    SendMessage_(GadgetID(#Edit),#EM_SETMARGINS,#EC_LEFTMARGIN,MAKELONG(4,0))
    ; Farben einstellen
    SetGadgetColor(#Edit, #PB_Gadget_FrontColor, RGB(30, 40, 140))
    SetGadgetColor(#Edit, #PB_Gadget_BackColor, RGB(254, 254, 220))
  ;EndIf
  ;--- Tastenkürzel hinzufügen für Neu, Öffnen und Speichern
  AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_N, #Menu_Neu)
  AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_O, #Menu_Oeffnen)
  AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_S, #Menu_Speichern)

  AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_A, #Menu_Markieren)

  ;--- Callback Routine zur Bearbeitung von Meldungen weiterleiten
  SetWindowCallback(@WndProc())

  ;--- Focus auf Edit setzen
  SetActiveGadget(#Edit)
  Exit = 0
  
  If para
    Datei_oeffnen_sofort(para)
  EndIf
  
  ;--> Hauptschleife anfang
  Repeat
    ; Warten auf Ereignis (Maus, Tastertur, etc)
    event = WaitWindowEvent()
    menu  = EventMenu()
    gadget = EventGadget()
    type  = EventType()
       
    Select event
      ;--? Ein Menü wurde ausgewählt
      Case #PB_Event_Menu
        Select menu
          Case #Menu_Beenden
            ProgrammEnde()
          Case #Menu_Neu
            Datei_Neu()
            SetActiveGadget(#Edit)
          Case #Menu_Oeffnen
            Datei_Oeffnen()
            SetActiveGadget(#Edit)
          Case #Menu_Speichern
            Datei_Speichern()
            SetActiveGadget(#Edit)
          Case #Menu_Speichern_als
            Datei_Speichern_als()
            SetActiveGadget(#Edit)
          Case #Menu_Zurueck
            SendMessage_(GadgetID(#Edit), #WM_UNDO, 0, 0) ; API SendMessage_(hwnd, uMsg, wParam, lParam)
          Case #Menu_Ausschneiden
            SendMessage_(GadgetID(#Edit), #WM_CUT, 0, 0)
            Speichern = 1
            StatusBarText(#StatusBar, 2, "Geändert")
          Case #Menu_Kopieren
            SendMessage_(GadgetID(#Edit), #WM_COPY, 0, 0)
          Case #Menu_Einfuegen
            SendMessage_(GadgetID(#Edit), #WM_PASTE, 0, 0)
            Speichern = 1
            StatusBarText(#StatusBar, 2, "Geändert")
          Case #Menu_Markieren
            SendMessage_(GadgetID(#Edit), #EM_SETSEL, 0, -1)
          Case #Menu_Ueber
            MessageRequester("Info", #ABOUT)
         
        EndSelect
      ;--? Ein Gadget wurde gedrückt
      Case #PB_Event_Gadget
        
        Select gadget
          Case #Edit
           Select type
             Case #PB_EventType_Change
                UpdateMenu()
                
                If Speichern = 0
                  Speichern = 1
                  StatusBarText(#StatusBar, 2, "Geändert")
                EndIf
            EndSelect

        EndSelect
      ;--? Das Schließgadget vom Fenster wurde gedrückt
      Case #PB_Event_CloseWindow
        ProgrammEnde()
      ;--? Das Fenster wurde in der Größe verändert
      Case #PB_Event_SizeWindow
        UpdateWindow()
       
    EndSelect
    
    StatusBarText(#StatusBar, 0, " Zeile = "+Str( StringGadgetCursorY(#Edit)))
    StatusBarText(#StatusBar, 1, "Position = "+Str( StringGadgetCursorX(#Edit)))
  
  Until Exit
  ;--< Hauptschleife ende

EndIf

;- Ende
End