Seite 1 von 1

Editorgadget in Datei speichern

Verfasst: 11.03.2009 12:13
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

Verfasst: 11.03.2009 13:42
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...

Re: Editor in Datei speichern

Verfasst: 11.03.2009 13:51
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 

Re: Editor in Datei speichern

Verfasst: 11.03.2009 17:09
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().

Verfasst: 11.03.2009 20:29
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

Verfasst: 11.03.2009 21:35
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.

Verfasst: 11.03.2009 21:52
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

Verfasst: 11.03.2009 21:56
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: