Hallo,
bin ein PureBasic-Neuling und stehe vor einem großen Problem.
Nachdem ich etliche Beiträge durchgelesen habe zum Thema: wie kann ich Dateien größer 64k in ein EditorGadget laden, was auch funktioniert, habe ich das Problem, daß ich den Text nicht erweitern und neuen Text hinzugeben kann, wenn der geladene Text im EditorGadget angezeigt wird. Lediglich nach Löschen von Text kann ich die gleiche Anzahl Text eingeben, wie gelöscht wurde.
Was mache ich falsch ???
[/code]
wieder mal EditorGadget
Nutze Streams
beispiel :
beispiel :
Code: Alles auswählen
Enumeration
#GAD_EDIT
#IDM_LOAD
#IDM_SAVE
EndEnumeration
Procedure StreamIN(dwCookie.l,pbBuff.l,cb.l,*pcb.l)
ReadFile_(dwCookie, pbBuff, cb, *pcb, 0)
!XOR Eax,1
ProcedureReturn
EndProcedure
Procedure StreamOUT(dwCookie.l,pbBuff.l,cb.l,*pcb.l)
WriteFile_(dwCookie, pbBuff, cb, *pcb, 0)
!XOR Eax,1
ProcedureReturn
EndProcedure
Procedure Load()
Protected File.s
Protected *hFile.LONG
Protected Stream.EDITSTREAM
File = OpenFileRequester("Öffnen", "", "", 0)
If File
*hFile = ReadFile(#PB_Any, File)
If *hFile
Stream\dwCookie = *hFile\l
Stream\pfnCallback = @StreamIN()
SendMessage_(GadgetID(#GAD_EDIT), #EM_STREAMIN , #SF_TEXT, @Stream)
SendMessage_(GadgetID(#GAD_EDIT), #EM_LIMITTEXT,-1,0)
CloseFile(*hFile)
EndIf
EndIf
EndProcedure
Procedure Save()
Protected File.s
Protected *hFile.LONG
Protected Stream.EDITSTREAM
File = OpenFileRequester("Speichern", "", "", 0)
If File
*hFile = OpenFile(#PB_Any, File)
If *hFile
Stream\dwCookie = *hFile\l
Stream\pfnCallback = @StreamOUT()
SendMessage_(GadgetID(#GAD_EDIT), #EM_STREAMOUT, #SF_TEXT, @Stream)
CloseFile(*hFile)
EndIf
EndIf
EndProcedure
*win.LONG = OpenWindow(#PB_Any, 0, 0, 500, 500, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "PureBasic Window")
If *win
CreateGadgetList(*win\l)
EditorGadget(#GAD_EDIT,0,0,500,500)
If CreateMenu(0,*win\l)
MenuTitle("File")
MenuItem( #IDM_LOAD, "&Load...")
MenuItem( #IDM_SAVE, "Save")
EndIf
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_CloseWindow : Break
Case #PB_Event_Menu
Select EventMenuID()
Case #IDM_LOAD
Load()
Case #IDM_SAVE
Save()
EndSelect
EndSelect
ForEver
EndIf
End
Zuletzt geändert von edel am 04.01.2006 17:37, insgesamt 3-mal geändert.
Du musst nach dem Erzeugen des Editorgadgets, an das Editorgadget eine Nachricht schicken.
Das es seinen Buffer nicht mit fester größe (64K) sonder dynamisch anlegen soll.
Das Editorgadget in PureBasic ist das Rich Edit Control von Microsoft !!
Wenn du das RichEdit steuern willst, so musst du in der Win32-API Hilfe nach RichEdit schauen.
Der Win32-API Befehl SendMessage_ , sendet Nachrichten an das Gadget. Mit diesen Nachrichten kannst du das Gadget steuern oder es verändern.
In der Win32-API Hilfe sind die Nachrichten auch beschrieben (hier EM_LIMITTEXT).
Es gibt dort 2 Arten von Nachrichten:
1. Die Alten Nachrichten haben meistens die 64K grenze z.B. EM_GETSEL
2.Die neuen nachrichten fangen fast immer mit EX_ oder EM_ oder so an und haben keine 64k grenze z.B. EM_EXGETSEL
Beispielcode um das Editorgadget (RichEdit !!!!) zu steuern:
Ich habe hier mal einen Simplen Texteditor entwickelt, der für Anfänger zum abgucken gedacht ist:
http://forums.purebasic.com/german/view ... ght=editor
Das es seinen Buffer nicht mit fester größe (64K) sonder dynamisch anlegen soll.
Code: Alles auswählen
EditorGadget( #EditorGadget0_0,3,25,634,415) ; THE EDITOR GADGET erzeugen !
SendMessage_(GadgetID(#EditorGadget0_0), #EM_LIMITTEXT, -1, 0) ; Buffer grösse unbegrenzt
Wenn du das RichEdit steuern willst, so musst du in der Win32-API Hilfe nach RichEdit schauen.
Der Win32-API Befehl SendMessage_ , sendet Nachrichten an das Gadget. Mit diesen Nachrichten kannst du das Gadget steuern oder es verändern.
In der Win32-API Hilfe sind die Nachrichten auch beschrieben (hier EM_LIMITTEXT).
Es gibt dort 2 Arten von Nachrichten:
1. Die Alten Nachrichten haben meistens die 64K grenze z.B. EM_GETSEL
2.Die neuen nachrichten fangen fast immer mit EX_ oder EM_ oder so an und haben keine 64k grenze z.B. EM_EXGETSEL
Beispielcode um das Editorgadget (RichEdit !!!!) zu steuern:
Code: Alles auswählen
; If you want to comunicate with the EditorGadget look in
; the Win32-Api-Help under Rich Edit (Control Reference)
; all things with EditorGadget are Win-API .......
; the API-Funktions without EX in the name are limited to 64Kb !!!!!
; the API Funktions with EX are not limited.
; eg. EM_GETSEL (64Kb) and EM_EXGETSEL (not 64Kb)
; Most Codes from Author: Danilo
; by Danilo, 08.08.2003 - german forum
Procedure EditorGadgetUNDO(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID), #EM_UNDO, 0, 0)
EndProcedure
Procedure EditorGadgetREDO(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID), #EM_REDO, 0, 0)
EndProcedure
Procedure EditorGadgetCOPY(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID), #WM_COPY, 0, 0)
EndProcedure
Procedure EditorGadgetPASTE(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID), #EM_PASTESPECIAL, 0, 0)
EndProcedure
Procedure EditorGadgetCUT(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID), #WM_CUT, 0, 0)
EndProcedure
Procedure EditorGadgetGetModify(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID) , #EM_GETMODIFY , 0 , 0)
EndProcedure
Procedure EditorGadgetSetModify(Gadget_ID,Flag)
If Flag >= 1
Flag = 1
Else
Flag = 0
EndIf
ProcedureReturn SendMessage_(GadgetID(Gadget_ID) , #EM_SETMODIFY , Flag , 0)
EndProcedure
Procedure EditorGadgetDelUdoBuff(Gadget_ID)
ProcedureReturn SendMessage_(GadgetID(Gadget_ID) , #EM_EMPTYUNDOBUFFER , 0 , 0)
EndProcedure
Procedure EditorGadgetCursorX(Gadget_ID)
; returns X-Pos of Cursor (Row)
REG = GadgetID(Gadget_ID)
SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE)
ProcedureReturn (Range\cpMax-(SendMessage_(REG,#EM_LINEINDEX,SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin),0))+1)
EndProcedure
Procedure EditorGadgetCursorY(Gadget_ID)
; returns Y-Pos of Cursor (Column)
REG = GadgetID(Gadget_ID)
SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE)
ProcedureReturn SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin)+1
EndProcedure
Procedure EditorGadgetMaxCursorPos(Gadget_ID)
; returns relative Position of Cursor in the EditorGadget Buffer
; If the Cursor is an Range, the cpMax from the Range is reportet
; If the Cursor is no Range, cpMax and cpMin are equal, so it dosnt matter what you ask for
SendMessage_(GadgetID(Gadget_ID),#EM_EXGETSEL,0,Range.CHARRANGE)
ProcedureReturn Range\cpMax
EndProcedure
Procedure EditorGadgetMinCursorPos(Gadget_ID)
; returns relative Position of Cursor in the EditorGadget Buffer
; If the Cursor is an Range, the cpMin from the Range is reportet
; If the Cursor is no Range, cpMax and cpMin are equal, so it dosnt matter what you ask for
SendMessage_(GadgetID(Gadget_ID),#EM_EXGETSEL,0,Range.CHARRANGE)
ProcedureReturn Range\cpMin
EndProcedure
Procedure EditorGadgetReplace(Gadget_ID)
; Inserts Text on Current Curser Position, also used for Replace
ProcedureReturn SendMessage_(GadgetID(Gadget_ID),#EM_REPLACESEL,1,ReplaceStrg)
EndProcedure
Procedure EditorSetSelect(Gadget_ID,SelStart,SelEnd)
Range.CHARRANGE\cpMin = SelStart
Range\cpMax = SelEnd
SendMessage_(GadgetID(Gadget_ID),#EM_EXSETSEL,0,@Range)
EndProcedure
Procedure EditorGadgetSelectAll(Gadget_ID)
; Select the whole Text of the EditorGadget
RangeAll.CHARRANGE\cpMin = 0
RangeAll\cpMax = -1
ProcedureReturn SendMessage_(GadgetID(Gadget_ID),#EM_EXSETSEL,0,@RangeAll) ; Select All
EndProcedure
Procedure EditorGadgetSelectLast(Gadget_ID)
Range.CHARRANGE\cpMin = -1
Range\cpMax = -1
ProcedureReturn SendMessage_(GadgetID(Gadget_ID),#EM_EXSETSEL,0,@Range)
EndProcedure
Procedure EditorGadgetSearch(Gadget_ID)
; Returns the zero-based character position of the next match or - 1 if the Text is not found
; Possible Flags
; #FT_SEARCH = 1 ; Searching Top to Bottom, not the whole Word and not Case sensitive
; Search Bottom to Top = 0
; #FT_WHOLEWORD = 2
; #FT_MATCHCASE = 4
Result = 0
SendMessage_(GadgetID(Gadget_ID),#EM_EXGETSEL,0,Range.CHARRANGE) ; Get CurrentCursor Position
Updown = SnRFlags & 2147483647 ; Flag for search direction
findtext.FINDTEXTEX ;Structurvariable, Type FINDTEXTEX
If Updown ; If searchdirection Flag = 1, searching Top to Bottom
; Define the Top to Bottom SearchRange from Min to Max (where Min is Buffer Min and Max is Buffer Max !!!)
findtext\chrg\cpMin = Range\cpMax ; Starting by the Current CurserRangeposition (Range cpMax)
findtext\chrg\cpMax=-1 ; -1 stands vor maximum Bufferlength {equal to Len(GetGadgetText(Gadget_ID))}
Else
; Define the Bottom to Top SearchRange from Min to Max (where Min is Buffer Max and Max is Buffer Min !!!)
findtext\chrg\cpMin = Range\cpMin ; Starting by the Current CurserRangeposition (Range cpMin)
findtext\chrg\cpMax= 0; beginn of Buffer is the end to search
EndIf
findtext\lpstrText=@FindStrg ; Simple the Adress of the String to search
Result = SendMessage_(GadgetID(Gadget_ID),#EM_FINDTEXTEX,SnRFlags,@findtext) ; Finding Text
If Result <> -1 ; If the Text is found
SendMessage_(GadgetID(Gadget_ID),#EM_EXSETSEL,0,@findtext\chrgText) ; Select the Text
EndIf
ProcedureReturn Result ; -1 = notfound
EndProcedure
;- Print EditorGadget
;############################################
; Druckfunktionen / Print Funktions
; Inhalt vom ;EditorGadget auf Standard-Drucker ausgeben
;
; Author : Andreas
; Juni 2003
; added from Wichtel and Joro
;
; +++ updated 03/2005 by Team100 for use with PB 3.93
;
; sämtliche Formatierungen die im EditorGadget
; vorgenommen werden (Farbe, Font usw.),
; werden auf den Drucker übernommen.
; every Formating is printed
;############################################
Procedure EditorPrint(Gadget.l)
If FileName = ""
docname.s = "Unnamed.txt"
Else
docname.s = GetFilePart(FileName)
EndIf
Protected DC
DC = DefaultPrinter()
; beginn +++ uncomment next lines for API print requester. Do not use PrintRequester()
lppd.PRINTDLGAPI; Struktur für die API Druckerauswahl
lppd\lStructsize=SizeOf(PRINTDLGAPI)
lppd\Flags=#PD_ALLPAGES| #PD_HIDEPRINTTOFILE | #PD_NOSELECTION | #PD_RETURNDC
PrintDlg_(lppd); API Druckerauswahl (printrequester geht nicht)
DC=lppd\hdc; hier kommt der Device Context zurück
; end +++ uncomment next lines for API print requester. Do not use PrintRequester()
If DC = 0
ProcedureReturn 0
EndIf
cRect.RECT
FormatRange.FORMATRANGE
Docinfo.Docinfo
Docinfo\cbSize = SizeOf(Docinfo)
Docinfo\lpszDocName = @docname
Docinfo\lpszOutput = #Null
To_Print_Window() ; Call Progresswindow
SetGadgetText(#Print_Progress_Txt0_1, "Prepare to Print") ; Report Progress
StartDoc_(DC,Docinfo)
LastChar = 0
MaxLen = Len(GetGadgetText(Gadget)) - SendMessage_(GadgetID(Gadget),#EM_GETLINECOUNT,0,0)
OldMapMode = GetMapMode_(DC)
SetMapMode_(DC,#MM_TWIPS)
OffsetX = GetDeviceCaps_(DC,#PHYSICALOFFSETX)
OffsetY = -GetDeviceCaps_(DC,#PHYSICALOFFSETY)
HorzRes = GetDeviceCaps_(DC,#HORZRES)
VertRes = -GetDeviceCaps_(DC,#VERTRES)
SetRect_(cRect,OffsetX,OffsetY,HorzRes,VertRes)
DPtoLP_(DC,cRect,2)
SetMapMode_(DC,OldMapMode)
FormatRange\hdc = DC
FormatRange\hdcTarget = DC
FormatRange\rc\left = cRect\left
FormatRange\rc\top = cRect\top
FormatRange\rc\right = cRect\right
FormatRange\rc\bottom = cRect\bottom
FormatRange\rcPage\left = cRect\left
FormatRange\rcPage\top = cRect\top
FormatRange\rcPage\right = cRect\right
FormatRange\rcPage\bottom = cRect\bottom
a = 1
Repeat
SetGadgetText(#Print_Progress_Txt0_1, "Printing Page : "+ Str(a)) ; Report Progress
StartPage_(DC)
FormatRange\chrg\cpMax = -1
LastChar = SendMessage_(GadgetID(Gadget),#EM_FORMATRANGE,#True,@FormatRange)
FormatRange\chrg\cpMin = LastChar
SendMessage_(GadgetID(Gadget),#EM_DISPLAYBAND,0,cRect)
a + 1
EndPage_(DC)
Until LastChar >= MaxLen Or LastChar = -1
SetGadgetText(#Print_Progress_Txt0_1, "Printing End") ; Report Progress
From_Print_Window() ; Close Progresswindow
EndDoc_(DC)
SendMessage_(GadgetID(Gadget),#EM_FORMATRANGE,0,0)
EndProcedure
http://forums.purebasic.com/german/view ... ght=editor
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Hallo hallodri und PAMKKKKK,
ihr habt mir sehr geholfen, das Teil funzt einwandfrei.
ich werd mich mal mehr mit der Win-API befassen, vielleicht check ich das ja.
Ein Lob auf dieses Board, wo nicht gleich jeder Anfänger als Dümmling hingestellt wird und auch sehr gut und sehr schnell geholfen bekommt.
vielen Dank
ihr habt mir sehr geholfen, das Teil funzt einwandfrei.
ich werd mich mal mehr mit der Win-API befassen, vielleicht check ich das ja.
Ein Lob auf dieses Board, wo nicht gleich jeder Anfänger als Dümmling hingestellt wird und auch sehr gut und sehr schnell geholfen bekommt.



vielen Dank