wieder mal EditorGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

wieder mal EditorGadget

Beitrag von John Doe »

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]
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nutze Streams

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.
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag von John Doe »

Hallo an hallodri :allright:
vielen Dank für die schnelle Antwort.
werde es gleich mal ausprobieren und mich dann wieder melden.
Gruß an alle
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag von John Doe »

Hallo an alle,
Code von Hallodri ist nicht schlecht; es können zwar jegliche Files unterschiedlicher Größe in EditorGadget geladen werden, jedoch können selbige nicht editiert werden, wenn sie größer als 32k sind. :cry:
wer kann mir weiterhelfen ....
Dank an alle
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von PAMKKKKK »

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
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Hab es oben angepasst.
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag von John Doe »

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

vielen Dank
Antworten