RTF-Texte mit #PB_Editor_RTF kopieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Hallo Edel!

Die 4.0 Demo-Version sagt mir beim Öffnen unter Andrem :"no Win32 Api support".

Dein Code erzeugt bei mir
Error:
PureBasic.sam[71]
extrn_SendMessageA@16
error: symbol already defined.

Bin leider kein Experte um dazu was zu sagen.

Vielleicht hast du zu meiner Anfrage von eben eine Lösung:
http://www.purebasic.fr/german/viewtopic.php?t=9603
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

So sollte es aber gehen :

Code: Alles auswählen

Prototype SendMessage(hwnd,msg,wparam,lparam)
OpenLibrary(0,"User32.dll")
SendMessage_.SendMessage = GetFunction(0,"SendMessageA")
;SendMessage_.SendMessage = GetFunction(0,"SendMessageW") ; unicode

#WM_CLOSE   = 16
#WM_SETTEXT = 12


hwnd = OpenWindow(0,0,0,400,400,"")

CreateGadgetList(hwnd)
Handle = EditorGadget(0,0,0,400,400)

SendMessage_(Handle,#WM_SETTEXT,0,@"Hallo")

Repeat
  Event = WaitWindowEvent()
Until Event = #WM_CLOSE
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Klasse! Es geht! :mrgreen:

Mit SendMessage_.SendMessage = GetFunction(0,"SendMessageA")
bekomme ich "Hallo"
und mit SendMessage_.SendMessage = GetFunction(0,"SendMessageW")
bekomme ich
"??o?", was Hallo in Unicode sein dürfte ;-)

Wo erfahre ich nun, was da passiert? In der Hilfe steht nichts über "Sendmessage" und SendMessageW.

Kann ich das nutzen für meine folgende Aufgabe:
http://www.purebasic.fr/german/viewtopic.php?t=9603

Ich hoffe, es gibt eine Lösung, das wäre super!!!!
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Für API ist die Dokumentation von Microsoft zuständig. Win32.hlp oder besser PSDK installieren. Online in MSDN stöbern geht auch, zu RichEdit:
http://msdn.microsoft.com/library/defau ... ntrols.asp

Als Anfänger und mit der Demo ist das ganze aber nicht so einfach. Einfach
mal die vorhandenen Codesnippets im CodeArchiv, den Foren usw. anpassen, testen usw.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hier nochmal eine Lösung von edel !!!

Code: Alles auswählen

Prototype SendMessage(hwnd,msg,wParam,lParam)
OpenLibrary(0,"User32.dll")
Global SendMessage_.SendMessage = GetFunction(0,"SendMessageA")


;PB4
; ************* Variables *************

Fensterueberschrift$ = "Unicode-Test"
Button_1     = 20   ; Button-ID
                                                     
Global FontID1
FontID1 = LoadFont(1, "Courier", 10)    ; Font für die Darstellung

;RTF- Test
text$="{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fmodern\fprq1\fcharset0 Courier New;}{\f1\fswiss\fprq2\fcharset0 Arial;}}"
text$=text$ + "{\colortbl ;\red0\green0\blue0;}"
text$=text$ + "\viewkind4\uc1\pard\ltrpar\cf1\f0\fs20 Unicode: \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365?\cf0\f1\par "
text$=text$ + "}"

#WM_SETTEXT     = 12
#SF_RTF         = 2
#EM_STREAMOUT   = 1098

