Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249164 (10600)
  Suchen
 Zurück zur Übersicht
 AutorThema: Richtext-Edits
Frank Abbing
Datum:19.02.02 19:59 Antwortenals Email verschicken (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


Gerhard Putschalka
Datum:20.02.02 09:36 Antwortenals Email verschicken (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


Uwe ''Pascal'' Niemeier
Datum:20.02.02 11:50 Antwortenals Email verschicken (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




Frank Abbing
Datum:20.02.02 17:17 Antwortenals Email verschicken (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


Uwe ''Pascal'' Niemeier
Datum:21.02.02 12:45 Antwortenals Email verschicken (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




Frank Abbing
Datum:21.02.02 21:41 Antwortenals Email verschicken  


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


Rolf Koch
Datum:21.02.02 22:19 Antwortenals Email verschicken (webmaster@rokosoft.de) 


Das mit den Zugriffsverletzungen kann ich "leider" auch bestätigen - habe auch XP
Rolf


Frank Abbing
Datum:21.02.02 22:34 Antwortenals Email verschicken (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



Frank Abbing
Datum:21.02.02 22:31 Antwortenals Email verschicken (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


Uwe ''Pascal'' Niemeier
Datum:22.02.02 11:14 Antwortenals Email verschicken (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


Frank Abbing
Datum: 22.02.02 14:34 Antwortenals Email verschicken (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


 Zurück zur Übersicht