Problem ReadString

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem ReadString

Beitrag von ts-soft »

Wenn Du ein ScintillaGadget nutzt, solltest Du eher diesen Code nutzen:

Code: Alles auswählen

EnableExplicit

Procedure SCI_GetTextFormat(ID)
  Protected result
  Select ScintillaSendMessage(ID, #SCI_GETCODEPAGE)
    Case #SC_CP_UTF8
      result = #PB_UTF8
    Default
      result = #PB_Ascii
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure SCI_SetGadgetText(ID, Text.s)
  Protected Buffer.s
  ; Wir erzeugen einen Stringbuffer in der größte, wie das
  ; Scintilla in bei der momentan eingestellten Codepage benötigt!
  Buffer = Space(StringByteLength(Text, SCI_GetTextFormat(ID)))
  PokeS(@Buffer, Text, -1, SCI_GetTextFormat(ID))
  ProcedureReturn ScintillaSendMessage(ID, #SCI_SETTEXT, 0, @Buffer)
EndProcedure

Procedure SCI_LoadFile(ID, FileName.s)
  Protected FF, Format, length, *mem, Text.s
  
  FF = ReadFile(#PB_Any, FileName)
  If FF
    Select ReadStringFormat(FF)
      ; hier wird das StringFormat ermittelt und entsprechend gleich die Codepage eingestellt
      Case #PB_UTF8, #PB_Unicode
        Format = #PB_UTF8
        ScintillaSendMessage(ID, #SCI_SETCODEPAGE, #SC_CP_UTF8)
      Default
        Format = #PB_Ascii
        ScintillaSendMessage(ID, #SCI_SETCODEPAGE, 0)
    EndSelect
    length = Lof(FF)
    If length
      *mem = AllocateMemory(length)
      If *mem
        ReadData(FF, *mem, length)
        Text = PeekS(*mem, length, Format)
        SCI_SetGadgetText(ID, Text.s)
        FreeMemory(*mem)
        CloseFile(FF)
        ProcedureReturn #True
      EndIf
    EndIf
    CloseFile(FF)
  EndIf
EndProcedure

Procedure SCI_SaveFile(ID, FileName.s)
  Protected length, *mem, FF
  
  FF = CreateFile(#PB_Any, FileName.s)
  
  If FF
    ; jetzt schreiben wir den BOM
    WriteStringFormat(FF, SCI_GetTextFormat(ID))
    length = ScintillaSendMessage(ID, #SCI_GETLENGTH) + 1
    *mem = AllocateMemory(length)
    ; jetzt holen wir den Text in den Speicher,
    ; wo er auch in dem Format vorliegt, das wir schreiben wollen.
    ScintillaSendMessage(ID, #SCI_GETTEXT, length, *mem)
    WriteData(FF, *mem, length - 1); der Speicher mußte ein Byte größer sein, aber schreiben wollen wir das nicht ;)
    CloseFile(FF)
    FreeMemory(*mem)
    ProcedureReturn #True
  EndIf
EndProcedure

InitScintilla()
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
ScintillaGadget(0, 10, 10, 620, 460, 0)

Define myFile.s = #PB_Compiler_Home + "SDK\Readme.txt" ; hier anpassen

SCI_LoadFile(0, myFile)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Speichern einfach mit: SCI_SaveFile(ID, FileName.s)

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem ReadString

Beitrag von schleicher »

Danke für die große Mühe, die du dir meinetwegen machst.
Ich teste das morgen. Heute ist Feierabend,
Purebasic 5.51
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem ReadString

Beitrag von schleicher »

So habe nun alles umgestellt und getestet. Laden und speichern klappt soweit, nur das das ScintillaGadget aus
deinem empfohlenen Code es genau falsch herum macht mit dem Format. Also habe ich das Default Format in
Format = #PB_UTF8 geändert. Nun stimmt das Formal beim speichern, aber es ist immer noch DOS Zeilenende.
Da es Linux-Server sind auf die ich zugreife muss es jedoch Unix sein. In den PB Constanten habe ich jedoch keine für Unix gefunden. Was kann ich da machen :?:
Purebasic 5.51
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem ReadString

Beitrag von ts-soft »

Mein Code macht beim Format nichts verkehrt, sondern Deine Textdateien enthalten wahrscheinlich keinen BOM.
Format läßt sich also nicht sicher ermitteln, Du mußt einfach davon ausgehen, das es UTF-8 ist.

Das EOL Zeichen sollte eigentlich untouched sein, aber Du kannt es auf #SC_EOL_LF bzw. #LF$ (Chr(10) setzen, solange es sich um Linux-Dateien handelt.

Code: Alles auswählen

ScintillaSendMessage(#Gadget, #SCI_CONVERTEOLS, #SC_EOL_LF)
Desweiteren solltest Du dann beim Speichern auch keinen BOM schreiben, also:

Code: Alles auswählen

    WriteStringFormat(FF, SCI_GetTextFormat(ID))
ausremmen in der Speicher funktion.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem ReadString

Beitrag von schleicher »

Stimmt die Dateien enthalten keinen BOM. Es ist aber sicher UTF8.

Habe

Code: Alles auswählen

ScintillaSendMessage(#Gadget, #SCI_CONVERTEOLS, #SC_EOL_LF)



hinzugefügt und BOM schreiben ausgeremmt und nun ist alles richtig . :allright:

Danke
Purebasic 5.51
Antworten