Seite 4 von 4

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Verfasst: 06.06.2015 23:40
von udg
der text kommt aus weiteren StringGadget. Datum und Infotext
ich arbeite das mal ein und teste.

Bis jetzt funktioniert es :allright:


Wie kann ich Dir nur danken?

EDIT
habe alle Inputfelder eingetragen. Werden ordnungsgemäß in die *.nfo gespeichert.

Das einzige Problem was noch besteht ist:
Ab Zeile 2 wird der Text um ein Zeichen nach rechts eingerückt. Das muss ich noch eleminieren und dann sitzt der Viewer.

Habe den Text nun im EditorGadget zentriert, und eingerückt. jedesmal der selbe Fehler. Ab Zeile 2 wird der Text eingerückt und bleibt nicht Links am Rand oder wird mittig (Zentriert ) dargestellt nach dem speichern.

VG

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Verfasst: 07.06.2015 03:08
von udg
Neueste Version:

Code: Alles auswählen

;===============================================================================================
; NFO VIEWER RAW VERSION for ASCII / ANSI SCENE ART NFO FILES
; PUREBASIC v5.3 Windows 7 x86 & x64 tested
;
; UDG in MAY 2015
; feel free to use
; 
; REMEMBER: SET IN COMPILER As FOLLOW: CHECK Box - Create unicode executable !!!!!
;
; Thats it.
;
; see Pic.
;===============================================================================================
EnableExplicit
Global Btn_Nfo, load, paste, save

Enumeration
   #Window_0
EndEnumeration

Enumeration
  #Frame3D_big
  #Text_Nfo
  #Editor_Nfo
  #Font_Editor_Nfo_NFO
  #Text_Info
  #Editor_Info
  #Font_Editor_Info
  #Text_Releasedatum
  #Date
  #btnPaste
  #btnPaste2
  #btnRemove
  #btnLoad
  #btnSave
EndEnumeration
;}

Structure CharField
   c.c[0]
EndStructure

Procedure.s ReadNFO(File$, *CodePage)
   ; Liest eine NFO-Datei ein.
   ; File$ = Dateiname der NFO-Datei
   ; *CodePage = Zeiger auf die Ersatz-Zeichen für die ASCII-Werte 128-255
   
   Protected Text$
   Protected *c.character
   Protected a.a
   Protected *t.CharField = *CodePage
   Protected fmt
   
   If ReadFile(1, File$)
      fmt = ReadStringFormat(1)     ; Dateiformat ermitteln
     
      If fmt = #PB_Ascii            ; ASCII? 
         
         Text$ = Space(Lof(1))            ; Stringspeicher für Text
         *c = @Text$                      ; Zeiger auf erstes Zeichen im String
         
         While Not Eof(1)                 ; solange Dateiende nicht erreicht ist
            a = ReadAsciiCharacter(1)     ; ASCII-Zeichen lesen
           
            If a < 128                    ;
               *c\c = a                   ; kleine Zeichen übernehmen
            Else
               *c\c = *t\c[a-128]         ; größere Zeichen ersetzen
            EndIf
           
            *c + SizeOf(character)
         Wend
         
      Else                          ; Unicode oder UTF8?
         Text$ = ReadString(1, fmt | #PB_File_IgnoreEOL)    ; Text einfach laden
         
      EndIf
     
      CloseFile(1)
   EndIf
   
   ProcedureReturn Text$         
         
EndProcedure

Procedure WriteNFO(File$, Text$, *CodePage)
   ; Speichert eine NFO-Datei
   ; File$ = Dateiname der NFO-Datei
   ; Text$ = zu speichernder Inhalt
   ; *CodePage = Zeiger auf die Ersatz-Zeichen für die ASCII-Werte 128-255
   
   If Text$ = "" : ProcedureReturn : EndIf      ; Abbrechen, wenn kein Text da ist
   
   ; zuerst Rückwärts-Ersetztabelle aufbauen
   Dim Rep.a($ffff)                       
   Protected *t.charField = *CodePage
   Protected i
   
   For i = 128 To 255
      Rep(*t\c[i-128]) = i
   Next i
   
   ; Datei schreiben
   If CreateFile(1, File$)
      Protected *c.character = @Text$              ; Zeiger auf erstes Zeichen
     
      While *c\c                                   ; solange Zeichen da sind
         
         If *c\c < 128                             ; kleine Zeichen
            WriteAsciiCharacter(1, *c\c)           ;     speichern
           
         ElseIf Rep(*c\c)                          ; große Zeichen mit CP850-Ersatz
            WriteAsciiCharacter(1, Rep(*c\c))      ;     Ersatz speichern
           
         Else                                      ; große Zeichen ohne CP850-Ersatz
            WriteAsciiCharacter(1, '.')            ;     Punkt speichern
            Debug "Zeichen nicht in CodePage 850" 
         EndIf
         
         *c + SizeOf(character)
      Wend
     
      CloseFile(1)
   EndIf
   
EndProcedure


DataSection
   TableCP850:
   Data.s "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´±‗¾¶§÷¸°¨·¹³²■ "   
EndDataSection

Define.l Event, EventWindow, EventGadget, EventType, EventMenu, hWnd, cur1, Eingabetext1$, Eingabetext2$, Eingabetext3$, File$, cursorpos.POINT, fmt, Text$, *c.character

hWnd = OpenWindow(#Window_0, 398, 8, 710, 766, "NFO MAKER-VIEWER", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
; Eigener Cursor
SetClassLong_(load, #GCL_HCURSOR, 0)
SetClassLong_(paste, #GCL_HCURSOR, 0)
SetClassLong_(Btn_Nfo, #GCL_HCURSOR, 0)
SetClassLong_(save, #GCL_HCURSOR, 0)
; Cursor laden
cur1 = LoadCursor_(0, #IDC_HAND)
;===============================================================================================
;- NFO FIELD
;===============================================================================================
TextGadget(#Text_Nfo, 47, 30, 80, 15, "ASCII NFO:") ;x;y;länge;höhe
EditorGadget(#Editor_Nfo, 45, 45, 620, 380,#PB_Editor_WordWrap) ;x;y;länge;höhe;Zeilenumbruch am Ende
SetGadgetFont(#Editor_Nfo, LoadFont(#Font_Editor_Nfo_NFO, "Consolas", 10, #PB_Font_HighQuality)) ; Button Font
TextGadget(#Text_Info, 47, 435, 90, 15, "Information TEXT:") ;x;y;länge;höhe
EditorGadget(#Editor_Info, 45, 450, 620, 180,#PB_Editor_WordWrap) ;x;y;länge;höhe;Zeilenumbruch am Ende
SetGadgetFont(#Editor_Info, LoadFont(#Font_Editor_Info, "Consolas", 10, #PB_Font_HighQuality)) ; Button Font
TextGadget(#Text_Releasedatum, 45, 640, 120, 13, "NFO Releasedatum") ;x;y;länge;höhe
DateGadget(#Date, 45, 655, 155, 20, "%dd/%mm/%yyyy", Date()); get current Date

Btn_Nfo = ButtonGadget(#btnRemove,45,690,70,50,"Clear All") ; Button: Lösche Inhalt in NFO Feld / BTN del Content in EditorGadget
paste = ButtonGadget(#btnPaste, 125, 690, 140, 50, "paste ASCII from clipboard")
paste = ButtonGadget(#btnPaste2, 276, 690, 140, 50, "paste Text from clipboard")
load = ButtonGadget(#btnLoad, 485, 690, 85, 50, "lade NFO")
save = ButtonGadget(#btnSave, 580, 690, 85, 50, "speicher NFO")
;===============================================================================================
FrameGadget(#Frame3D_big, 10, 10, 690, 740, "Info Viewer")
;===============================================================================================
;
;- HAUPTSCHLEIFE / MAIN
;
;===============================================================================================   
Repeat
   Event = WaitWindowEvent()
   Gosub changecursor
   ;===============================================================================================
   ;- LESE VARIABELN AUS DEN EINGABEFELDERN / READ VARs FROM EditorGadget FIELD
   ;===============================================================================================   
   Select Event
      Case #PB_Event_Gadget
         Select EventGadget()
            Case  #btnSave   ; Speichern
              Eingabetext1$= GetGadgetText(#Editor_Nfo); Eingabe auslesen , read input by EditorGadget Field
              Eingabetext2$= GetGadgetText(#Date)      ; Eingabe auslesen , read input by EditorGadget Field
              Eingabetext3$= GetGadgetText(#Editor_Info); Eingabe auslesen , read input by EditorGadget Field
              ;===============================================================================================
              ;- DATEI SPEICHERN AUFRUFEN / call save dialog
              ;===============================================================================================   
               File$=SaveFileRequester("SAVE NFO FILE", "C:\bbcode.nfo ", "NFO FILE(*.nfo)|*.nfo", 0)
               
               ;===============================================================================================
               ;- SPEICHERE VARIABELN AUS DEN EINGABEFELD IN EINE *.NFO DATEI / Save VARs from input Field to *.NFO
               ;===============================================================================================   
               ; als ASCII in CP850 speichern
               
               WriteNFO(File$, Eingabetext1$ + #CRLF$ + Eingabetext2$ + #CRLF$ + Eingabetext3$, ?TableCP850)
               
               Case #btnLoad    ; NFO laden
                File$ = OpenFileRequester("Load NFO File", "", "NFO File (*.nfo)|*.nfo", 0)
                Text$ = ReadNFO(File$, ?TableCP850)
                  If Text$ > ""
                   SetGadgetText(#Editor_Nfo, Text$)
                  EndIf
               Case #btnRemove     ; Anzeige löschen
                  ClearGadgetItems(#Editor_Nfo)
                  ClearGadgetItems(#Editor_Info)
               Case #btnPaste
                  SendMessage_(GadgetID(#Editor_Nfo),#WM_PASTE,0,0)
               Case #btnPaste2
                  SendMessage_(GadgetID(#Editor_Info),#WM_PASTE,0,0)   
          EndSelect
    Case #PB_Event_CloseWindow
         ;===============================================================================================
         ;-                                PROGRAMM BEENDEN / End
         ;===============================================================================================   
         EventWindow = EventWindow()
         If EventWindow = #Window_0
            DestroyCursor_(cur1)
            CloseWindow(#Window_0)
            Break
         EndIf
   EndSelect
Until Event = #PB_Event_CloseWindow
;
; Ende
;
DestroyCursor_(cur1)
End
;
; SUBROUTINE zum wechseln des MouseCursors / SUB to change Cursor behavior
;
changecursor:
GetCursorPos_(cursorpos.POINT)
MapWindowPoints_(0, hWnd, cursorpos, 1)
Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32)
  Case load : SetCursor_(cur1) ; Cursor ueber/ over btn_load
  Case paste : SetCursor_(cur1) ; Cursor ueber/ over btn_paste
  Case Btn_Nfo : SetCursor_(cur1) ; Cursor ueber/ over btn_NFO
  Case save : SetCursor_(cur1)    ; Cursor ueber/ over save
EndSelect
Return
Bekannter Bug:
Wenn Text von z.B. einer Internet Seite kopiert und in das Info Feld eingefügt wird, ist nach Abspeichern der Text, 1 Zeichen nach rechts eingerückt.
Die Textformatierung des eingefügten Textes müsste entfernt werden per Code. Denn wenn ich etwas von hand eintippe funktioniert es

Ich hoffe es kann jemand helfen.

VG.
Bild

Im Moment Fehler unbekannt :(

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Verfasst: 07.06.2015 05:09
von udg
Ich habe den Code oben noch mal editiert. Der lange String in der DataSection verändert sich, wenn ich ihn hier im Forum einfüge, weil der WebBrowser ein Zeichen davon nicht anzeigt. Deswegen habe ich den String jetzt in Hexadezimale Zahlen umgewandelt.
hatte ich nicht bemerkt. jetzt aber angepasst.
Eingabetext1$ + #CRLF$ + Eingabetext2$
Fügt einen Zeilenumbruch hinzu und dann den zweiten Text.
Ich habe diese Methode eingearbeitet