Editorgadget in Datei speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Editorgadget in Datei speichern

Beitrag von Elektrolurch »

Hi all

Ich Versuche gerade eine in einem Editorgadget bearbeitet Datei zu speichern => Minieditor

Dazu habe ich im englischen Forum eine kleine Procdure gefunden.
leicht angepaßt sieht sie vereinfacht so aus.

Code: Alles auswählen

Procedure Editor_Save() 
  File.s = Ziel.s + "xyz.dat"
  Protected FileID.l, result.l 
  Protected StreamData.EDITSTREAM 
  FileID = CreateFile(#PB_Any, File) 
  If FileID 
    StreamData\dwCookie = FileID(FileID) 
    StreamData\dwError = #Null 
    StreamData\pfnCallback = @StreamFileOut_Callback() 
    If UCase(GetExtensionPart(File)) = "RTF" 
      ;result = SendMessage_(GadgetID(#Editor_3), #EM_STREAMOUT, #SF_RTF, @StreamData) 
    Else 
      ;result = SendMessage_(GadgetID(#Editor_3), #EM_STREAMOUT, #SF_TEXT, @StreamData) 
    EndIf 
    CloseFile(FileID) 
  EndIf
   ;MessageRequester("Info", "Bitte")
     
  ;rocedureReturn result 
EndProcedure
Leider funktioniert sie nur bedingt.

Fall 1 so auskommentiert wie zu sehen kann ich sie beliebig oft anspringen und sie tut ihre Arbeit.

Fall 2 der Messagerequester wird aktiviert, dann wird nach dem vierten Aufruf im Messagerequester das Programm mit "Invalid memory access" in den Wald geschickt.

Fall 3 werden die 2 Zeilen mit "result =" aktiviert kommt der "Invalid memory access" in der Zeile mit "result =" im zweiten Aufruf schon.

Kann mir da jemand helfen ?

Alternativ wäre ich auch bereit das ganze anders zu lösen wenn es da einen neuen Ansatz gäbe.


kleiner Nachtrag

Code: Alles auswählen

Procedure StreamFileOut_Callback(hFile, pbBuff, cb, pcb) 
  ProcedureReturn WriteFile_(hFile, pbBuff, cb, pcb, 0)!1 
EndProcedure 
BYe Andre
Zuletzt geändert von Elektrolurch am 11.03.2009 22:41, insgesamt 2-mal geändert.
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:

Beitrag von HeX0R »

Hast du nicht was vergessen?

Wie sieht denn deine Callback-Prozedur aus?

Weil es mich schon wundert, dass du im Cookie das OS-Handle der erstellten Datei speicherst und nicht die PB-ID, vermutlich liegt dort der Hund begraben...
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Editor in Datei speichern

Beitrag von Kiffi »

@Andre:

http://www.purebasic.fr/german/viewtopi ... 911#157911

Grüße ... Kiffi

// Edit: Ups! Deinen Nachtrag habe ich übersehen...

// Edit2:

mit dem unter dem oben genannten Link liegenden Code klappt's problemlos:

Code: Alles auswählen

Procedure StreamFileOut_Callback(hFile, pbBuff, cb, pcb)
  ProcedureReturn WriteFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure

Procedure Editor_Save(Gadget, File.s)
  Protected FileID.l, result.l
  Protected StreamData.EDITSTREAM
  FileID = CreateFile(#PB_Any, File)
  If FileID
    StreamData\dwCookie = FileID(FileID)
    StreamData\dwError = #Null
    StreamData\pfnCallback = @StreamFileOut_Callback()
    If UCase(GetExtensionPart(File)) = "RTF"
      result = SendMessage_(GadgetID(Gadget), #EM_STREAMOUT, #SF_RTF, @StreamData)
    Else
      result = SendMessage_(GadgetID(Gadget), #EM_STREAMOUT, #SF_TEXT, @StreamData)
    EndIf
    CloseFile(FileID)
  EndIf
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0, 8, 8, 306, 133) 
  For a = 0 To 5 
    AddGadgetItem(0, a, "Line "+Str(a)) 
  Next 
  
  Editor_Save(0, "d:\SavedFromEditorGadget.txt") ; Pfad und Namen anpassen!
  Editor_Save(0, "d:\SavedFromEditorGadget.rtf") ; Pfad und Namen anpassen!
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 

EndIf 
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Editor in Datei speichern

Beitrag von AND51 »

Elektrolurch hat geschrieben:Alternativ wäre ich auch bereit das ganze anders zu lösen wenn es da einen neuen Ansatz gäbe.
Gibt es, gibt es!

Dazu braucht es nur ein bisschen GetGadgetText() mit einer Prise CreateFile(). Man braucht also keine API.
Folgender Code gibt dir den Wert von CreateFile() zurück: 0 bei Fehler, ungleich null bei Erfolg.

Serviervorschlag:

Code: Alles auswählen

Procedure Save_EditorGadget(GadgetID, File$)
	Protected datei=CreateFile(#PB_Any, File$)
	If datei
		WriteString(datei, GetGadgetText(GadgetID))
		CloseFile(datei)
	EndIf
	ProcedureReturn datei
EndProcedure

Save_EditorGadget(#mein_editor, "C:\Test.dat")
Zwei Hinweise:

1. Ich benutze CreateFile(), dieser Befehl löscht eine bereits vorhandene Datei. Wenn das nicht gewünscht ist, bitte OpenFile() verwenden.
2. Sofern du schon Wert auf ASCII/Unicode legst, beachte, dass diese Datei in dem Format gespeichert wurde, in dem auch dein Programm kompiliert ist. Siehe dazu die Hilfe von WriteString().
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Beitrag von Elektrolurch »

Hi All

@Kiffi
du hast recht und ich auch. 8)

Das Problem hatte ich auf einem Windows 2000 System. :cry:
Auf einem Vista läuft es auch bis zum jüngsten Tag. <)

Liegt vielleicht doch an der Windows API.
Leider reichen da meine Kenntnisse nicht aus.

@Andi
Mit meinem "EDITOR" hole ich mir Dateien von einem Linux System welches nur per Telnet und Samba(ein Ordner) zu erreichen ist.
nach der Modifikation speichere ich sie zurück.
Ob das mit WriteString noch funktioniert muß ich erst mal testen.

Bye Andre
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Achso, das wusste ich nicht.
Hab verstanden, du hast einen eigenen Minieditor a lá Notepad programmiert. Ja, dann versuch mal dein Glück.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Beitrag von Elektrolurch »

Hi Andi

Naja, Editor ist etwas hoch gegriffen.

Ich lese die Dateie(n) per ReadData in den Speicher, von dort kommen dann die Daten in das EditorGadget.
Nun sollen sie wieder zurück in die Datei.

Mal sehen was noch geht, vielleicht kommt ja noch ein Genius vorbei :lol:

Bye Andre
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

Beitrag von ts-soft »

Elektrolurch hat geschrieben: Das Problem hatte ich auf einem Windows 2000 System. :cry:
Auf einem Vista läuft es auch bis zum jüngsten Tag. <)

Liegt vielleicht doch an der Windows API.
Leider reichen da meine Kenntnisse nicht aus.
Die API funktioniert ab Win95, bzw. NT4.0 :wink:
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
Antworten