Übers EditorGadget wurde wohl schon fast alles gesagt und geschrieben, aber auch ich möchte mich einreihen in die vielen sinnvollen Beiträge

Da es standardmäßig kein PopUp Menu gibt, wenn man die rechte Maustaste drückt, habe ich dem mit folgendem Code Abhilfe geschaffen. Und wie es so ist, man packt immer mehr Funktionen in das ehemals sooooo kleine Tool. Manches ist Unsinn, anderes nicht.
Wichtig: Die Auswirkung einiger Funktionen sieht man sofort, andere nur, wenn Text markiert wurde oder weiter geschrieben wird. Auch durch das andauernde Ändern, können sich Fehler eingeschlichen haben. Bitte melden.
Was ich gerne hätte, aber nicht geschafft habe, ist bei \rgxTabs die Möglichkeiten von z.B. Right-aligned tab und Dotted leader etc. Entweder habe ich eine zu alte RichText DLL oder ich bin zu blöd.
Anregungen und vor allem Verbesserungen sind sehr Willkommen !
Hier die Include
Code: Alles auswählen
;Editorgadget mit PopUp bei Rightclick mit Load, Save Styles etc
;
;HJBremer Juli - 2010 PB 4.50 x86 - Windows XP x86 32 Bit
;
;Quellen
;Microsoft SDK
;http://msdn.microsoft.com/en-us/library/bb787873(VS.85).aspx
;http://www.purebasic.fr/english/viewtopic.php?t=6666
;http://www.rsbasic.de/
;http://www.purearea.net/pb/german/index.htm
EnableExplicit
Enumeration
#egmTextKill
#egmTextLoad
#egmTextSave
#egmTextPrint
#egmModeToRtf
#egmFarbe
#egmFarbeRot
#egmFarbeBlau
#egmFarbeGruen
#egmFarbeMagenta
#egmFarbeSchwarz
#egmFarbeAuswahl
#egmFarbeEnde
#egmFontwahl
#egmFontSize
#egmFontSizeEnde = #egmFontSize + 20 ;20 MenuEinträge reserviert
#egmFontStyle
#egmFontStyleBold
#egmFontStyleItalic
#egmFontStyleUnderline
#egmFontStyleStrikeout
#egmFontStyleSubScript
#egmFontStyleSuperScript
#egmFontStyleEnde
#egmAlignment
#egmAlignmentLeft
#egmAlignmentRight
#egmAlignmentCenter
#egmAlignmentOffsetR
#egmAlignmentOffsetL
#egmAlignmentRandLksOn
#egmAlignmentRandLksOff
#egmAlignmentLineSpaceOn
#egmAlignmentLineSpaceOff
#egmAlignmentTabGross
#egmAlignmentTabNormal
#egmAlignmentReturnOn
#egmAlignmentReturnOff
#egmAlignmentEnde
#egmNumbering
#egmNumbering0
#egmNumbering1
#egmNumbering2
#egmNumbering3
#egmNumbering4
#egmNumbering5
#egmNumbering6
#egmNumberingEnde
;weitere Menu Konstanten bei Bedarf
#egmMenuEnde
EndEnumeration
;Menutext für Anzeige und Auswertung
#egmFarbeMenuTextRot = "rot"
#egmFarbeMenuTextBlau = "blau"
#egmFarbeMenuTextGruen = "grün"
#egmFarbeMenuTextMagenta = "magenta"
#egmFarbeMenuTextSchwarz = "schwarz"
#egmFarbeMenuTextAuswahl = "Auswahl"
Define egm_menunr, egm_itemnr, egm_lastfile.s
; Diverses
Procedure.i Twips(mm) ;falls es jemand braucht
ProcedureReturn mm / (25.4/1440)
EndProcedure
Procedure.i TwipsMM(twips)
ProcedureReturn twips * (25.4/1440)
EndProcedure
; EditorGadget - Set-Proceduren
Procedure.i EditGadgetSetAutoUrl(pbnr)
; muss vor SetGadgettext() benutzt werden
Protected id = GadgetID(pbnr)
Protected mask = SendMessage_(id, #EM_GETEVENTMASK, 0, 0)
SendMessage_(id, #EM_SETEVENTMASK, 0, mask | #ENM_LINK)
SendMessage_(id, #EM_AUTOURLDETECT, #True, 0)
EndProcedure
Procedure.i EditGadgetSetAutoUrlCB(hwnd, msg, wparam, lparam)
Static hyperlink.s{#MAX_PATH} ;260 Bytes
Protected *enlink.ENLINK
If msg = #WM_NOTIFY
*enlink = lparam
If *enlink\nmhdr\code = #EN_LINK ;1803
If *enlink\wparam ;0=Maus berührt Text; 1=Leftclick; 2=Rightclick
SendMessage_(*enlink\nmhdr\hwndfrom, #EM_EXSETSEL, 0, *enlink\chrg)
SendMessage_(*enlink\nmhdr\hwndfrom, #EM_GETSELTEXT, 0, @hyperlink)
RunProgram(hyperlink)
EndIf
EndIf
EndIf
EndProcedure
Procedure.i EditGadgetSetModeRTF(pbnr = -1)
If pbnr = -1: pbnr = GetActiveGadget(): EndIf
Protected id = GadgetID(pbnr)
Protected mode = SendMessage_(id, #EM_GETTEXTMODE, 0, 0)
If mode & #TM_RICHTEXT: ProcedureReturn: EndIf ;ist schon RTF
;auf RTF umstellen
If mode & #TM_PLAINTEXT
Protected rg.CharRange
SendMessage_(id, #EM_EXGETSEL, 0, rg) ;select save
SendMessage_(id, #WM_SETREDRAW, #False, 0) ;redraw aus
Protected text.s = GetGadgetText(pbnr) ;inhalt save
mode & ~ #TM_PLAINTEXT ;flag löschen
mode | #TM_RICHTEXT ;flag setzen
SetGadgetText(pbnr, "") ;inhalt löschen !!
SendMessage_(id, #EM_SETTEXTMODE, mode, 0) ;rtfmode setzen
SetGadgetText(pbnr, text) ;text zurück
SendMessage_(id, #WM_SETREDRAW, #True, 0) ;redraw ein
SendMessage_(id, #EM_SETSEL, rg\cpMin, rg\cpMax)
EndIf
EndProcedure
Procedure.i EditGadgetSetColorVg(mp)
Shared egm_menunr
Protected color
Protected menutext.s = GetMenuItemText(egm_menunr, mp)
Select menutext
Case #egmFarbeMenuTextRot: color = #Red
Case #egmFarbeMenuTextBlau: color = #Blue
Case #egmFarbeMenuTextGruen: color = #Green
Case #egmFarbeMenuTextMagenta: color = #Magenta
Case #egmFarbeMenuTextSchwarz: color = #Black
Case #egmFarbeMenuTextAuswahl: color = -1
EndSelect
;ColorRequester() aufrufen
If color = -1
color = ColorRequester()
EndIf
;ColorRequester() abgebrochen ?
If color = -1: ProcedureReturn: EndIf
Protected id = GadgetID(GetActiveGadget())
Protected charformat.CharFormat2
charformat\cbSize = SizeOf(CharFormat2)
charformat\dwMask = #CFM_COLOR
charformat\crTextColor = color
SendMessage_(id, #EM_SETCHARFORMAT, #SCF_SELECTION, charformat)
Protected charrange.CharRange
SendMessage_(id, #EM_EXGETSEL, 0, charrange)
SendMessage_(id, #EM_SETSEL, charrange\cpMax, charrange\cpMax)
EndProcedure
Procedure.i EditGadgetSetFontsize(mp)
Shared egm_menunr
Protected id = GadgetID(GetActiveGadget())
Protected charformat.CharFormat2
charformat\cbSize = SizeOf(CharFormat2)
charformat\dwMask = #CFM_SIZE
charformat\yHeight = Val(GetMenuItemText(egm_menunr, mp)) * 20
SendMessage_(id, #EM_SETCHARFORMAT, #SCF_SELECTION, charformat)
;Protected charrange.CharRange
;SendMessage_(id, #EM_EXGETSEL, 0, charrange)
;SendMessage_(id, #EM_SETSEL, charrange\cpMax, charrange\cpMax)
EndProcedure
Procedure.i EditGadgetSetFontstyle(mp)
;#CFM_LINK = $20: #CFE_LINK = $20
#CFM_SUBSCRIPT = $30000: #CFE_SUBSCRIPT = $10000
#CFM_SUPERSCRIPT = $30000: #CFE_SUPERSCRIPT = $20000
Protected id = GadgetID(GetActiveGadget())
Protected format.CharFormat2\cbSize = SizeOf(CharFormat2)
With format
\dwMask = #CFM_BOLD
\dwMask | #CFM_ITALIC
\dwMask | #CFM_UNDERLINE
\dwMask | #CFM_STRIKEOUT
\dwMask | #CFM_SUBSCRIPT
\dwMask | #CFM_SUPERSCRIPT
SendMessage_(id, #EM_GETCHARFORMAT, #SCF_SELECTION, format)
If mp > -1
Protected charflag
Select mp
Case #egmFontStyleBold: charflag = #CFE_BOLD
Case #egmFontStyleItalic: charflag = #CFE_ITALIC
Case #egmFontStyleUnderline: charflag = #CFE_UNDERLINE
Case #egmFontStyleStrikeout: charflag = #CFE_STRIKEOUT
Case #egmFontStyleSubScript: charflag = #CFE_SUBSCRIPT
Case #egmFontStyleSuperScript:charflag = #CFE_SUPERSCRIPT
EndSelect
If \dwEffects & charflag ;wenn flag vorhanden
\dwEffects & ~ charflag ;dann löschen
Else
\dwEffects | charflag ;sonst setzen
EndIf
SendMessage_(id, #EM_SETCHARFORMAT, #SCF_SELECTION, format)
Else ;nur für PopUp Menu
Shared egm_menunr, egm_itemnr
;Haken setzen wenn flag vorhanden
If \dwEffects & #CFE_BOLD: SetMenuItemState(egm_menunr, egm_itemnr + #egmFontStyleBold, 1): EndIf
If \dwEffects & #CFE_ITALIC: SetMenuItemState(egm_menunr, egm_itemnr + #egmFontStyleItalic, 1): EndIf
If \dwEffects & #CFE_UNDERLINE: SetMenuItemState(egm_menunr, egm_itemnr + #egmFontStyleUnderline, 1): EndIf
If \dwEffects & #CFE_STRIKEOUT: SetMenuItemState(egm_menunr, egm_itemnr + #egmFontStyleStrikeout, 1): EndIf
If \dwEffects & #CFE_SUBSCRIPT: SetMenuItemState(egm_menunr, egm_itemnr + #egmFontStyleSubScript, 1): EndIf
If \dwEffects & #CFE_SUPERSCRIPT: SetMenuItemState(egm_menunr, egm_itemnr + #egmFontStyleSuperScript, 1): EndIf
EndIf
EndWith
EndProcedure
Procedure.i EditGadgetSetFont()
Protected name.s, size, farbe, style
Protected id = GadgetID(GetActiveGadget())
Protected charformat.CharFormat2
charformat\cbSize = SizeOf(CharFormat2)
;get Font
charformat\dwMask = #CFM_FACE | #CFM_SIZE | #CFM_COLOR
SendMessage_(id, #EM_GETCHARFORMAT, #SCF_SELECTION, @charformat)
name = PeekS(@charformat\szFaceName)
size = charformat\yHeight / 20
farbe = charformat\crTextColor
;get styles
charformat\dwMask | #CFM_BOLD
charformat\dwMask | #CFM_ITALIC
charformat\dwMask | #CFM_UNDERLINE
charformat\dwMask | #CFM_STRIKEOUT
SendMessage_(id, #EM_GETCHARFORMAT, #SCF_SELECTION, @charformat)
If charformat\dwEffects & #CFE_BOLD: style | #PB_Font_Bold: EndIf
If charformat\dwEffects & #CFE_ITALIC: style | #PB_Font_Italic: EndIf
If charformat\dwEffects & #CFE_UNDERLINE: style | #PB_Font_Underline: EndIf
If charformat\dwEffects & #CFE_STRIKEOUT: style | #PB_Font_StrikeOut: EndIf
If Not FontRequester(name, size, #PB_FontRequester_Effects, farbe, style)
ProcedureReturn
EndIf
;set Font
PokeS(@charformat\szFaceName, SelectedFontName()) ;kopieren nach \szFaceName.c[32]
charformat\yHeight = SelectedFontSize() * 20
charformat\crTextColor = SelectedFontColor()
;set Styles, erst Flags löschen ist einfacher
charformat\dwEffects & ~ #CFE_BOLD
charformat\dwEffects & ~ #CFE_ITALIC
charformat\dwEffects & ~ #CFM_UNDERLINE
charformat\dwEffects & ~ #CFM_STRIKEOUT
;nun Flags setzen
style = SelectedFontStyle()
If style & #PB_Font_Bold: charformat\dwEffects | #CFE_BOLD: EndIf
If style & #PB_Font_Italic: charformat\dwEffects | #CFE_ITALIC: EndIf
If style & #PB_Font_Underline: charformat\dwEffects | #CFM_UNDERLINE: EndIf
If style & #PB_Font_StrikeOut: charformat\dwEffects | #CFM_STRIKEOUT: EndIf
SendMessage_(id, #EM_SETCHARFORMAT, #SCF_SELECTION, @charformat)
EndProcedure
Procedure.i EditGadgetSetAlignment(mp)
Protected j
Protected id = GadgetID(GetActiveGadget())
Protected format.ParaFormat2\cbSize = SizeOf(ParaFormat2)
With format
Select mp
Case #egmAlignmentLeft: \dwMask = #PFM_ALIGNMENT: \wAlignment = #PFA_LEFT
Case #egmAlignmentRight: \dwMask = #PFM_ALIGNMENT: \wAlignment = #PFA_RIGHT
Case #egmAlignmentCenter: \dwMask = #PFM_ALIGNMENT: \wAlignment = #PFA_CENTER
Case #egmAlignmentOffsetR: \dwMask = #PFM_OFFSETINDENT: \dxStartIndent = 150
Case #egmAlignmentOffsetL: \dwMask = #PFM_OFFSETINDENT: \dxStartIndent = -150
Case #egmAlignmentRandLksOn: \dwMask = #PFM_STARTINDENT: \dxStartIndent = 150
Case #egmAlignmentRandLksOff: \dwMask = #PFM_STARTINDENT: \dxStartIndent = 0
Case #egmAlignmentLineSpaceOn: \dwMask = #PFM_LINESPACING: \dyLineSpacing = 25: \bLineSpacingRule = 5
Case #egmAlignmentLineSpaceOff: \dwMask = #PFM_LINESPACING: \dyLineSpacing = 0: \bLineSpacingRule = 0
Case #egmAlignmentTabGross, #egmAlignmentTabNormal
\dwMask = #PFM_TABSTOPS
\cTabCount = 31 ;#MAX_TAB_STOPS -1
For j = 0 To 31
\rgxTabs[j] = (j + 1) * 1000 ;oder * Twips()
If mp = #egmAlignmentTabNormal: \rgxTabs[j] = 0: EndIf
Next
Case #egmNumbering To #egmNumberingEnde
Select mp
Case #egmNumbering1: \wNumbering = 1 ;Bullet
Case #egmNumbering2: \wNumbering = 2 ;2 = 1..2..3
Case #egmNumbering3: \wNumbering = 3 ;3 = a..b..c
Case #egmNumbering4: \wNumbering = 4 ;4 = A..B..C
Case #egmNumbering5: \wNumbering = 5 ;5 = i..ii..iii
Case #egmNumbering6: \wNumbering = 6 ;6 = I..II..III
EndSelect
\dwMask = #PFM_NUMBERING | #PFM_NUMBERINGSTART
\dwMask | #PFM_NUMBERINGSTYLE | #PFM_NUMBERINGTAB
\wNumberingStart = 1 ; erster Wert
\wNumberingStyle = $200 ; 0 = A) $100 = (A) $200 = A. $300 = A
\wNumberingTab = 250 ; Abstand in twips
Case #egmAlignmentReturnOn: SendMessage_(id, #EM_SETTARGETDEVICE, 0, 0): ProcedureReturn
Case #egmAlignmentReturnOff: SendMessage_(id, #EM_SETTARGETDEVICE, 0, -1): ProcedureReturn
EndSelect
SendMessage_(id, #EM_SETPARAFORMAT, 0, format)
EndWith
EndProcedure
; EditorGadget - PopUp Main-Proceduren
Procedure.i EditGadgetPopUpCreate(mode)
Protected subid, j, k
Shared egm_menunr, egm_itemnr
egm_menunr = CreatePopupMenu(#PB_Any)
;egm_menunr = CreatePopupImageMenu(#PB_Any, #PB_Menu_ModernLook)
MenuItem(egm_itemnr + #egmTextKill, "&Neu")
MenuItem(egm_itemnr + #egmTextLoad, "Ö&ffnen")
MenuItem(egm_itemnr + #egmTextSave, "&Speichern")
MenuItem(egm_itemnr + #egmTextPrint, "&Drucken")
If mode & #TM_RICHTEXT
MenuBar()
MenuItem(egm_itemnr + #egmFontwahl, "Fontwahl")
subid = OpenSubMenu("Fontsize")
k = 0
For j = 6 To 12
k + 1: MenuItem(egm_itemnr + #egmFontsize + k, Str(j))
Next
k + 1: AppendMenu_(subid, #MF_MENUBREAK, egm_itemnr + #egmFontsize + k, "14")
For j = 16 To 26 Step 2
k + 1: MenuItem(egm_itemnr + #egmFontsize + k, Str(j))
Next
CloseSubMenu()
If k > #egmFontSizeEnde - #egmFontsize: Debug "#egmFontSizeEnde zu klein": End: EndIf
OpenSubMenu("Fontfarbe")
MenuItem(egm_itemnr + #egmFarbeRot, #egmFarbeMenuTextRot)
MenuItem(egm_itemnr + #egmFarbeBlau, #egmFarbeMenuTextBlau)
MenuItem(egm_itemnr + #egmFarbeGruen, #egmFarbeMenuTextGruen)
MenuItem(egm_itemnr + #egmFarbeMagenta, #egmFarbeMenuTextMagenta)
MenuItem(egm_itemnr + #egmFarbeSchwarz, #egmFarbeMenuTextSchwarz)
MenuBar()
MenuItem(egm_itemnr + #egmFarbeAuswahl, #egmFarbeMenuTextAuswahl)
CloseSubMenu()
OpenSubMenu("Fontstyle")
MenuItem(egm_itemnr + #egmFontStyleBold, "Fett")
MenuItem(egm_itemnr + #egmFontStyleItalic, "Kursiv")
MenuItem(egm_itemnr + #egmFontStyleUnderline, "Unterstreichen")
MenuItem(egm_itemnr + #egmFontStyleStrikeout, "Durchstreichen")
MenuItem(egm_itemnr + #egmFontStyleSubScript, "Tiefstellen")
MenuItem(egm_itemnr + #egmFontStyleSuperScript, "Hochstellen")
CloseSubMenu()
EditGadgetSetFontStyle(-1)
MenuBar()
OpenSubMenu("Format")
MenuItem(egm_itemnr + #egmAlignmentLeft, "Absatz linksbündig")
MenuItem(egm_itemnr + #egmAlignmentRight, "Absatz rechtsbündig")
MenuItem(egm_itemnr + #egmAlignmentCenter, "Absatz mittig")
MenuBar()
MenuItem(egm_itemnr + #egmAlignmentOffsetR, "Absatz nach rechts")
MenuItem(egm_itemnr + #egmAlignmentOffsetL, "Absatz nach links")
MenuBar()
MenuItem(egm_itemnr + #egmAlignmentRandLksOn, "Linker Rand ein")
MenuItem(egm_itemnr + #egmAlignmentRandLksOff, "Linker Rand aus")
MenuBar()
MenuItem(egm_itemnr + #egmAlignmentLinespaceOn, "Zeilenabstand groß")
MenuItem(egm_itemnr + #egmAlignmentLinespaceOff, "Zeilenabstand normal")
MenuBar()
MenuItem(egm_itemnr + #egmAlignmentTabGross, "Tab groß")
MenuItem(egm_itemnr + #egmAlignmentTabNormal, "Tab normal")
MenuBar()
MenuItem(egm_itemnr + #egmAlignmentReturnOn, "Return auto ein")
MenuItem(egm_itemnr + #egmAlignmentReturnOff, "Return auto aus")
CloseSubMenu()
OpenSubMenu("Number")
MenuItem(egm_itemnr + #egmNumbering1, "Bullet")
MenuItem(egm_itemnr + #egmNumbering2, "1..2..3")
MenuItem(egm_itemnr + #egmNumbering3, "a..b..c")
MenuItem(egm_itemnr + #egmNumbering4, "A..B..C")
MenuItem(egm_itemnr + #egmNumbering5, "i..ii..iii")
MenuItem(egm_itemnr + #egmNumbering6, "I..II..III")
CloseSubMenu()
EndIf
If mode & #TM_PLAINTEXT
MenuBar()
MenuItem(egm_itemnr + #egmModeToRtf, "RTF-Mode ein")
EndIf
EndProcedure
Procedure.i EditGadgetPopUpDisplay()
Shared egm_menunr
If Not IsGadget(GetActiveGadget()): ProcedureReturn: EndIf ;!!!
If GadgetType(GetActiveGadget()) <> #PB_GadgetType_Editor
ProcedureReturn
EndIf
Protected id = GadgetID(GetActiveGadget())
;get Textmode
Protected mode = SendMessage_(id, #EM_GETTEXTMODE, 0, 0)
EditGadgetPopUpCreate(mode) ;erstellt PopUp und setzt egm_menunr
;get Caret Pos
Protected point.Point, rect.Rect
Protected charrange.CharRange
GetCursorPos_(point)
GetWindowRect_(id, rect)
If PtInRect_(rect, point\x | (point\y << 32))
;SendMessage_(id, #EM_EXGETSEL, 0, charrange)
;SendMessage_(id, #EM_POSFROMCHAR, point, charrange\cpMax)
;ClientToScreen_(id, point)
;point\x + 10: point\y + 10
DisplayPopupMenu(egm_menunr, WindowID(GetActiveWindow()), point\x, point\y)
SetCursorPos_(point\x, point\y)
EndIf
EndProcedure
Procedure.i EditGadgetPopUpMenuItemNr(menuitemstartnr)
;diese Proc wird nur benötigt, wenn es mehrere Menus gibt
;denn dann muß dem EditgadgetPopUp die MenuItemStartnr
;mitgeteilt werden und gibt die Anzahl Menunummern zurück.
Shared egm_itemnr
egm_itemnr = menuitemstartnr
ProcedureReturn #egmMenuEnde
EndProcedure
; EditorGadget - StreamIn/Out Proceduren
Procedure.i EditGadgetStreamInCB(hFile, pbBuff, cb, pcb)
ProcedureReturn ReadFile_(hFile, pbBuff, cb, pcb, 0) ! 1
EndProcedure
Procedure.i EditGadgetStreamOutCB(hFile, pbBuff, cb, pcb)
ProcedureReturn WriteFile_(hFile, pbBuff, cb, pcb, 0) ! 1
EndProcedure
Procedure.i EditGadgetStream(pbnr, datname.s, iomode)
Protected id = GadgetID(pbnr)
Protected mode
Protected textmode = #TM_PLAINTEXT
Protected datamode = #SF_TEXT
Protected endung$ = LCase(GetExtensionPart(datname))
Protected dnr, bytes
Protected isrtf.s = "{\rtf1\" ;"{\rtf1\ansi\" ;Startchar in einer RTF Datei
Protected check.s = Space(Len(isrtf)) ;Memory reservieren
If endung$ = "rtf"
textmode = #TM_RICHTEXT
datamode = #SF_RTF
;ist es eine RTF Datei ?
If iomode = #EM_STREAMIN
dnr = ReadFile(#PB_Any, datname)
If dnr
ReadData(dnr, @check, Len(isrtf))
If check <> isrtf
textmode = #TM_PLAINTEXT
datamode = #SF_TEXT
EndIf
CloseFile(dnr)
EndIf
EndIf
EndIf
If iomode = #EM_STREAMIN
;Vorsicht Falle, nicht vergessen bei StreamIn
SendMessage_(id, #WM_SETTEXT, 0, "") ;oder SetGadgetText(pbnr, "")
EndIf
;Textmode setzen
mode = SendMessage_(id, #EM_GETTEXTMODE, 0, 0) ;mode holen
mode & ~ #TM_RICHTEXT ;flag löschen
mode & ~ #TM_PLAINTEXT ;flag löschen
mode | textmode ;mode setzen
SendMessage_(id, #EM_SETTEXTMODE, mode, 0)
Protected eds.EditStream
If iomode = #EM_STREAMIN
eds\pfnCallback = @EditGadgetStreamInCB()
dnr = ReadFile(#PB_Any, datname)
ElseIf iomode = #EM_STREAMOUT
eds\pfnCallback = @EditGadgetStreamOutCB()
dnr = CreateFile(#PB_Any, datname)
Else
ProcedureReturn -1 ;falscher Parameter
EndIf
If dnr
eds\dwCookie = FileID(dnr) ;Dateihandle für CB
bytes = SendMessage_(id, iomode, datamode, @eds)
CloseFile(dnr)
Else
ProcedureReturn -2 ;Datei-Fehler
EndIf
ProcedureReturn bytes
EndProcedure
; EditorGadget - Datei Proceduren
Procedure.i EditGadgetTextKill()
SetGadgetText(GetActiveGadget(), "")
EndProcedure
Procedure.i EditGadgetTextLoad(datname.s = "", pbnr = -1)
Shared egm_lastfile.s
If pbnr = -1: pbnr = GetActiveGadget(): EndIf
If datname = ""
Protected file.s = egm_lastfile
Protected patt.s = "Rtf-Text (*.rtf)|*.rtf;|Text (*.txt)|*.txt;|Alle Dateien (*.*)|*.*"
file = OpenFileRequester("", file, patt, 0)
If Not file: ProcedureReturn: EndIf
egm_lastfile = file
Else
egm_lastfile = datname
EndIf
Protected bytes = EditGadgetStream(pbnr, egm_lastfile, #EM_STREAMIN)
ProcedureReturn bytes
EndProcedure
Procedure.i EditGadgetTextSave(datname.s = "", pbnr = -1)
Shared egm_lastfile.s
If pbnr = -1: pbnr = GetActiveGadget(): EndIf
If datname = ""
Protected file.s = egm_lastfile
Protected patt.s = "Rtf-Text (*.rtf)|*.rtf;|Text (*.txt)|*.txt;|Alle Dateien (*.*)|*.*"
file = SaveFileRequester("", file, patt, 0)
If Not file: ProcedureReturn: EndIf
egm_lastfile = file
Else
egm_lastfile = datname
EndIf
Protected bytes = EditGadgetStream(pbnr, egm_lastfile, #EM_STREAMOUT)
ProcedureReturn bytes
EndProcedure
Procedure.i EditGadgetTextPrint(datname.s = "", pbnr = -1)
If Not datname Or pbnr > -1
If pbnr = -1: pbnr = GetActiveGadget(): EndIf
If Not IsGadget(pbnr): ProcedureReturn: EndIf ;falls pbnr ungültig
If GadgetType(pbnr) <> #PB_GadgetType_Editor: ProcedureReturn: EndIf
If Not datname
datname = "_Dummy.rtf"
EditGadgetStream(pbnr, datname, #EM_STREAMOUT)
EndIf
EndIf
RunProgram("WordPad", "/p " + datname, "", #PB_Program_Hide)
;mir bekannte Parameter von WordPad
;/p TextFileName
;/pt TextFileName PrinterName [ DriverName [ PortName ]
EndProcedure
; EditorGadget - Events
Procedure.i EditGadgetEvents(event)
Shared egm_itemnr
If event = #WM_RBUTTONDOWN ;516
EditGadgetPopUpDisplay()
ElseIf event = #PB_Event_Menu
Protected menuitem = EventMenu() - egm_itemnr
Select menuitem
Case #egmTextKill: EditGadgetTextKill()
Case #egmTextLoad: EditGadgetTextLoad()
Case #egmTextSave: EditGadgetTextSave()
Case #egmTextPrint: EditGadgetTextPrint()
Case #egmFontwahl: EditGadgetSetFont()
Case #egmModeToRtf: EditGadgetSetModeRTF(): EditGadgetPopUpDisplay()
Case #egmFarbe To #egmFarbeEnde: EditGadgetSetColorVg(menuitem)
Case #egmFontSize To #egmFontSizeEnde: EditGadgetSetFontsize(menuitem)
Case #egmFontStyle To #egmFontStyleEnde: EditGadgetSetFontstyle(menuitem)
Case #egmAlignment To #egmAlignmentEnde: EditGadgetSetAlignment(menuitem)
Case #egmNumbering To #egmNumberingEnde: EditGadgetSetAlignment(menuitem)
EndSelect
EndIf
EndProcedure
Code: Alles auswählen
; -Test-------------------------------------
Procedure CallBack(hwnd, msg, wparam, lparam)
Protected result = #PB_ProcessPureBasicEvents
EditGadgetSetAutoUrlCB(hwnd, msg, wparam, lparam)
ProcedureReturn result
EndProcedure
Enumeration
#window
#editor1
#editor2
#button1
EndEnumeration
#winbr = 850
#winhh = 600
#wrand = 8
#edix = #wrand
#ediy = #wrand
#edibr = #winbr - #wrand - #wrand
#edihh = #winhh - #wrand - #wrand - 150
Define flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
OpenWindow(#window, 0, 0, #winbr, #winhh, "EditorGadget", flags)
EditorGadget(#editor1, #edix, #ediy, #edibr, #edihh)
EditorGadget(#editor2, #edix, #ediy + #edihh + 10, #edibr, 110)
ButtonGadget(#button1, 10, #winhh - 30, 200, 20, "Load sdk\readme.txt")
;wenn Web Adressen erkannt werden sollen
;EditGadgetSetAutoUrl(#editor1) ;aufrufen bevor Text geladen wird !
;SetWindowCallback(@Callback()) ;hier nur für AutoUrlDetect
;Datei gleich laden
EditGadgetTextLoad(#PB_Compiler_Home + "Examples\Sources\File.txt", #editor1)
;oder mit AddGadgetItem() Text zuweisen
;falls es mehrere Menus gibt, dann Startitemnr übergeben
;Debug EditGadgetSetPopUpItemNr(111)
; -Event Schleife-------------------------------------
Repeat
Define event = WaitWindowEvent()
EditGadgetEvents(event) ; für Eventverarbeitung PopUp !!!
If event = #PB_Event_Gadget
Define wB = EventGadget()
Select wb
Case #button1: EditGadgetTextLoad(#PB_Compiler_Home + "sdk\readme.txt", #editor2)
EndSelect
EndIf
Until event = #PB_Event_CloseWindow