Seite 2 von 3

Verfasst: 16.08.2006 18:10
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

Verfasst: 16.08.2006 18:24
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

Verfasst: 16.08.2006 18:47
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!!!!

Verfasst: 16.08.2006 18:59
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.

Verfasst: 16.08.2006 19:56
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

Verfasst: 16.08.2006 21:54
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.

Verfasst: 16.08.2006 22:16
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.

Verfasst: 16.08.2006 22:25
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

Verfasst: 16.08.2006 22:39
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") 

Verfasst: 16.08.2006 22:46
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: