[gelöst][wxWidgets] redirect std stream in wxTextCtrl ... WXUSINGDLL



  • Hallo,

    ich würde gerne die std streams in meinen logging view umleiten. Laut der wxWidgets doc functioniert das auf 2 Arten.

    a)

    wxStreamToTextRedirector redirect( (wxTextCtrl *) myTextCtrl );[cpp]
    

    b)

    std::cout.rdbuf( (wxTextCtrl *) myTextCtrl );
    

    Dazu nötig wäre aber

    #define wxHAS_TEXT_WINDOW_STREAM 1
    

    welches wiederrum wie folgt auf 0 gesetzt wird.

    #if defined(__WATCOMC__) || \
        defined(__MWERKS__) || \
        (defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL)))
        #define wxHAS_TEXT_WINDOW_STREAM 0
    

    Also keine Chance wenn ich das dynamisch linke.

    Nun meine Frage: Gibt es eventuell noch einen anderen Weg? Ich wäre durchaus in der Lage das erstmal nur eine Funktion zu pipen die mir dann einen std::string logged o.ä.

    Der Hintergrund ist folgender, ich möchte die Ausgaben, Fehler etc. die mir Python generiert in der Applikation ausgeben.

    Wäre super wenn jemand einen Rat für mich haette.



  • Kaum gepostet fällt mir eine neue Variante ein wie ich nach dem Problem suchen kann und finde prompt eine Ideale Hilfestellung.

    Gefunden hier, gepostet von dave: http://www.devmaster.net/forums/showthread.php?t=7037

    #include <streambuf>
    
    class BufferedStringBuf : public std::streambuf
    {
    public:
        BufferedStringBuf(int bufferSize) 
        {
            if (bufferSize)
            {
                char *ptr = new char[bufferSize];
                setp(ptr, ptr + bufferSize);
            }
            else
                setp(0, 0);
        }
        virtual ~BufferedStringBuf() 
        {
            sync();
            delete[] pbase();
        }
    
        virtual void writeString(const std::string &str) = 0;
    
    private:
        int	overflow(int c)
        {
            sync();
    
            if (c != EOF)
            {
                if (pbase() == epptr())
                {
                    std::string temp;
                    temp += char(c);
                    writeString(temp);
                }
                else
                    sputc(c);
            }
    
            return 0;
        }
    
        int	sync()
        {
            if (pbase() != pptr())
            {
                int len = int(pptr() - pbase());
                std::string temp(pbase(), len);
                writeString(temp);
                setp(pbase(), epptr());
            }
            return 0;
        }
    };
    
    const int LineSize = 256;
    class wxBuf : public BufferedStringBuf
    {
    public:
        wxBuf() : BufferedStringBuf(LineSize) {}
        virtual void writeString(const std::string &str)
        {
            if ( str.size() > 1 ) // message box doesnt care about single characters
                wxLogMessage( str.c_str() );
        }
    };
    
    wxBuf *debug_buffer = new wxBuf();
        std::streambuf *old_buffer = std::cout.rdbuf(debug_buffer);
    
        std::cout << "to wxWidgets" << std::endl;
    
        // restore the old buffer
        std::cout.rdbuf(old_buffer);
        delete debug_buffer;
    

Anmelden zum Antworten