Autor | Thema: Richtext-Edits | | Datum:19.02.02 19:59 
(frankabbing@12move.de) | |
Hallo zusammen,
hat vielleicht schon mal jemand intensiv mit RichText-Edits (mehrzeilig) zu tun gehabt?
Oder gute Info's hierzu parat?
Wie z.B. kann ich ein Context-Menu (rechter Mausknopf, kopieren, paste usw.) einbinden?
Und wie kann ich die TAB-Taste sinnvoll benutzen?
Bin über alle Info's glücklich (besonders in deutsch ;-))
Gruß und Dank,
Frank
|
| | Datum:20.02.02 09:36 
(g.putschalka@utanet.at) | |
Hallo Frank,
ein Sebastian Meyer hat sich mit Rich Edits befaßt. Leider finde ich die Adresse nicht. Ich habe aber die (bzw. einige) Unterlagen. Wenn Du willst schicke ich sie dir.
Mfg
Gerhard
|
| | Datum:20.02.02 11:50 
(Pascalxd@owl-online.de) | |
Hallo Frank!
Mit Dokus kann ich nicht dienen, aber vielleicht hilft dir dies:
usermessages 16,40'--WM_CLOSE=Beenden + WM_NEXTDLGCTL=TAB
declare dll&,rtf&,Tab$
Tab$=chr$(9)
dll&=usedll("riched32.dll")
rtf&=control("RichEdit","Test",$54001044,50,50,200,200,%hwnd,100,%hinstance,$200)
while 1
waitinput
case &lparam=$2040001:messagebox("Kontextmenü","",0)
case %umessage=40:sendmessage(rtf&,194,0,addr(Tab$))'--EM_REPLACESEL->TAB simulieren
case %umessage=16:break'--Beenden
endwhile
freedll dll&
HTH
Pascal
|
| | Datum:20.02.02 17:17 
(frankabbing@12move.de) | |
Hallo und danke ihr beiden,
Pascal, das mit dem Kontext-Menü klappt hervoragend, aber bei der TAB Lösung kommt nichts bei herum. Ich erhalte immer nur meinen 8er Tab.
Und noch was, gibt's auch eine Message, die gesendet wird, wenn eine beliebige Taste im Edit gedrückt wurde?
Gruß und Dank,
Frank
|
| | Datum:21.02.02 12:45 
(Pascalxd@owl-online.de) | |
Hallo Frank!
Sorry, das mit den Tab's nehme ich zurück; diese Methode ist nur nötig bei bestimmten
Fenster/Unterfenster-Verschachtelungen. Im Normalfall reagiert TAB wie gewohnt.
Aber wahrscheinlich ist es eben das, was du nicht willst? Vermutlich willst du variable
Tab's mit beliebiger Weite?
Dafür kann man das RTF-Control nämlich nach Wunsch konfigurieren. Die Abstände werden
in "TWIPS" angegeben, glaube ich. Vielleicht weiß jemand, wie man die berechnet?
Und man kann ein RichEdit auch so einrichten, dass es auf bestimmte Ereignisse
von selbst reagiert und eine Message an dein Programm sendet (z.B. wenn Tasten
gedrückt oder Text oder Markierung geändert wurden).
window 10,10-700,500
usermessages 16'--WM_CLOSE=Beenden
declare dll&,rtf&,rtf#
dll&=usedll("riched32.dll")
rtf&=control("RichEdit","",$54001044,50,50,400,200,%hwnd,100,%hinstance,$200)
sendmessage(rtf&,1093,0,$10000)'--EM_SETEVENTMASK => ENM_KEYEVENTS
dim rtf#,156
clear rtf#
long rtf#,0=156
long rtf#,4=16'----PFM_TABSTOPS
word rtf#,26=3'----Anzahl der definierten(!) TAB's
long rtf#,32=200'--Absolute Position in Twips (?? ca. 1/15 Pixel ??)
long rtf#,36=400
long rtf#,40=600'--usw.
sendmessage(rtf&,1095,0,rtf#)'--EM_SETPARAFORMAT
settext rtf&,mkstr$("a"+chr$(9),9)'--Demo-Text
while 1
waitinput
if %wmnotify and (%notifycode=1792)'--EN_MSGFILTER
settext %hwnd,"Taste gedrückt"
sleep 200
settext %hwnd,""
endif
case %umessage=16:break'--Beenden
endwhile
dispose rtf#
freedll dll&
BTW: Ich arbeite nebenbei an einer Weiterentwicklung meines HilfeHelfers (als
eigenständige Anwendung für 32-Bit-Compiler, mit erweiterten RTF-Funktionen )
Zur Anschauung habe ich das halbfertige(!) RTF-Modul mal als Compilat ins Netz gestellt:
http://www.tomcatsoft.de/RTF-Modul-Demo.zip
HTH
Pascal
|
| | Datum:21.02.02 21:41 
| |
Hallo Pascal,
vielen Dank für den Code !
Aber irgendwie komm ich immer noch ins Schleudern...
Ok, die Tabs kann ich jetzt individuell einstellen, aber leider nur bis zu max. 31 Stück !!! Wenn noch mehr Tabs eingegeben werden (pro Zeile), dann ist deren Länge wieder standartmäßig! Gibts da keine Loop-Funktion oder sowas, um nur meine Tabs zu senden. Hab' in der WinHelp nichts greifbares finden können.
Jeder Tastendruck wird jetzt wirklich gesendet, allerdings wenigstens zwei mal (bei Keyrepeat natürlich öfter). Irgendwie auch nicht ganz optimal... Kann man das noch verbessern ?
Deine Beta sieht wirklich toll aus, hat leichte Ähnlichkeiten mit meinem Code (ein Editor). Du könntest auch Hover-Buttons verwenden, sieht noch besser aus.
Unter XP werden beim Verlassen deiner Demo-Exe (mit Profan 7.0f compiliert) immer zwei Fehler ausgegeben:
Zugriffsverletzung...Lesen von Adresse blablabla
Ich hoffe, du kannst mir nochmal helfen.
Gruß, Frank
|
| | Datum:21.02.02 22:19 
(webmaster@rokosoft.de) | |
Das mit den Zugriffsverletzungen kann ich "leider" auch bestätigen - habe auch XP
Rolf
|
| | Datum:21.02.02 22:34 
(frankabbing@12move.de) | |
Hallo,
die Zugriffsverletzungen kommen wahrscheinlich von einem:
usermessages 16'--WM_CLOSE=Beenden
case %umessage=16:break'--Beenden
Das war mir in deinen Beispielen schon aufgefallen, hab' die die beiden Zeilen weggelassen, dann kamen die Fehler nicht.
Gruß, Frank
|
| | Datum:21.02.02 22:31 
(frankabbing@12move.de) | |
Hallo nochmal,
ok, das zweite Problem hab' ich beheben können. Per API frage ich die gedrückte Taste ab, kommt -1 zurück, so wurde die Taste nur wieder losgelassen, also unwichtig.
Wenn es jetzt eine Möglichkeit gäbe, die Tab-Taste im Edit ganz auszuschalten, könnte ich sie selber abfragen und durch " " Spaces ersetzen, was noch besser wäre, weil die erstellten Texte dann in jedem Anzeigeprogramm gleich aussehen...
Gibt's diese Möglichkeit vielleicht ???
Gruß, Frank
|
| | Datum:22.02.02 11:14 
(Pascalxd@owl-online.de) | |
Hallo Frank!
Das mit den max. 32 Tab's hat MS wohl vergessen zu erwähnen ;-)
BTW: Mit der nächsthöheren RTF-Version (RichEdit20A aus Richedit20.dll) ist es genauso.
Bei mir hängt die TAB-Taste, wenn sich das Control auf einem Unterfenster befindet.
Darum bin ich ja auf den Trick verfallen, die Taste per UserMessage abzufragen. An der
Stelle brauchst du dann ja nur noch ein paar Spaces anstelle eines chr(9) einzusetzen:
window 10,10-500,400
usermessages 16,40'--WM_CLOSE=Beenden + WM_NEXTDLGCTL=TAB
declare dll&,rtf&,dlg&,Tab$
Tab$=" "
dll&=usedll("riched32.dll")
dlg&=control("Dialog","X",$50081003,20,20,300,300,%hwnd,100,%hinstance)'--ohne Rahmen
rtf&=Control("RichEdit","RTF-Test",$54001044,10,10,250,250,dlg&,100,%hinstance,$200)
while 1
waitinput
case %umessage=40:sendmessage(rtf&,194,0,addr(Tab$))'--EM_REPLACESEL->TAB simulieren
case %umessage=16:break
endwhile
usermessages 0
destroywindow(rtf&)
freedll dll&
P.S. Tritt hierbei auch noch der Fehler beim Beenden als gelinktes Programm unter XP
auf? WM_CLOSE abzufangen hat sich nämlich als praktischer erwiesen als das Jonglieren
mit Fensterstilen...
HTH
Pascal
|
| | Datum: 22.02.02 14:34 
(frankabbing@12move.de) | |
Hallo,
danke Pascal !
Jetzt ist der Groschen (äh Cent) endlich bei mir gefallen...
Der Fehler trat in der Runtime und im Compilat auf, aber jetzt nicht mehr. Keine Fehler mehr !!!
Gruß und Dank,
Frank
|
|
|