Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249164 (10600)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Richtext-Edits
Frank Abbing
| 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
Gerhard Putschalka
| 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
Uwe ''Pascal'' Niemeier
| 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
Frank Abbing
| 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
Uwe ''Pascal'' Niemeier
| 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
Frank Abbing
| 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
Rolf Koch
| Datum:21.02.02 22:19 (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 (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 (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 (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 (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