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.
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
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:
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
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