CompilerIf Defined(EDITSTREAM,#PB_Structure) = 0
  Structure EDITSTREAM
    dwCookie.l
    dwError.l
    pfnCallback.l
  EndStructure
CompilerEndIf

; ************* Mainprogram *************

Procedure StreamOut(dwCookie,pbBuff,cb,*pcb) 
  SetGadgetText(dwCookie,PeekS(pbBuff))
EndProcedure

If OpenWindow(0, 1, 1, 800, 350, Fensterueberschrift$,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  SetWindowColor(0,RGB(100, 150, 100))
  CreateGadgetList(WindowID(0))
  EditorGadget(1, 20, 50, 650, 110)  ;#PB_Editor_ReadOnly
  SetGadgetFont(1, FontID1)
  EditorGadget(2, 20, 160, 650, 110);#PB_Editor_ReadOnly
  SetGadgetFont(2, FontID1)
  ButtonGadget(Button_1, 650+25, 130, 100, 20, "Copy")
  SetGadgetText(1, text$)     
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
        
      Case #PB_Event_Gadget
        Select EventGadget()
          
          Case Button_1
            Stream.EDITSTREAM
            Stream\dwCookie    = 2
            Stream\pfnCallback = @StreamOut()
            SendMessage_(GadgetID(1), #EM_STREAMOUT, #SF_RTF, @Stream)           
           
        EndSelect
        
    EndSelect
  ForEver
  
EndIf ; Open Window

End
Bei grösseren Texten wird StreamOut mehrmals aufgerufen.

PS: funktioniert nur ohne Unicode-Compilerdirektive, das liegt aber am nativ eingefügtem Text, dessen Syntax angepaßt werden müßte
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Hurra! Danke an Edel und ts-soft! Ich bin begeistert! :mrgreen: :mrgreen: :mrgreen:

In msdn usw. müsste ich mich erst mal einlesen. Für den Anfang reichen mir aber einige Erklärungen, den Rest kann ich ja ausprobieren.

Wieso heißt es SendMessage_(GadgetID(1)..
Wo kommt das GadgetID(1) her, bzw. wieso heißt es 1?

Wenn ich ein Debug Stream einfüge:

Code: Alles auswählen

Stream.EDITSTREAM 
            Stream\dwCookie    = 2 
            Stream\pfnCallback = @StreamOut() 
            SendMessage_(GadgetID(1), #EM_STREAMOUT, #SF_RTF, @Stream)            
            Debug Stream

so bekomme ich 4319844, egal was im EditorGadget für ein Text steht. Ist das eine Adresse?

Die wichtige Frage zum Schluss: Kann ich die Buchstaben oder den String oder RTF-Code irgendwie einzel auslesen?
Ich muss ja z.B. das Wort alpuŝiĝi umwandeln in alpu^si^gi.
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Eckhard.S hat geschrieben:Hurra! Danke an Edel und ts-soft! Ich bin begeistert! :mrgreen: :mrgreen: :mrgreen:

In msdn usw. müsste ich mich erst mal einlesen. Für den Anfang reichen mir aber einige Erklärungen, den Rest kann ich ja ausprobieren.

Wieso heißt es SendMessage_(GadgetID(1)..
Wo kommt das GadgetID(1) her, bzw. wieso heißt es 1?
Weil das EditorGadget die PB-Interne Nummer 1 hat, die Windows-API benötigt aber das Handle, hWnd, welches mit GadgetID(Gadget) ermittelt wird
Eckhard.S hat geschrieben:
Wenn ich ein Debug Stream einfüge:

Code: Alles auswählen

Stream.EDITSTREAM 
            Stream\dwCookie    = 2 
            Stream\pfnCallback = @StreamOut() 
            SendMessage_(GadgetID(1), #EM_STREAMOUT, #SF_RTF, @Stream)            
            Debug Stream

so bekomme ich 4319844, egal was im EditorGadget für ein Text steht. Ist das eine Adresse?
Das ist die Adresse der structurierten Variable Stream.
Eckhard.S hat geschrieben:
Die wichtige Frage zum Schluss: Kann ich die Buchstaben oder den String oder RTF-Code irgendwie einzel auslesen?
Ich muss ja z.B. das Wort alpuŝiĝi umwandeln in alpu^si^gi.
Schau ins CodeArchiv und schlage in der API hilfe nach. Anders wirste nicht vorwärts kommen, weil das viel zuviel ist, um es in einen Forum-Beitrag zu posten. Ich muß auch nachschlagen, auswendig weiß ich oder jemand anders es normallerweise auch nicht :wink:
Grundkenntnisse über Structuren und ähnlichem sind in jedemfall erforderlich, so das es vielleicht erstmal ratsamer wäre, sich mit den grundfunktionen in PB zu beschäftigen. Ohne diese Kenntnisse wirste da sonst nicht weiterkommen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hier mal ein paar "alte", von mir zusammengestellte Editor-Prozeduren.
Für PB4 sind evtl. Anpassungen erforderlich. Für die Demo-Version wohl
auch, bzw. sind evtl. auch noch Structuren zu definieren.

http://ts-soft.eu/dl/EditorGadgetPlus.pb
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Hurra! Hurra! Hurra! Danke! Ich bin fündig geworden. Zur Info: Der RTF-Code steckt in PeekS(pbBuff).

Hier die Erweiterung:

Code: Alles auswählen

Prototype SendMessage(hwnd,msg,wParam,lParam) 
OpenLibrary(0,"User32.dll") 
Global SendMessage_.SendMessage = GetFunction(0,"SendMessageA") 


;PB4 
; ************* Variables ************* 
Global a$
Fensterueberschrift$ = "Unicode-Test" 
Button_1     = 20   ; Button-ID 
                                                      
Global FontID1 
FontID1 = LoadFont(1, "Courier", 10)    ; Font für die Darstellung 

;RTF- Test 
text$="{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fmodern\fprq1\fcharset0 Courier New;}{\f1\fswiss\fprq2\fcharset0 Arial;}}" 
text$=text$ + "{\colortbl ;\red0\green0\blue0;}" 
text$=text$ + "\viewkind4\uc1\pard\ltrpar\cf1\f0\fs20 Unicode: \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365?\cf0\f1\par " 
text$=text$ + "}" 

#WM_SETTEXT     = 12 
#SF_RTF         = 2 
#EM_STREAMOUT   = 1098 

CompilerIf Defined(EDITSTREAM,#PB_Structure) = 0 
  Structure EDITSTREAM 
    dwCookie.l 
    dwError.l 
    pfnCallback.l 
  EndStructure 
CompilerEndIf 

; ************* Mainprogram ************* 

Procedure StreamOut(dwCookie,pbBuff,cb,*pcb) 
  SetGadgetText(dwCookie,PeekS(pbBuff)) 
  A$ = PeekS(pbBuff)  
EndProcedure 

If OpenWindow(0, 1, 1, 800, 350, Fensterueberschrift$,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
  SetWindowColor(0,RGB(100, 150, 100)) 
  CreateGadgetList(WindowID(0)) 
  EditorGadget(1, 20, 50, 650, 110)  ;#PB_Editor_ReadOnly 
  SetGadgetFont(1, FontID1) 
  EditorGadget(2, 20, 160, 650, 110);#PB_Editor_ReadOnly 
  SetGadgetFont(2, FontID1) 
  ButtonGadget(Button_1, 650+25, 130, 100, 20, "Copy") 
  SetGadgetText(1, text$)      
  
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Break 
        
      Case #PB_Event_Gadget 
        Select EventGadget() 
          
          Case Button_1 
            Stream.EDITSTREAM 
            Stream\dwCookie    = 2 
            Stream\pfnCallback = @StreamOut() 
            SendMessage_(GadgetID(1), #EM_STREAMOUT, #SF_RTF, @Stream)            
          
               A$ = ReplaceString(A$, "\u264?", "^C")  
               A$ = ReplaceString(A$, "\u284?", "^G")
               A$ = ReplaceString(A$, "\u292?", "^H")
               A$ = ReplaceString(A$, "\u308?", "^J")
               A$ = ReplaceString(A$, "\u348?", "^S")
               A$ = ReplaceString(A$, "\u364?", "^U")
               A$ = ReplaceString(A$, "\u265?", "^c")
               A$ = ReplaceString(A$, "\u285?", "^g")
               A$ = ReplaceString(A$, "\u293?", "^h")
               A$ = ReplaceString(A$, "\u309?", "^j")
               A$ = ReplaceString(A$, "\u349?", "^s") 
               A$ = ReplaceString(A$, "\u365?", "^u") 
        ;Debug A$       
        SetGadgetText(2, A$)
        
            
        EndSelect 
        
    EndSelect 
  ForEver 
  
EndIf ; Open Window 

End



Letzte Frage: Kann man die folgende Abteilung wie in PHP in einem Befehl machen (ersetze Array1-Elemente durch Array2-Elemente)?

Code: Alles auswählen

               A$ = ReplaceString(A$, "\u264?", "^C")  
               A$ = ReplaceString(A$, "\u284?", "^G")
               A$ = ReplaceString(A$, "\u292?", "^H")
               A$ = ReplaceString(A$, "\u308?", "^J")
               A$ = ReplaceString(A$, "\u348?", "^S")
               A$ = ReplaceString(A$, "\u364?", "^U")
               A$ = ReplaceString(A$, "\u265?", "^c")
               A$ = ReplaceString(A$, "\u285?", "^g")
               A$ = ReplaceString(A$, "\u293?", "^h")
               A$ = ReplaceString(A$, "\u309?", "^j")
               A$ = ReplaceString(A$, "\u349?", "^s") 
               A$ = ReplaceString(A$, "\u365?", "^u") 
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Zur Info: Der RTF-Code steckt in PeekS(pbBuff)
Aber nur das Teilstück, welches vom Callback gerade bearbeitet wird!
Bei diesem kurzen Text ist wohl alles enthalten, das muß aber nicht so sein.

Für dein Replacement fällt mir gerade nichts kürzeres ein, bzw. mir ist
sowieso nicht so ganz klar, was das ganze werden soll :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten