Problem mit EditorGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Problem mit EditorGadget

Beitrag von udg »

Ich erstell ein EditorGadget welches ich per WriteString auslese und den Inhalt in eine Datei speichere.

Nun habe ich schon ewig rumprobiert und leider nichts hinbekommen mit dem EditorGadget was brauchbar ist.

Wenn Text von z.B. einer Internet-Seite kopiert und in das "Information TEXT"- Feld, das untere, eingefügt wird, ist nach Abspeichern, der Text 2 Zeichen nach rechts eingerückt.
Die Textformatierung des eingefügten Textes müsste beim Einfügen irgendwie per Code entfernt werden. Denn wenn ich längeren Text von Hand eintippe oder Langen Text, Zeilenweise einfüge funktioniert es.

Ich meine damit nicht wie der Text im EditorGadget angezeigt wird, sondern nach abspeichern.
Ich habe den Text schon im EditorGadget zentriert, mit margin, links eingerückt --> hat nach dem speichern ncihts geändert :( gleicher Fehler.

Beim Schreiben in die Datei macht es im Moment noch nicht das was es soll. Den kompletten Text an den linken Rand oder andere Möglichkeit wäre (was noch besser passt) den abgespeicherten Text in der nfo Datei zentrieren aus dem Feld Info:

Ich hoffe es kann jemand helfen.

Code: Alles auswählen

;===============================================================================================
; NFO VIEWER RAW VERSION for ASCII / ANSI SCENE ART NFO FILES
; PUREBASIC v5.3 Windows 7 x86 & x64 tested
;
; matbal + 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
Hier mal ein Bild wie es Derzeit gespeichert wird. Am liebsten hätte ich den Text gern Zentriert dargestellt.

Bild

VG
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Problem mit EditorGadget

Beitrag von HeX0R »

Ich kann das nicht reproduzieren.
Vielleicht ware es hilfreich, wenn Du uns zeigst, welchen Text Du da genau kopierst.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Problem mit EditorGadget

Beitrag von udg »

Habe zum testen Dummy Text genommen von dieser Seite:

http://www.blindtextgenerator.com/lorem-ipsum
den vom Reiter: Werther
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Problem mit EditorGadget

Beitrag von HeX0R »

Das hat ja mal so gar nichts mit dem speichern an sich zu tun, aber ich habe jetzt erst gesehen, dass Du das in diesem komischen iNFekt-Viewer anschaust.
Evtl. hättest Du das auch erwähnen können?

Du lädtst eine viel zu lange Zeile ohne jegliche Zeilenumbrüche in Deine nfo-Datei.
Dein Viewer arbeitet mit WordWrap, Du siehst also nicht, dass es sich eigentlich um eine irre lange Zeile handelt.

Dieser iNFekt Viewer macht das beste aus so einem Quatsch und zeigt Dir durch den Zeilenvorschub an, dass das alles zusammengehört.

Es gibt keine nfo-Dateien mit so langen Zeilen, also solltest Du nicht versuchen solche zu erstellen...
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Problem mit EditorGadget

Beitrag von udg »

Danke für deine harsche Antwort. :allright:
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Problem mit EditorGadget

Beitrag von HeX0R »

Hmm... ne, harsch sollte es eigentlich nicht klingen.
Ein wenig unterschwelliger Ärger mag mitgeklungen haben, sorry war so nicht beabsichtigt.
Antworten