TRichEdit mit Hintergund



  • Moinsen,

    Hätte gerne eine Komponente, die wie Richedit (einfach) formatierten Text zulässt und zusätzlich die Möglichkeit bietet ein Hintergundbild für das "Edit" festzulegen und es auch erlaubt kleinere Grafiken einzufügen.

    Gibt es mit dem BCB6-Enterprise so eine Komponente schon? Kann das eventuell sogar RichEdit und ich habs nur nicht gefunden?

    Ich greife nur ungern auf andere (nicht mitgelieferte) Komponenten zurück - ich währe also dankbar, wenn jemand vielleicht weis ob es auch mit den "Bordmitteln" geht.

    Danke und Spass Haben! :p



  • Also, mal so ganz am Rande: RichEdit 2.0 kann das. Jedenfalls hab ich mit Spy++ mal ins Wordpad geschaut. Das ist so ein RichEdit. Und mit Wordpad geht das ja.



  • hmm vielleicht sind die Mircosofties den Borländern da etwas **voraus, aber ich kann absolut nichts finden. Es ist nichmal möglich per Copy-Paste text mit Bild in mein RichEdit zu ziehen - da wird dann nur der entsprechende Text mit leerem Raum anstelle des Bildes eingefügt

    :(**



  • TRichEdit ist nur ein RichEdit1.0-Wrapper, auch im BCB6. Also nix mit Bildern.
    Evtl. findest du auf den einschlägigen Komponenten-Seiten ja was aktuelleres.



  • bevor ich mich darüber aufrege, und mich frage warum in BCB6 nichteinmal Richedit2 mitgeliefert wird, obwohl nach meinen Erkenntnissen Richedit3 schon seit mind. 1999 existiert, versuche ich die Sache geschmeidig zu sehen und versuche mich mal an eine anderen Idee:

    Könnte man die RichEdit-Komponente in meinem Programm nicht durch eine Art HTML-Wrapper ersetzen? Mir schwebt eine Komponente vor, die Ähnlich wie RichEdit Textformatierungen usw. erlaubt, nur das die Ausgabe halt in HTML-Code erfolgt. Günstig währe vielleicht das man einen HTML-Strohm erzeugt, welcher von der Komponente in "Echtzeit" entsprechend ausgegeben wird.

    Bringt der Builder so eine Komponente bereits mit, oder müsste man sich das selbst programmieren, wenn ja, hat jemand eine Idee wie (Hat vielleict der CppWebBrowser oder der PageProducer etwas damit zu tun)?

    Danke nochmal *auf die Uhr schaut* und Gute Nacht 🙂



  • Hatte das selbe Problem wie du.
    Arbeite dich mal durch diese seite dort gibt es eine RichEdit2 Komponente.
    http://home.att.net/~robertdunn/Yacs.html

    Habe aber eine Komponente gefunden die Bilder, URL, multi Undo&Redo, Objekte einfügen, Hintergrund der Schrift färben nicht nur die Schrift alleine, und einiges mehr unterstüzt.



  • Danke für den Link, die Seite kenne ich bereits und die hat mir auch schon bei einem anderen Problem sehr geholfen (Stichwort pcre *ggg*) - so klein ist die Welt. Aber der Webmaster dieser Seite hat mich eben auch darauf gebracht, das RichText vielleicht irgendwann mal durch HTML ersetzt werden könnte - deswegen hab ich beschlossen es eher mit HTML zu versuchen als mit RichText.

    Ich bräuchte halt nur eine Komponente, die einen Strom von HTML-Messages (ihr wisst schon was ich meine *g*) empfängt und in Echtzeit ausgibt. Quasi wie ein Browser, der mit eine nie enden wollenden .htm geknechtet wird.

    Danke dir trotzdem

    *winke*

    [ Dieser Beitrag wurde am 04.01.2003 um 01:17 Uhr von SimonBee editiert. ]



  • Bei den CLX-Komponenten gibt es einen rudimentären HTML-Viewer, Bilder zeigt der aber auch nicht an.



  • ich hab mal ein Wenig gesucht und gebastelt und folgendes Snippet gefunden:

    void LoadHtmlFromStream(TCppWebBrowser* pCppWebBrowser,
      TMemoryStream* pMemStream)
    {
      if(pMemStream && pCppWebBrowser)
      {
        IPersistStreamInit* pPSI;
        pMemStream->Seek(0, 0);
        if(!pCppWebBrowser->Document)
        {
          pCppWebBrowser->Navigate(WideString("\1:blank"));
          while(!pCppWebBrowser->Document)
            Application->ProcessMessages();
        }
        TStreamAdapter* pStreamAdapter = new TStreamAdapter(
          pMemStream, soReference);
        if(SUCCEEDED(pCppWebBrowser->Document->QueryInterface(
          IID_IPersistStreamInit, (LPVOID*)&pPSI)))
        pPSI->Load(*pStreamAdapter);
      }
    }
    
    //---------------------------------------------------------------------------
    // Anwendungsbeispiel (Eventhandler für das OnKlick-Ereignis des Buttons
    // "Html-Code aus der Memo im TCppWebBrowser-Steuerelement anzeigen")
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      // MemoHtmlSource => TMemo mit dem Quellcode
    
      // TMemoryStream-Instanz erzeugen:
      TMemoryStream* pStream = new TMemoryStream();
      // Html-Code aus der Memo in den Stream schreiben:
      Memo1->Lines->SaveToStream(pStream);
      // Html-Code im TCppWebBrowser anzeigen:
      LoadHtmlFromStream(CppWebBrowser1, pStream);
      // Aufräumen:
      if(pStream) delete pStream;
    
    }
    //---------------------------------------------------------------------------
    

    das Funktioniert auch soweit - immer wenn ich auf den Button klicke, wird er Code, den ich im Memo habe an CppWebBrowser geschickt und entsprechend angezeigt.

    Die Frage ist nur: Wie kann ich es bewerkstelligen, das zu einer Simplen Seite einfache (sie sollen ja nur jeweils eine Zeile hinzufügen) HTML-Commands "gestreamt" werden können, ohne dass ich die Seite jeweils komplett neu laden muss?

    Ich will das Ding ja nur als besseres RichEdit missbrauchen und deswegen sollen auch nur einzelne (html-Formatierte) Zeilen von Text gestreamt werden können - "<p>blalba<\p>" usw...

    Der Browser müsste eigentlich nur so tun, als würde er immer weiter laden und dabei ständig Teile einer HTML-Datei empfangen, wobei er natürlich versuchen sollte soviel wie möglich anzuzeigen.

    Ist das prinzipiell machbar, oder wird das zu tricky?

    [ Dieser Beitrag wurde am 04.01.2003 um 02:05 Uhr von SimonBee editiert. ]



  • Hi,

    ich weiss nicht genau, ob dir die TXML...- Komonenten da weiterhelfen, oder ob diese ein zu großen Overhead für deine Ansprüche haben.

    Damit müsste sich sowas und noch vieles mehr erschlagen lassen.

    Wie immer -> Ungetestet



  • Nagut, dann erzeuge ich eben einen XML-Strom aus meinen Daten, aber das Problem bleibt immer noch: wie (womit) kann ich diesen Strom auffangen und meinen Wünschen entsprechend für den User "sichtbar" machen?

    Ich sehe mich schon heute Nacht - programmierend an einer Anwendung, die nur TMemo als Ausgabe besitzt - wer braucht schon bunte Bildchen mit formatiertem Text *ggg*



  • Nagut, dann erzeuge ich eben einen XML-Strom aus meinen Daten, aber das Problem bleibt immer noch: wie (womit) kann ich diesen Strom auffangen und meinen Wünschen entsprechend für den User "sichtbar" machen?

    In der Tat ist das Problem, das der User damit arbeiten möchte. Sobald er eine Taste drückt muss ja auch der Buchstabe eingefügt werden oder andere Aktionen durchgeführt werden. Ich glaub das flackert sich tot.



  • Das Flackern ist vielleicht nicht unbedingt das Problem, der Strom wird nicht vom User durch Tastendrücke erzeugt, sondern kommt von meinem IRC-Parser (in Form von *kompletten* Messages). Ziel ist es die Nachrichten Zeilenweise auszugeben und das mit einer Frequenz von vielleicht 0,1-3 Nachrichten pro Sekunde.

    Kannst du mir vielleicht die Komponenten nennen, die dafür in Frage kommen? Die Komponente XMLDocument bringt mich glaube ich nicht wirklich weiter - weil ich immer noch nicht weis, wie ich den Strom an mein "Browserfenster" schicken kann 😞

    Danke ersteinmal für eure Hilfe!



  • hm,

    ich hab sowas noch nie ausprobiert. Auch diese Komponenten habe ich noch nicht verwendet.

    Ich hab mal so ein wenig durch die Hilfe geblättert. Was richtiges hab ich allerdings auch nicht gefunden. IWebComponent vielleicht. Naja, hilft auch nicht weiter. 😕

    Wirst wohl selber solch eine Komponente schreiben müssen, die Useraktionen in XML oder HTML verarbeitet und visualisiert.
    Bestimmt nicht einfach. Zur Zeit wüsste ich auch keine Lösung um einen HTML- Editor im wörtlichen Sinne zu basteln.

    Die Idee hört sich allerdings nicht übel an. Ich werd mich mal bei Zeiten damit beschäftigen. Ist bestimmt ausbaufähig. 😉

    [ Dieser Beitrag wurde am 04.01.2003 um 11:21 Uhr von AndreasW editiert. ]



  • oki ich habe endlich eine vorläufige lösung gefunden. Sie basiert auf meinem Snippet weiter oben, mit dem Unterschied, dass pStream jetzt global ist und nie geleert wird. Wenn man jetzt die Funktion LoadHtmlFromStream aufruft, wird die Seite immer weiter entwickelt ;)))

    Eine (hoffentlich) letzte Frage habe ich dazu allerdings noch: Ich bin nicht so Bewandert mit dem Datentyp TMemoryStream - weis einer was passiert, wenn der Text nach ein paar Tagen die größe von ein paar Megabyte hat (unter 10MB)?

    Geht das sehr an die Ressourcen? Was sollte ich beachten?

    Hier nochmal das "verbesserte" Snippet - denkt daran, dass

    TMemoryStream* pStream im Header deklariert wurde und somit für die Klasse global ist:

    void LoadHtmlFromStream(TCppWebBrowser* pCppWebBrowser,
      TMemoryStream* pMemStream)
    {
      if(pMemStream && pCppWebBrowser) {
        IPersistStreamInit* pPSI;
        pMemStream->Seek(0, 0);
        if(!pCppWebBrowser->Document) {
          pCppWebBrowser->Navigate(WideString("\1:blank"));
          while(!pCppWebBrowser->Document)
            Application->ProcessMessages();
        }
        TStreamAdapter* pStreamAdapter = new TStreamAdapter(pMemStream, soReference);
        if(SUCCEEDED(pCppWebBrowser->Document->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&pPSI)))
          pPSI->Load(*pStreamAdapter);
      }
    }
    //---------------------------------------------------------------------------
    // Anwendungsbeispiel (Eventhandler für das OnKlick-Ereignis des Buttons
    // "Html-Code aus der Memo im TCppWebBrowser-Steuerelement anzeigen")
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      // Html-Code aus der Memo in den Stream schreiben:
      Memo1->Lines->SaveToStream(pStream);
      // Html-Code im TCppWebBrowser anzeigen:
      LoadHtmlFromStream(CppWebBrowser1, pStream);
    }
    

    Wenn ich jetzt noch wüsste, was passiert, wenn der pStream unter umständen sehr groß wird - währe ich erstmal erleichtert :))



  • Hi,

    TMemoryStream darf, so weit ich weiss, so groß werden, wie es der Heap zulässt. Ist also Rechnerabhängig aber wohl kaum ein Problem.



  • Original erstellt von SimonBee:
    Wenn ich jetzt noch wüsste, was passiert, wenn der pStream unter umständen sehr groß wird

    Die Seite braucht nach jedem Update "ewig", um dargestellt zu werden!?



  • hmm ich habs mal getestet und ich denke dass es für meine Zwecke reicht, es scheint auch so, als ob wirklich nur der jeweils neue Teil in den Browser geschrieben wird, ohne dass das ganze Teil neu geladen wird.

    Wisst ihr zufällig noch, wie ich es bewerkstelligen kann, dass er nach jedem update automatisch ganz nach unten Scrollt? mit

    CppWebBrowser1->Perform(EM_SCROLLCARET, 0, 0);

    klappt es (natürlich) nicht 😞



  • Versuchs mal mit EM_SCROLL anstatt mit EM_SCROLLCARET.



  • CppWebBrowser1->Perform(EM_SCROLL, SB_PAGEDOWN, 0);

    hab ich, bringt aber auch kein ergebniss.. 😞


Anmelden zum Antworten