TRichEdit mit Hintergund



  • 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